From b4f898844b31d1ddbe3c5b1c89b5abb4aaf861ab Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Thu, 16 Oct 2025 18:28:05 +0900 Subject: [PATCH 1/3] WebGLRenderer: Improve ambient occlusion handling in PBR materials. --- .../ShaderChunk/aomap_fragment.glsl.js | 7 +++-- .../lights_physical_pars_fragment.glsl.js | 31 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js index d1a5848a0d2212..2854a38a1ce91f 100644 --- a/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js @@ -4,7 +4,9 @@ export default /* glsl */` // reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture float ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0; - reflectedLight.indirectDiffuse *= ambientOcclusion; + // Use multi-bounce AO for diffuse to add energy back + vec3 aoFactor = computeMultiBounceAO( ambientOcclusion, material.diffuseColor ); + reflectedLight.indirectDiffuse *= aoFactor; #if defined( USE_CLEARCOAT ) clearcoatSpecularIndirect *= ambientOcclusion; @@ -18,7 +20,8 @@ export default /* glsl */` float dotNV = saturate( dot( geometryNormal, geometryViewDir ) ); - reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness ); + // Use improved specular occlusion with horizon fading + reflectedLight.indirectSpecular *= computeSpecularOcclusionImproved( dotNV, ambientOcclusion, material.roughness ); #endif diff --git a/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js b/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js index 24c2baf2d50e11..2f59485123d05f 100644 --- a/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +++ b/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js @@ -551,5 +551,36 @@ float computeSpecularOcclusion( const in float dotNV, const in float ambientOccl return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion ); +} + +// Improved specular occlusion with horizon fading +// Based on "Practical Real-Time Strategies for Accurate Indirect Occlusion" +float computeSpecularOcclusionImproved( const in float dotNV, const in float ambientOcclusion, const in float roughness ) { + + // Start with the base specular occlusion formula + float baseOcclusion = computeSpecularOcclusion( dotNV, ambientOcclusion, roughness ); + + // Horizon fade term - slightly reduces AO influence at extreme grazing angles only + float horizonFade = saturate( 1.0 - pow( 1.0 - dotNV, 3.0 ) ); + + // Blend towards less occlusion at grazing angles, but keep most of the effect + return mix( baseOcclusion, 1.0, ( 1.0 - horizonFade ) * 0.3 ); + +} + +// Multi-bounce ambient occlusion approximation +// Adds energy back that would bounce in occluded areas +vec3 computeMultiBounceAO( const in float ambientOcclusion, const in vec3 albedo ) { + + vec3 a = 2.0 * albedo - 0.33; + vec3 b = -4.8 * albedo + 0.64; + vec3 c = 2.53 * albedo + 0.69; + + float x = ambientOcclusion; + vec3 multiBounce = ( ( x * a + b ) * x + c ) * x; + + // Blend between simple AO and multi-bounce (50/50) to keep it conservative + return mix( vec3( x ), max( vec3( x ), multiBounce ), 0.5 ); + } `; From 6943037191b1f6fae4af155648a771df8ebfd3b3 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Thu, 16 Oct 2025 18:30:22 +0900 Subject: [PATCH 2/3] Updated builds. --- build/three.cjs | 4 ++-- build/three.module.js | 4 ++-- build/three.module.min.js | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build/three.cjs b/build/three.cjs index 04dcfcee347858..2dfaa1519d189c 100644 --- a/build/three.cjs +++ b/build/three.cjs @@ -59226,7 +59226,7 @@ var alphatest_fragment = "#ifdef USE_ALPHATEST\n\t#ifdef ALPHA_TO_COVERAGE\n\tdi var alphatest_pars_fragment = "#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif"; -var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_CLEARCOAT ) \n\t\tclearcoatSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_SHEEN ) \n\t\tsheenSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\t#endif\n#endif"; +var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\n\tvec3 aoFactor = computeMultiBounceAO( ambientOcclusion, material.diffuseColor );\n\treflectedLight.indirectDiffuse *= aoFactor;\n\t#if defined( USE_CLEARCOAT ) \n\t\tclearcoatSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_SHEEN ) \n\t\tsheenSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusionImproved( dotNV, ambientOcclusion, material.roughness );\n\t#endif\n#endif"; var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; @@ -59318,7 +59318,7 @@ var lights_phong_pars_fragment = "varying vec3 vViewPosition;\nstruct BlinnPhong var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif"; -var lights_physical_pars_fragment = "uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 uv = vec2( roughness, dotNV );\n\treturn texture2D( dfgLUT, uv ).rg;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}"; +var lights_physical_pars_fragment = "uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 uv = vec2( roughness, dotNV );\n\treturn texture2D( dfgLUT, uv ).rg;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\nfloat computeSpecularOcclusionImproved( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\tfloat baseOcclusion = computeSpecularOcclusion( dotNV, ambientOcclusion, roughness );\n\tfloat horizonFade = saturate( 1.0 - pow( 1.0 - dotNV, 3.0 ) );\n\treturn mix( baseOcclusion, 1.0, ( 1.0 - horizonFade ) * 0.3 );\n}\nvec3 computeMultiBounceAO( const in float ambientOcclusion, const in vec3 albedo ) {\n\tvec3 a = 2.0 * albedo - 0.33;\n\tvec3 b = -4.8 * albedo + 0.64;\n\tvec3 c = 2.53 * albedo + 0.69;\n\tfloat x = ambientOcclusion;\n\tvec3 multiBounce = ( ( x * a + b ) * x + c ) * x;\n\treturn mix( vec3( x ), max( vec3( x ), multiBounce ), 0.5 );\n}"; var lights_fragment_begin = "\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif"; diff --git a/build/three.module.js b/build/three.module.js index d4f7daccb0bad9..1e938f2b9b8655 100644 --- a/build/three.module.js +++ b/build/three.module.js @@ -305,7 +305,7 @@ var alphatest_fragment = "#ifdef USE_ALPHATEST\n\t#ifdef ALPHA_TO_COVERAGE\n\tdi var alphatest_pars_fragment = "#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif"; -var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_CLEARCOAT ) \n\t\tclearcoatSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_SHEEN ) \n\t\tsheenSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\t#endif\n#endif"; +var aomap_fragment = "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\n\tvec3 aoFactor = computeMultiBounceAO( ambientOcclusion, material.diffuseColor );\n\treflectedLight.indirectDiffuse *= aoFactor;\n\t#if defined( USE_CLEARCOAT ) \n\t\tclearcoatSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_SHEEN ) \n\t\tsheenSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusionImproved( dotNV, ambientOcclusion, material.roughness );\n\t#endif\n#endif"; var aomap_pars_fragment = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; @@ -397,7 +397,7 @@ var lights_phong_pars_fragment = "varying vec3 vViewPosition;\nstruct BlinnPhong var lights_physical_fragment = "PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif"; -var lights_physical_pars_fragment = "uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 uv = vec2( roughness, dotNV );\n\treturn texture2D( dfgLUT, uv ).rg;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}"; +var lights_physical_pars_fragment = "uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 uv = vec2( roughness, dotNV );\n\treturn texture2D( dfgLUT, uv ).rg;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\nfloat computeSpecularOcclusionImproved( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\tfloat baseOcclusion = computeSpecularOcclusion( dotNV, ambientOcclusion, roughness );\n\tfloat horizonFade = saturate( 1.0 - pow( 1.0 - dotNV, 3.0 ) );\n\treturn mix( baseOcclusion, 1.0, ( 1.0 - horizonFade ) * 0.3 );\n}\nvec3 computeMultiBounceAO( const in float ambientOcclusion, const in vec3 albedo ) {\n\tvec3 a = 2.0 * albedo - 0.33;\n\tvec3 b = -4.8 * albedo + 0.64;\n\tvec3 c = 2.53 * albedo + 0.69;\n\tfloat x = ambientOcclusion;\n\tvec3 multiBounce = ( ( x * a + b ) * x + c ) * x;\n\treturn mix( vec3( x ), max( vec3( x ), multiBounce ), 0.5 );\n}"; var lights_fragment_begin = "\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif"; diff --git a/build/three.module.min.js b/build/three.module.min.js index 5bcaf2f9e93323..fa2cc44898e33d 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 L,CubeRefractionMapping as P,OrthographicCamera as U,PerspectiveCamera as D,NoToneMapping as w,MeshBasicMaterial as I,error as y,NoBlending as N,WebGLRenderTarget as O,BufferGeometry as F,BufferAttribute as B,LinearSRGBColorSpace as G,LinearFilter as H,warnOnce as V,Uint32BufferAttribute as z,Uint16BufferAttribute as k,arrayNeedsUint32 as W,Vector4 as X,DataArrayTexture as Y,CubeTexture as K,Data3DTexture as q,LessEqualCompare as j,DepthTexture as Z,Texture as $,GLSL3 as Q,PCFShadowMap as J,PCFSoftShadowMap as ee,VSMShadowMap as te,CustomToneMapping as ne,NeutralToneMapping as ie,AgXToneMapping as re,ACESFilmicToneMapping as ae,CineonToneMapping as oe,ReinhardToneMapping as se,LinearToneMapping as le,LinearTransfer as ce,AddOperation as de,MixOperation as ue,MultiplyOperation as fe,UniformsUtils as pe,DoubleSide as me,NormalBlending as he,TangentSpaceNormalMap as _e,ObjectSpaceNormalMap as ge,Layers as ve,Frustum as Ee,MeshDepthMaterial as Se,RGBADepthPacking as Te,MeshDistanceMaterial as Me,NearestFilter as xe,LessEqualDepth as Ae,ReverseSubtractEquation as Re,SubtractEquation as be,AddEquation as Ce,OneMinusConstantAlphaFactor as Le,ConstantAlphaFactor as Pe,OneMinusConstantColorFactor as Ue,ConstantColorFactor as De,OneMinusDstAlphaFactor as we,OneMinusDstColorFactor as Ie,OneMinusSrcAlphaFactor as ye,OneMinusSrcColorFactor as Ne,DstAlphaFactor as Oe,DstColorFactor as Fe,SrcAlphaSaturateFactor as Be,SrcAlphaFactor as Ge,SrcColorFactor as He,OneFactor as Ve,ZeroFactor as ze,NotEqualDepth as ke,GreaterDepth as We,GreaterEqualDepth as Xe,EqualDepth as Ye,LessDepth as Ke,AlwaysDepth as qe,NeverDepth as je,CullFaceNone as Ze,CullFaceBack as $e,CullFaceFront as Qe,CustomBlending as Je,MultiplyBlending as et,SubtractiveBlending as tt,AdditiveBlending as nt,MinEquation as it,MaxEquation as rt,MirroredRepeatWrapping as at,ClampToEdgeWrapping as ot,RepeatWrapping as st,LinearMipmapLinearFilter as lt,LinearMipmapNearestFilter as ct,NearestMipmapLinearFilter as dt,NearestMipmapNearestFilter as ut,NotEqualCompare as ft,GreaterCompare as pt,GreaterEqualCompare as mt,EqualCompare as ht,LessCompare as _t,AlwaysCompare as gt,NeverCompare as vt,NoColorSpace as Et,DepthStencilFormat as St,getByteLength as Tt,DepthFormat as Mt,UnsignedIntType as xt,UnsignedInt248Type as At,UnsignedShortType as Rt,createElementNS as bt,UnsignedShort4444Type as Ct,UnsignedShort5551Type as Lt,UnsignedInt5999Type as Pt,UnsignedInt101111Type as Ut,ByteType as Dt,ShortType as wt,AlphaFormat as It,RGBFormat as yt,RedFormat as Nt,RedIntegerFormat as Ot,RGFormat as Ft,RGIntegerFormat as Bt,RGBAIntegerFormat as Gt,RGB_S3TC_DXT1_Format as Ht,RGBA_S3TC_DXT1_Format as Vt,RGBA_S3TC_DXT3_Format as zt,RGBA_S3TC_DXT5_Format as kt,RGB_PVRTC_4BPPV1_Format as Wt,RGB_PVRTC_2BPPV1_Format as Xt,RGBA_PVRTC_4BPPV1_Format as Yt,RGBA_PVRTC_2BPPV1_Format as Kt,RGB_ETC1_Format as qt,RGB_ETC2_Format as jt,RGBA_ETC2_EAC_Format as Zt,RGBA_ASTC_4x4_Format as $t,RGBA_ASTC_5x4_Format as Qt,RGBA_ASTC_5x5_Format as Jt,RGBA_ASTC_6x5_Format as en,RGBA_ASTC_6x6_Format as tn,RGBA_ASTC_8x5_Format as nn,RGBA_ASTC_8x6_Format as rn,RGBA_ASTC_8x8_Format as an,RGBA_ASTC_10x5_Format as on,RGBA_ASTC_10x6_Format as sn,RGBA_ASTC_10x8_Format as ln,RGBA_ASTC_10x10_Format as cn,RGBA_ASTC_12x10_Format as dn,RGBA_ASTC_12x12_Format as un,RGBA_BPTC_Format as fn,RGB_BPTC_SIGNED_Format as pn,RGB_BPTC_UNSIGNED_Format as mn,RED_RGTC1_Format as hn,SIGNED_RED_RGTC1_Format as _n,RED_GREEN_RGTC2_Format as gn,SIGNED_RED_GREEN_RGTC2_Format as vn,ExternalTexture as En,EventDispatcher as Sn,ArrayCamera as Tn,WebXRController as Mn,RAD2DEG as xn,DataTexture as An,createCanvasElement as Rn,SRGBColorSpace as bn,REVISION as Cn,log as Ln,WebGLCoordinateSystem as Pn,probeAsync as Un}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AlwaysStencilFunc,AmbientLight,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BasicShadowMap,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,Controls,CubeCamera,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CylinderGeometry,Cylindrical,DataTextureLoader,DataUtils,DecrementStencilOp,DecrementWrapStencilOp,DefaultLoadingManager,DetachedBindMode,DirectionalLight,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicDrawUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,EqualStencilFunc,ExtrudeGeometry,FileLoader,Float16BufferAttribute,Float32BufferAttribute,Fog,FogExp2,FramebufferTexture,FrustumArray,GLBufferAttribute,GLSL1,GreaterEqualStencilFunc,GreaterStencilFunc,GridHelper,Group,HemisphereLight,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,IncrementStencilOp,IncrementWrapStencilOp,InstancedBufferAttribute,InstancedBufferGeometry,InstancedInterleavedBuffer,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,InterleavedBuffer,InterleavedBufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,InterpolationSamplingMode,InterpolationSamplingType,InvertStencilOp,KeepStencilOp,KeyframeTrack,LOD,LatheGeometry,LessEqualStencilFunc,LessStencilFunc,Light,LightProbe,Line,Line3,LineBasicMaterial,LineCurve,LineCurve3,LineDashedMaterial,LineLoop,LineSegments,LinearInterpolant,LinearMipMapLinearFilter,LinearMipMapNearestFilter,Loader,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,Material,MaterialLoader,MathUtils,Matrix2,MeshLambertMaterial,MeshMatcapMaterial,MeshNormalMaterial,MeshPhongMaterial,MeshPhysicalMaterial,MeshStandardMaterial,MeshToonMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NeverStencilFunc,NormalAnimationBlendMode,NotEqualStencilFunc,NumberKeyframeTrack,Object3D,ObjectLoader,OctahedronGeometry,Path,PlaneHelper,PointLight,PointLightHelper,Points,PointsMaterial,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,Quaternion,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBDepthPacking,RGBIntegerFormat,RGDepthPacking,RawShaderMaterial,Ray,Raycaster,RectAreaLight,RenderTarget,RenderTarget3D,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 Dn(){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 wn(e){const t=new WeakMap;return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),t.get(e)},remove:function(n){n.isInterleavedBufferAttribute&&(n=n.data);const i=t.get(n);i&&(e.deleteBuffer(i.buffer),t.delete(n))},update:function(n,i){if(n.isInterleavedBufferAttribute&&(n=n.data),n.isGLBufferAttribute){const e=t.get(n);return void((!e||e.versione.start-t.start);let t=0;for(let e=1;e 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",colorspace_pars_fragment:"vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif ( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif",lights_physical_pars_fragment:"uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 uv = vec2( roughness, dotNV );\n\treturn texture2D( dfgLUT, uv ).rg;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_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\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\tfloat depth = unpackRGBAToDepth( texture2D( depths, uv ) );\n\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\treturn step( depth, compare );\n\t\t#else\n\t\t\treturn step( compare, depth );\n\t\t#endif\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow( sampler2D shadow, vec2 uv, float compare ) {\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\tfloat hard_shadow = step( distribution.x, compare );\n\t\t#else\n\t\t\tfloat hard_shadow = step( compare, distribution.x );\n\t\t#endif\n\t\tif ( hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\t\n\t\tfloat lightToPositionLength = length( lightToPosition );\n\t\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t\t) * ( 1.0 / 9.0 );\n\t\t\t#else\n\t\t\t\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif",uv_pars_fragment:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_pars_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\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}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},yn={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}}},Nn={basic:{uniforms:i([yn.common,yn.specularmap,yn.envmap,yn.aomap,yn.lightmap,yn.fog]),vertexShader:In.meshbasic_vert,fragmentShader:In.meshbasic_frag},lambert:{uniforms:i([yn.common,yn.specularmap,yn.envmap,yn.aomap,yn.lightmap,yn.emissivemap,yn.bumpmap,yn.normalmap,yn.displacementmap,yn.fog,yn.lights,{emissive:{value:new n(0)}}]),vertexShader:In.meshlambert_vert,fragmentShader:In.meshlambert_frag},phong:{uniforms:i([yn.common,yn.specularmap,yn.envmap,yn.aomap,yn.lightmap,yn.emissivemap,yn.bumpmap,yn.normalmap,yn.displacementmap,yn.fog,yn.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30}}]),vertexShader:In.meshphong_vert,fragmentShader:In.meshphong_frag},standard:{uniforms:i([yn.common,yn.envmap,yn.aomap,yn.lightmap,yn.emissivemap,yn.bumpmap,yn.normalmap,yn.displacementmap,yn.roughnessmap,yn.metalnessmap,yn.fog,yn.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:In.meshphysical_vert,fragmentShader:In.meshphysical_frag},toon:{uniforms:i([yn.common,yn.aomap,yn.lightmap,yn.emissivemap,yn.bumpmap,yn.normalmap,yn.displacementmap,yn.gradientmap,yn.fog,yn.lights,{emissive:{value:new n(0)}}]),vertexShader:In.meshtoon_vert,fragmentShader:In.meshtoon_frag},matcap:{uniforms:i([yn.common,yn.bumpmap,yn.normalmap,yn.displacementmap,yn.fog,{matcap:{value:null}}]),vertexShader:In.meshmatcap_vert,fragmentShader:In.meshmatcap_frag},points:{uniforms:i([yn.points,yn.fog]),vertexShader:In.points_vert,fragmentShader:In.points_frag},dashed:{uniforms:i([yn.common,yn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:In.linedashed_vert,fragmentShader:In.linedashed_frag},depth:{uniforms:i([yn.common,yn.displacementmap]),vertexShader:In.depth_vert,fragmentShader:In.depth_frag},normal:{uniforms:i([yn.common,yn.bumpmap,yn.normalmap,yn.displacementmap,{opacity:{value:1}}]),vertexShader:In.meshnormal_vert,fragmentShader:In.meshnormal_frag},sprite:{uniforms:i([yn.sprite,yn.fog]),vertexShader:In.sprite_vert,fragmentShader:In.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:In.background_vert,fragmentShader:In.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:In.backgroundCube_vert,fragmentShader:In.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:In.cube_vert,fragmentShader:In.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:In.equirect_vert,fragmentShader:In.equirect_frag},distanceRGBA:{uniforms:i([yn.common,yn.displacementmap,{referencePosition:{value:new r},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:In.distanceRGBA_vert,fragmentShader:In.distanceRGBA_frag},shadow:{uniforms:i([yn.lights,yn.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:In.shadow_vert,fragmentShader:In.shadow_frag}};Nn.physical={uniforms:i([Nn.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:In.meshphysical_vert,fragmentShader:In.meshphysical_frag};const On={r:0,b:0,g:0},Fn=new u,Bn=new f;function Gn(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(On,g(e)),r.buffers.color.setClear(On.r,On.g,On.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(Nn.backgroundCube.uniforms),vertexShader:Nn.backgroundCube.vertexShader,fragmentShader:Nn.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)),Fn.copy(n.backgroundRotation),Fn.x*=-1,Fn.y*=-1,Fn.z*=-1,i.isCubeTexture&&!1===i.isRenderTargetTexture&&(Fn.y*=-1,Fn.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(Bn.makeRotationFromEuler(Fn)),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(Nn.background.uniforms),vertexShader:Nn.background.vertexShader,fragmentShader:Nn.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 Hn(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);const l=!0===n.logarithmicDepthBuffer,c=!0===n.reversedDepthBuffer&&t.has("EXT_clip_control"),d=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),u=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==r)return r;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");r=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else r=0;return r},getMaxPrecision:a,textureFormatReadable:function(t){return t===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:l,reversedDepthBuffer:c,maxTextures:d,maxVertexTextures:u,maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),maxCubemapSize:e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),maxAttributes:e.getParameter(e.MAX_VERTEX_ATTRIBS),maxVertexUniforms:e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),maxVaryings:e.getParameter(e.MAX_VARYING_VECTORS),maxFragmentUniforms:e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),vertexTextures:u>0,maxSamples:e.getParameter(e.MAX_SAMPLES)}}function kn(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 Wn(e){let t=new WeakMap;function n(e,t){return t===R?e.mapping=L:t===b&&(e.mapping=P),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 Xn=[.125,.215,.35,.446,.526,.582],Yn=20,Kn=new U,qn=new n;let jn=null,Zn=0,$n=0,Qn=!1;const Jn=(1+Math.sqrt(5))/2,ei=1/Jn,ti=[new r(-Jn,ei,0),new r(Jn,ei,0),new r(-ei,0,Jn),new r(ei,0,Jn),new r(0,Jn,-ei),new r(0,Jn,ei),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],ni=new r;class ii{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,t=0,n=.1,i=100,r={}){const{size:a=256,position:o=ni}=r;jn=this._renderer.getRenderTarget(),Zn=this._renderer.getActiveCubeFace(),$n=this._renderer.getActiveMipmapLevel(),Qn=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=si(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=oi(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?s=Xn[o-e+4-1]:0===o&&(s=0),i.push(s);const l=1/(a-2),c=-l,d=1+l,u=[c,c,d,c,d,d,c,c,d,d,c,d],f=6,p=6,m=3,h=2,_=1,g=new Float32Array(m*p*f),v=new Float32Array(h*p*f),E=new Float32Array(_*p*f);for(let e=0;e2?0:-1,i=[t,n,0,t+2/3,n,0,t+2/3,n+1,0,t,n,0,t+2/3,n+1,0,t,n+1,0];g.set(i,m*p*e),v.set(u,h*p*e);const r=[e,e,e,e,e,e];E.set(r,_*p*e)}const S=new F;S.setAttribute("position",new B(g,m)),S.setAttribute("uv",new B(v,h)),S.setAttribute("faceIndex",new B(E,_)),t.push(S),r>4&&r--}return{lodPlanes:t,sizeLods:n,sigmas:i}}(i)),this._blurMaterial=function(e,t,n){const i=new Float32Array(Yn),a=new r(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:Yn,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:li(),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:N,depthTest:!1,depthWrite:!1});return o}(i,e,t)}return i}_compileMaterial(e){const t=new o(this._lodPlanes[0],e);this._renderer.compile(t,Kn)}_sceneToCubeUV(e,t,n,i,r){const a=new D(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(qn),u.toneMapping=w,u.autoClear=!1;u.state.buffers.depth.getReversed()&&(u.setRenderTarget(i),u.clearDepth(),u.setRenderTarget(null));const m=new I({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1}),h=new o(new s,m);let _=!1;const g=e.background;g?g.isColor&&(m.color.copy(g),e.background=null,_=!0):(m.color.copy(qn),_=!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;ai(i,n*o,t>2?o:0,o,o),u.setRenderTarget(i),_&&u.render(h,a),u.render(e,a)}h.geometry.dispose(),h.material.dispose(),u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===L||e.mapping===P;i?(null===this._cubemapMaterial&&(this._cubemapMaterial=si()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=oi());const r=i?this._cubemapMaterial:this._equirectMaterial,a=new o(this._lodPlanes[0],r);r.uniforms.envMap.value=e;const s=this._cubeSize;ai(t,0,0,3*s,2*s),n.setRenderTarget(t),n.render(a,Kn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodPlanes.length;for(let t=1;tYn&&E(`sigmaRadians, ${r}, is too large and will clip, as it requested ${h} samples when the maximum is set to 20`);const _=[];let g=0;for(let e=0;ev-4?i-v+4:0),4*(this._cubeSize-S),3*S,2*S),l.setRenderTarget(t),l.render(d,Kn)}}function ri(e,t,n){const i=new O(e,t,n);return i.texture.mapping=a,i.texture.name="PMREM.cubeUv",i.scissorTest=!0,i}function ai(e,t,n,i,r){e.viewport.set(t,n,i,r),e.scissor.set(t,n,i,r)}function oi(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:li(),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:N,depthTest:!1,depthWrite:!1})}function si(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:li(),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:N,depthTest:!1,depthWrite:!1})}function li(){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 ci(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===L||a===P;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 ii(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;C0)return e;const r=t*n;let a=Ti[r];if(void 0===a&&(a=new Float32Array(r),Ti[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 Ci(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n":" "} ${r}: ${n[e]}`)}return i.join("\n")}(e.getShaderSource(t),i)}return r}function Rr(e,t){const n=function(e){p._getMatrix(xr,p.workingColorSpace,e);const t=`mat3( ${xr.elements.map(e=>e.toFixed(4))} )`;switch(p.getTransfer(e)){case ce: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")}function br(e,t){let n;switch(t){case le:n="Linear";break;case se:n="Reinhard";break;case oe:n="Cineon";break;case ae:n="ACESFilmic";break;case re:n="AgX";break;case ie:n="Neutral";break;case ne:n="Custom";break;default:E("WebGLProgram: Unsupported toneMapping:",t),n="Linear"}return"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const Cr=new r;function Lr(){p.getLuminanceCoefficients(Cr);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${Cr.x.toFixed(4)}, ${Cr.y.toFixed(4)}, ${Cr.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function Pr(e){return""!==e}function Ur(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 Dr(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const wr=/^[ \t]*#include +<([\w\d./]+)>/gm;function Ir(e){return e.replace(wr,Nr)}const yr=new Map;function Nr(e,t){let n=In[t];if(void 0===n){const e=yr.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=In[e],E('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Ir(n)}const Or=/#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 Fr(e){return e.replace(Or,Br)}function Br(e,t,n,i){let r="";for(let e=parseInt(t);e0&&(g+="\n"),v=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h].filter(Pr).join("\n"),v.length>0&&(v+="\n")):(g=[Gr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,n.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",n.batching?"#define USE_BATCHING":"",n.batchingColor?"#define USE_BATCHING_COLOR":"",n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.instancingMorph?"#define USE_INSTANCING_MORPH":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+u:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.displacementMap?"#define USE_DISPLACEMENTMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.mapUv?"#define MAP_UV "+n.mapUv:"",n.alphaMapUv?"#define ALPHAMAP_UV "+n.alphaMapUv:"",n.lightMapUv?"#define LIGHTMAP_UV "+n.lightMapUv:"",n.aoMapUv?"#define AOMAP_UV "+n.aoMapUv:"",n.emissiveMapUv?"#define EMISSIVEMAP_UV "+n.emissiveMapUv:"",n.bumpMapUv?"#define BUMPMAP_UV "+n.bumpMapUv:"",n.normalMapUv?"#define NORMALMAP_UV "+n.normalMapUv:"",n.displacementMapUv?"#define DISPLACEMENTMAP_UV "+n.displacementMapUv:"",n.metalnessMapUv?"#define METALNESSMAP_UV "+n.metalnessMapUv:"",n.roughnessMapUv?"#define ROUGHNESSMAP_UV "+n.roughnessMapUv:"",n.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+n.anisotropyMapUv:"",n.clearcoatMapUv?"#define CLEARCOATMAP_UV "+n.clearcoatMapUv:"",n.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+n.clearcoatNormalMapUv:"",n.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+n.clearcoatRoughnessMapUv:"",n.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+n.iridescenceMapUv:"",n.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+n.iridescenceThicknessMapUv:"",n.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+n.sheenColorMapUv:"",n.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+n.sheenRoughnessMapUv:"",n.specularMapUv?"#define SPECULARMAP_UV "+n.specularMapUv:"",n.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+n.specularColorMapUv:"",n.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+n.specularIntensityMapUv:"",n.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+n.transmissionMapUv:"",n.thicknessMapUv?"#define THICKNESSMAP_UV "+n.thicknessMapUv:"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.morphColors?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+c:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_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(Pr).join("\n"),v=[Gr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",n.envMap?"#define "+f:"",p?"#define CUBEUV_TEXEL_WIDTH "+p.texelWidth:"",p?"#define CUBEUV_TEXEL_HEIGHT "+p.texelHeight:"",p?"#define CUBEUV_MAX_MIP "+p.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.dispersion?"#define USE_DISPERSION":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor||n.batchingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+c:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==w?"#define TONE_MAPPING":"",n.toneMapping!==w?In.tonemapping_pars_fragment:"",n.toneMapping!==w?br("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",In.colorspace_pars_fragment,Rr("linearToOutputTexel",n.outputColorSpace),Lr(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Pr).join("\n")),s=Ir(s),s=Ur(s,n),s=Dr(s,n),l=Ir(l),l=Ur(l,n),l=Dr(l,n),s=Fr(s),l=Fr(l),!0!==n.isRawShaderMaterial&&(S="#version 300 es\n",g=[m,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+g,v=["#define varying in",n.glslVersion===Q?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===Q?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+v);const T=S+g+s,M=S+v+l,x=Tr(r,r.VERTEX_SHADER,T),A=Tr(r,r.FRAGMENT_SHADER,M);function R(t){if(e.debug.checkShaderErrors){const n=r.getProgramInfoLog(_)||"",i=r.getShaderInfoLog(x)||"",a=r.getShaderInfoLog(A)||"",o=n.trim(),s=i.trim(),l=a.trim();let c=!0,d=!0;if(!1===r.getProgramParameter(_,r.LINK_STATUS))if(c=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(r,_,x,A);else{const e=Ar(r,x,"vertex"),n=Ar(r,A,"fragment");y("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(_,r.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+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:g},fragmentShader:{log:l,prefix:v}})}r.deleteShader(x),r.deleteShader(A),b=new Sr(r,_),C=function(e,t){const n={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let r=0;r0,ee=o.clearcoat>0,te=o.dispersion>0,ne=o.iridescence>0,ie=o.sheen>0,re=o.transmission>0,ae=J&&!!o.anisotropyMap,oe=ee&&!!o.clearcoatMap,se=ee&&!!o.clearcoatNormalMap,le=ee&&!!o.clearcoatRoughnessMap,ce=ne&&!!o.iridescenceMap,de=ne&&!!o.iridescenceThicknessMap,ue=ie&&!!o.sheenColorMap,fe=ie&&!!o.sheenRoughnessMap,pe=!!o.specularMap,ve=!!o.specularColorMap,Ee=!!o.specularIntensityMap,Se=re&&!!o.transmissionMap,Te=re&&!!o.thicknessMap,Me=!!o.gradientMap,xe=!!o.alphaMap,Ae=o.alphaTest>0,Re=!!o.alphaHash,be=!!o.extensions;let Ce=w;o.toneMapped&&(null!==F&&!0!==F.isXRRenderTarget||(Ce=e.toneMapping));const Le={shaderID:L,shaderType:o.type,shaderName:o.name,vertexShader:D,fragmentShader:I,defines:o.defines,customVertexShaderID:y,customFragmentShaderID:N,isRawShaderMaterial:!0===o.isRawShaderMaterial,glslVersion:o.glslVersion,precision:g,batching:V,batchingColor:V&&null!==M._colorsTexture,instancing:H,instancingColor:H&&null!==M.instanceColor,instancingMorph:H&&null!==M.morphTexture,supportsVertexTextures:_,outputColorSpace:null===F?e.outputColorSpace:!0===F.isXRRenderTarget?F.texture.colorSpace:G,alphaToCoverage:!!o.alphaToCoverage,map:z,matcap:k,envMap:W,envMapMode:W&&b.mapping,envMapCubeUVHeight:C,aoMap:X,lightMap:Y,bumpMap:K,normalMap:q,displacementMap:_&&j,emissiveMap:Z,normalMapObjectSpace:q&&o.normalMapType===ge,normalMapTangentSpace:q&&o.normalMapType===_e,metalnessMap:$,roughnessMap:Q,anisotropy:J,anisotropyMap:ae,clearcoat:ee,clearcoatMap:oe,clearcoatNormalMap:se,clearcoatRoughnessMap:le,dispersion:te,iridescence:ne,iridescenceMap:ce,iridescenceThicknessMap:de,sheen:ie,sheenColorMap:ue,sheenRoughnessMap:fe,specularMap:pe,specularColorMap:ve,specularIntensityMap:Ee,transmission:re,transmissionMap:Se,thicknessMap:Te,gradientMap:Me,opaque:!1===o.transparent&&o.blending===he&&!1===o.alphaToCoverage,alphaMap:xe,alphaTest:Ae,alphaHash:Re,combine:o.combine,mapUv:z&&S(o.map.channel),aoMapUv:X&&S(o.aoMap.channel),lightMapUv:Y&&S(o.lightMap.channel),bumpMapUv:K&&S(o.bumpMap.channel),normalMapUv:q&&S(o.normalMap.channel),displacementMapUv:j&&S(o.displacementMap.channel),emissiveMapUv:Z&&S(o.emissiveMap.channel),metalnessMapUv:$&&S(o.metalnessMap.channel),roughnessMapUv:Q&&S(o.roughnessMap.channel),anisotropyMapUv:ae&&S(o.anisotropyMap.channel),clearcoatMapUv:oe&&S(o.clearcoatMap.channel),clearcoatNormalMapUv:se&&S(o.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:le&&S(o.clearcoatRoughnessMap.channel),iridescenceMapUv:ce&&S(o.iridescenceMap.channel),iridescenceThicknessMapUv:de&&S(o.iridescenceThicknessMap.channel),sheenColorMapUv:ue&&S(o.sheenColorMap.channel),sheenRoughnessMapUv:fe&&S(o.sheenRoughnessMap.channel),specularMapUv:pe&&S(o.specularMap.channel),specularColorMapUv:ve&&S(o.specularColorMap.channel),specularIntensityMapUv:Ee&&S(o.specularIntensityMap.channel),transmissionMapUv:Se&&S(o.transmissionMap.channel),thicknessMapUv:Te&&S(o.thicknessMap.channel),alphaMapUv:xe&&S(o.alphaMap.channel),vertexTangents:!!A.attributes.tangent&&(q||J),vertexColors:o.vertexColors,vertexAlphas:!0===o.vertexColors&&!!A.attributes.color&&4===A.attributes.color.itemSize,pointsUvs:!0===M.isPoints&&!!A.attributes.uv&&(z||xe),fog:!!x,useFog:!0===o.fog,fogExp2:!!x&&x.isFogExp2,flatShading:!0===o.flatShading&&!1===o.wireframe,sizeAttenuation:!0===o.sizeAttenuation,logarithmicDepthBuffer:h,reversedDepthBuffer:B,skinning:!0===M.isSkinnedMesh,morphTargets:void 0!==A.morphAttributes.position,morphNormals:void 0!==A.morphAttributes.normal,morphColors:void 0!==A.morphAttributes.color,morphTargetsCount:U,morphTextureStride:O,numDirLights:l.directional.length,numPointLights:l.point.length,numSpotLights:l.spot.length,numSpotLightMaps:l.spotLightMap.length,numRectAreaLights:l.rectArea.length,numHemiLights:l.hemi.length,numDirLightShadows:l.directionalShadowMap.length,numPointLightShadows:l.pointShadowMap.length,numSpotLightShadows:l.spotShadowMap.length,numSpotLightShadowsWithMaps:l.numSpotLightShadowsWithMaps,numLightProbes:l.numLightProbes,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:o.dithering,shadowMapEnabled:e.shadowMap.enabled&&f.length>0,shadowMapType:e.shadowMap.type,toneMapping:Ce,decodeVideoTexture:z&&!0===o.map.isVideoTexture&&p.getTransfer(o.map.colorSpace)===m,decodeVideoTextureEmissive:Z&&!0===o.emissiveMap.isVideoTexture&&p.getTransfer(o.emissiveMap.colorSpace)===m,premultipliedAlpha:o.premultipliedAlpha,doubleSided:o.side===me,flipSided:o.side===c,useDepthPacking:o.depthPacking>=0,depthPacking:o.depthPacking||0,index0AttributeName:o.index0AttributeName,extensionClipCullDistance:be&&!0===o.extensions.clipCullDistance&&i.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(be&&!0===o.extensions.multiDraw||V)&&i.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:i.has("KHR_parallel_shader_compile"),customProgramCacheKey:o.customProgramCacheKey()};return Le.vertexUv1s=u.has(1),Le.vertexUv2s=u.has(2),Le.vertexUv3s=u.has(3),u.clear(),Le},getProgramCacheKey:function(t){const n=[];if(t.shaderID?n.push(t.shaderID):(n.push(t.customVertexShaderID),n.push(t.customFragmentShaderID)),void 0!==t.defines)for(const e in t.defines)n.push(e),n.push(t.defines[e]);return!1===t.isRawShaderMaterial&&(!function(e,t){e.push(t.precision),e.push(t.outputColorSpace),e.push(t.envMapMode),e.push(t.envMapCubeUVHeight),e.push(t.mapUv),e.push(t.alphaMapUv),e.push(t.lightMapUv),e.push(t.aoMapUv),e.push(t.bumpMapUv),e.push(t.normalMapUv),e.push(t.displacementMapUv),e.push(t.emissiveMapUv),e.push(t.metalnessMapUv),e.push(t.roughnessMapUv),e.push(t.anisotropyMapUv),e.push(t.clearcoatMapUv),e.push(t.clearcoatNormalMapUv),e.push(t.clearcoatRoughnessMapUv),e.push(t.iridescenceMapUv),e.push(t.iridescenceThicknessMapUv),e.push(t.sheenColorMapUv),e.push(t.sheenRoughnessMapUv),e.push(t.specularMapUv),e.push(t.specularColorMapUv),e.push(t.specularIntensityMapUv),e.push(t.transmissionMapUv),e.push(t.thicknessMapUv),e.push(t.combine),e.push(t.fogExp2),e.push(t.sizeAttenuation),e.push(t.morphTargetsCount),e.push(t.morphAttributeCount),e.push(t.numDirLights),e.push(t.numPointLights),e.push(t.numSpotLights),e.push(t.numSpotLightMaps),e.push(t.numHemiLights),e.push(t.numRectAreaLights),e.push(t.numDirLightShadows),e.push(t.numPointLightShadows),e.push(t.numSpotLightShadows),e.push(t.numSpotLightShadowsWithMaps),e.push(t.numLightProbes),e.push(t.shadowMapType),e.push(t.toneMapping),e.push(t.numClippingPlanes),e.push(t.numClipIntersection),e.push(t.depthPacking)}(n,t),function(e,t){l.disableAll(),t.supportsVertexTextures&&l.enable(0);t.instancing&&l.enable(1);t.instancingColor&&l.enable(2);t.instancingMorph&&l.enable(3);t.matcap&&l.enable(4);t.envMap&&l.enable(5);t.normalMapObjectSpace&&l.enable(6);t.normalMapTangentSpace&&l.enable(7);t.clearcoat&&l.enable(8);t.iridescence&&l.enable(9);t.alphaTest&&l.enable(10);t.vertexColors&&l.enable(11);t.vertexAlphas&&l.enable(12);t.vertexUv1s&&l.enable(13);t.vertexUv2s&&l.enable(14);t.vertexUv3s&&l.enable(15);t.vertexTangents&&l.enable(16);t.anisotropy&&l.enable(17);t.alphaHash&&l.enable(18);t.batching&&l.enable(19);t.dispersion&&l.enable(20);t.batchingColor&&l.enable(21);t.gradientMap&&l.enable(22);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=Nn[t];n=pe.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let i;for(let e=0,t=f.length;e0?i.push(d):!0===o.transparent?r.push(d):n.push(d)},unshift:function(e,t,o,s,l,c){const d=a(e,t,o,s,l,c);o.transmission>0?i.unshift(d):!0===o.transparent?r.unshift(d):n.unshift(d)},finish:function(){for(let n=t,i=e.length;n1&&n.sort(e||Yr),i.length>1&&i.sort(t||Kr),r.length>1&&r.sort(t||Kr)}}}function jr(){let e=new WeakMap;return{get:function(t,n){const i=e.get(t);let r;return void 0===i?(r=new qr,e.set(t,[r])):n>=i.length?(r=new qr,i.push(r)):r=i[n],r},dispose:function(){e=new WeakMap}}}function Zr(){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 $r=0;function Qr(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function Jr(e){const n=new Zr,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(Qr);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=yn.LTC_FLOAT_1,a.rectAreaLTC2=yn.LTC_FLOAT_2):(a.rectAreaLTC1=yn.LTC_HALF_1,a.rectAreaLTC2=yn.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=$r++)},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 ea(e),r.push(a)):a=r[i],a},dispose:function(){t=new WeakMap}}}function na(e,n,i){let r=new Ee;const a=new t,s=new t,d=new X,u=new Se({depthPacking:Te}),f=new Me,p={},m=i.maxTextureSize,h={[_]:c,[c]:_,[me]:me},g=new l({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new t},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const S=new F;S.setAttribute("position",new B(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const T=new o(S,g),M=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=J;let x=this.type;function A(t,i){const r=n.update(T);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 O(a.x,a.y)),g.uniforms.shadow_pass.value=t.map.texture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(i,null,r,g,T,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,T,null)}function R(t,n,i,r){let a=null;const o=!0===i.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===i.isPointLight?f:u,e.localClippingEnabled&&!0===n.clipShadows&&Array.isArray(n.clippingPlanes)&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0||n.map&&n.alphaTest>0||!0===n.alphaToCoverage){const e=a.uuid,t=n.uuid;let i=p[e];void 0===i&&(i={},p[e]=i);let r=i[t];void 0===r&&(r=a.clone(),i[t]=r,n.addEventListener("dispose",C)),a=r}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=r===te?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 b(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===te)&&(!t.frustumCulled||r.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,t.matrixWorld);const r=n.update(t),l=t.material;if(Array.isArray(l)){const n=r.groups;for(let c=0,d=n.length;cm||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/h.x),a.x=s.x*h.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/h.y),a.y=s.y*h.y,c.mapSize.y=s.y)),null===c.map||!0===f||!0===p){const e=this.type!==te?{minFilter:xe,magFilter:xe}:{};null!==c.map&&c.map.dispose(),c.map=new O(a.x,a.y,e),c.map.texture.name=l.name+".shadowMap",c.camera.updateProjectionMatrix()}e.setRenderTarget(c.map),e.clear();const _=c.getViewportCount();for(let e=0;e<_;e++){const t=c.getViewport(e);d.set(s.x*t.x,s.y*t.y,s.x*t.z,s.y*t.w),u.viewport(d),c.updateMatrices(l,e),r=c.getFrustum(),b(n,i,c.camera,l,this.type)}!0!==c.isPointLightShadow&&this.type===te&&A(c,i),c.needsUpdate=!1}x=this.type,M.needsUpdate=!1,e.setRenderTarget(o,l,c)}}const ia={[je]:qe,[Ke]:We,[Ye]:ke,[Ae]:Xe,[qe]:je,[We]:Ke,[ke]:Ye,[Xe]:Ae};function ra(e,t){const i=new function(){let t=!1;const n=new X;let i=null;const r=new X(0,0,0,0);return{setMask:function(n){i===n||t||(e.colorMask(n,n,n,n),i=n)},setLocked:function(e){t=e},setClear:function(t,i,a,o,s){!0===s&&(t*=o,i*=o,a*=o),n.set(t,i,a,o),!1===r.equals(n)&&(e.clearColor(t,i,a,o),r.copy(n))},reset:function(){t=!1,i=null,r.set(-1,0,0,0)}}},r=new function(){let n=!1,i=!1,r=null,a=null,o=null;return{setReversed:function(e){if(i!==e){const n=t.get("EXT_clip_control");e?n.clipControlEXT(n.LOWER_LEFT_EXT,n.ZERO_TO_ONE_EXT):n.clipControlEXT(n.LOWER_LEFT_EXT,n.NEGATIVE_ONE_TO_ONE_EXT),i=e;const r=o;o=null,this.setClear(r)}},getReversed:function(){return i},setTest:function(t){t?W(e.DEPTH_TEST):Y(e.DEPTH_TEST)},setMask:function(t){r===t||n||(e.depthMask(t),r=t)},setFunc:function(t){if(i&&(t=ia[t]),a!==t){switch(t){case je:e.depthFunc(e.NEVER);break;case qe:e.depthFunc(e.ALWAYS);break;case Ke:e.depthFunc(e.LESS);break;case Ae:e.depthFunc(e.LEQUAL);break;case Ye:e.depthFunc(e.EQUAL);break;case Xe:e.depthFunc(e.GEQUAL);break;case We:e.depthFunc(e.GREATER);break;case ke:e.depthFunc(e.NOTEQUAL);break;default:e.depthFunc(e.LEQUAL)}a=t}},setLocked:function(e){n=e},setClear:function(t){o!==t&&(i&&(t=1-t),e.clearDepth(t),o=t)},reset:function(){n=!1,r=null,a=null,o=null,i=!1}}},a=new function(){let t=!1,n=null,i=null,r=null,a=null,o=null,s=null,l=null,c=null;return{setTest:function(n){t||(n?W(e.STENCIL_TEST):Y(e.STENCIL_TEST))},setMask:function(i){n===i||t||(e.stencilMask(i),n=i)},setFunc:function(t,n,o){i===t&&r===n&&a===o||(e.stencilFunc(t,n,o),i=t,r=n,a=o)},setOp:function(t,n,i){o===t&&s===n&&l===i||(e.stencilOp(t,n,i),o=t,s=n,l=i)},setLocked:function(e){t=e},setClear:function(t){c!==t&&(e.clearStencil(t),c=t)},reset:function(){t=!1,n=null,i=null,r=null,a=null,o=null,s=null,l=null,c=null}}},o=new WeakMap,s=new WeakMap;let l={},d={},u=new WeakMap,f=[],p=null,m=!1,h=null,_=null,g=null,v=null,E=null,S=null,T=null,M=new n(0,0,0),x=0,A=!1,R=null,b=null,C=null,L=null,P=null;const U=e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let D=!1,w=0;const I=e.getParameter(e.VERSION);-1!==I.indexOf("WebGL")?(w=parseFloat(/^WebGL (\d)/.exec(I)[1]),D=w>=1):-1!==I.indexOf("OpenGL ES")&&(w=parseFloat(/^OpenGL ES (\d)/.exec(I)[1]),D=w>=2);let O=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 z(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?ce: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===xt||n===At?i=e.DEPTH24_STENCIL8:n===M?i=e.DEPTH32F_STENCIL8:n===Rt&&(i=e.DEPTH24_STENCIL8,E("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===xt||n===At?i=e.DEPTH_COMPONENT24:n===M?i=e.DEPTH_COMPONENT32F:n===Rt&&(i=e.DEPTH_COMPONENT16),i}function L(e,t){return!0===S(e)||e.isFramebufferTexture&&e.minFilter!==xe&&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 P(e){const t=e.target;t.removeEventListener("dispose",P),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={[st]:e.REPEAT,[ot]:e.CLAMP_TO_EDGE,[at]:e.MIRRORED_REPEAT},O={[xe]:e.NEAREST,[ut]:e.NEAREST_MIPMAP_NEAREST,[dt]:e.NEAREST_MIPMAP_LINEAR,[H]:e.LINEAR,[ct]:e.LINEAR_MIPMAP_NEAREST,[lt]:e.LINEAR_MIPMAP_LINEAR},F={[vt]:e.NEVER,[gt]:e.ALWAYS,[_t]:e.LESS,[j]:e.LEQUAL,[ht]:e.EQUAL,[mt]:e.GEQUAL,[pt]:e.GREATER,[ft]:e.NOTEQUAL};function B(t,i){if(i.type!==M||!1!==n.has("OES_texture_float_linear")||i.magFilter!==H&&i.magFilter!==ct&&i.magFilter!==dt&&i.magFilter!==lt&&i.minFilter!==H&&i.minFilter!==ct&&i.minFilter!==dt&&i.minFilter!==lt||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===xe)return;if(i.minFilter!==dt&&i.minFilter!==lt)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",P));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 z(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===Et?null:p.getPrimaries(n.colorSpace),f=n.colorSpace===Et||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=J(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,P=void 0===u.__version||!0===c,U=d.dataReady,D=L(n,m);if(n.isDepthTexture)T=C(n.format===St,n.type),P&&(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&&P&&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=Tt(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&&P&&i.texStorage2D(e.TEXTURE_2D,D,T,M[0].width,M[0].height);for(let t=0,r=M.length;t0){const t=Tt(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?(P&&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(P)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&&P){const t=ee(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),Q(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,$(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,c=$(n);Q(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,c,o,n.width,n.height):i?e.renderbufferStorageMultisample(e.RENDERBUFFER,c,o,n.width,n.height):e.renderbufferStorage(e.RENDERBUFFER,o,n.width,n.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,s,e.RENDERBUFFER,t)}else{const t=n.textures;for(let r=0;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)throw new Error("target.depthTexture not supported in Cube render targets");const e=t.texture.mipmaps;e&&e.length>0?Y(n.__webglFramebuffer[0],t):Y(n.__webglFramebuffer,t)}else if(a){n.__webglDepthbuffer=[];for(let r=0;r<6;r++)if(i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[r]),void 0===n.__webglDepthbuffer[r])n.__webglDepthbuffer[r]=e.createRenderbuffer(),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 q=[],Z=[];function $(e){return Math.min(a.maxSamples,e.samples)}function Q(e){const t=r.get(e);return e.samples>0&&!0===n.has("WEBGL_multisampled_render_to_texture")&&!1!==t.__useRenderToTexture}function J(e,t){const n=e.colorSpace,i=e.format,r=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==G&&n!==Et&&(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 ee(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);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===Et?null:p.getPrimaries(n.colorSpace),u=n.colorSpace===Et||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]=J(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,P=c.dataReady;let U,D=L(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=ee(h[0]);i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?P&&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===Q(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===Q(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 la extends Sn{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 sa,v={},S=n.getContextAttributes();let M=null,A=null;const R=[],b=[],C=new t;let L=null;const P=new D;P.viewport=new X;const U=new D;U.viewport=new X;const w=[P,U],I=new Tn;let y=null,N=null;function F(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",F),a.removeEventListener("selectstart",F),a.removeEventListener("selectend",F),a.removeEventListener("squeeze",F),a.removeEventListener("squeezestart",F),a.removeEventListener("squeezeend",F),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 Mn,R[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=R[e];return void 0===t&&(t=new Mn,R[e]=t),t.getGripSpace()},this.getHand=function(e){let t=R[e];return void 0===t&&(t=new Mn,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",F),a.addEventListener("selectstart",F),a.addEventListener("selectend",F),a.addEventListener("squeeze",F),a.addEventListener("squeezestart",F),a.addEventListener("squeezeend",F),a.addEventListener("end",B),a.addEventListener("inputsourceschange",G),!0!==S.xrCompatible&&await n.makeXRCompatible(),L=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?St:Mt,i=S.stencil?At:xt);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 O(p.textureWidth,p.textureHeight,{format:x,type:T,depthTexture:new Z(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 O(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),W.setContext(a),W.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 z(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=P.near=t,I.far=U.far=P.far=n,y===I.near&&N===I.far||(a.updateRenderState({depthNear:I.near,depthFar:I.far}),y=I.near,N=I.far),I.layers.mask=6|e.layers.mask,P.layers.mask=3&I.layers.mask,U.layers.mask=5&I.layers.mask;const i=e.parent,r=I.cameras;z(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,ca.copy(o),ca.x*=-1,ca.y*=-1,ca.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(ca.y*=-1,ca.z*=-1),e.envMapRotation.value.setFromMatrix4(da.makeRotationFromEuler(ca)),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 fa(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=w;i.toneMapped&&(null!==I&&!0!==I.isXRRenderTarget||(m=L.toneMapping));const h=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,_=void 0!==h?h.length:0,g=he.get(i),v=R.state.lights;if(!0===ne&&(!0===ie||e!==F)){const t=e===F&&i.id===N;Ce.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===Ce.numPlanes&&g.numIntersection===Ce.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=et(i,t,r));let M=!1,x=!1,A=!1;const b=T.getUniforms(),C=g.uniforms;fe.useProgram(T.program)&&(M=!0,x=!0,A=!0);i.id!==N&&(N=i.id,x=!0);if(M||F!==e){fe.buffers.depth.getReversed()&&!0!==e.reversedDepth&&(e._reversedDepth=!0,e.updateProjectionMatrix()),b.setValue(Oe,"projectionMatrix",e.projectionMatrix),b.setValue(Oe,"viewMatrix",e.matrixWorldInverse);const t=b.map.cameraPosition;void 0!==t&&t.setValue(Oe,ae.setFromMatrixPosition(e.matrixWorld)),ue.logarithmicDepthBuffer&&b.setValue(Oe,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&b.setValue(Oe,"isOrthographic",!0===e.isOrthographicCamera),F!==e&&(F=e,x=!0,A=!0)}if(r.isSkinnedMesh){b.setOptional(Oe,r,"bindMatrix"),b.setOptional(Oe,r,"bindMatrixInverse");const e=r.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),b.setValue(Oe,"boneTexture",e.boneTexture,_e))}r.isBatchedMesh&&(b.setOptional(Oe,r,"batchingTexture"),b.setValue(Oe,"batchingTexture",r._matricesTexture,_e),b.setOptional(Oe,r,"batchingIdTexture"),b.setValue(Oe,"batchingIdTexture",r._indirectTexture,_e),b.setOptional(Oe,r,"batchingColorTexture"),null!==r._colorsTexture&&b.setValue(Oe,"batchingColorTexture",r._colorsTexture,_e));const P=n.morphAttributes;void 0===P.position&&void 0===P.normal&&void 0===P.color||Ue.update(r,n,T);(x||g.receiveShadow!==r.receiveShadow)&&(g.receiveShadow=r.receiveShadow,b.setValue(Oe,"receiveShadow",r.receiveShadow));i.isMeshGouraudMaterial&&null!==i.envMap&&(C.envMap.value=l,C.flipEnvMap.value=l.isCubeTexture&&!1===l.isRenderTargetTexture?-1:1);i.isMeshStandardMaterial&&null===i.envMap&&null!==t.environment&&(C.envMapIntensity.value=t.environmentIntensity);void 0!==C.dfgLUT&&(C.dfgLUT.value=(null===ma&&(ma=new An(pa,32,32,Ft,S),ma.minFilter=H,ma.magFilter=H,ma.wrapS=ot,ma.wrapT=ot,ma.generateMipmaps=!1,ma.needsUpdate=!0),ma));x&&(b.setValue(Oe,"toneMappingExposure",L.toneMappingExposure),g.needsLights&&(D=A,(U=C).ambientLightColor.needsUpdate=D,U.lightProbe.needsUpdate=D,U.directionalLights.needsUpdate=D,U.directionalLightShadows.needsUpdate=D,U.pointLights.needsUpdate=D,U.pointLightShadows.needsUpdate=D,U.spotLights.needsUpdate=D,U.spotLightShadows.needsUpdate=D,U.rectAreaLights.needsUpdate=D,U.hemisphereLights.needsUpdate=D),a&&!0===i.fog&&Ae.refreshFogUniforms(C,a),Ae.refreshMaterialUniforms(C,i,j,q,R.state.transmissionRenderTarget[e.id]),Sr.upload(Oe,tt(g),C,_e));var U,D;i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(Sr.upload(Oe,tt(g),C,_e),i.uniformsNeedUpdate=!1);i.isSpriteMaterial&&b.setValue(Oe,"center",r.center);if(b.setValue(Oe,"modelViewMatrix",r.modelViewMatrix),b.setValue(Oe,"normalMatrix",r.normalMatrix),b.setValue(Oe,"modelMatrix",r.matrixWorld),i.isShaderMaterial||i.isRawShaderMaterial){const e=i.uniformsGroups;for(let t=0,n=e.length;t{function n(){i.forEach(function(e){he.get(e).currentProgram.isReady()&&i.delete(e)}),0!==i.size?setTimeout(n,10):t(e)}null!==de.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)})};let Xe=null;function Ye(){qe.stop()}function Ke(){qe.start()}const qe=new Dn;function je(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)R.pushLight(e),e.castShadow&&R.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||te.intersectsSprite(e)){i&&oe.setFromMatrixPosition(e.matrixWorld).applyMatrix4(re);const t=Me.update(e),r=e.material;r.visible&&A.push(e,t,r,n,oe.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||te.intersectsObject(e))){const t=Me.update(e),r=e.material;if(i&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),oe.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),oe.copy(t.boundingSphere.center)),oe.applyMatrix4(e.matrixWorld).applyMatrix4(re)),Array.isArray(r)){const i=t.groups;for(let a=0,o=i.length;a0&&Qe(r,t,n),a.length>0&&Qe(a,t,n),o.length>0&&Qe(o,t,n),fe.buffers.depth.setTest(!0),fe.buffers.depth.setMask(!0),fe.buffers.color.setMask(!0),fe.setPolygonOffset(!1)}function $e(e,t,n,i){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;void 0===R.state.transmissionRenderTarget[i.id]&&(R.state.transmissionRenderTarget[i.id]=new O(1,1,{generateMipmaps:!0,type:de.has("EXT_color_buffer_half_float")||de.has("EXT_color_buffer_float")?S:T,minFilter:lt,samples:4,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:p.workingColorSpace}));const r=R.state.transmissionRenderTarget[i.id],a=i.viewport||B;r.setSize(a.z*L.transmissionResolutionScale,a.w*L.transmissionResolutionScale);const s=L.getRenderTarget(),l=L.getActiveCubeFace(),d=L.getActiveMipmapLevel();L.setRenderTarget(r),L.getClearColor(W),Y=L.getClearAlpha(),Y<1&&L.setClearColor(16777215,.5),L.clear(),le&&Pe.render(n);const u=L.toneMapping;L.toneMapping=w;const f=i.viewport;if(void 0!==i.viewport&&(i.viewport=void 0),R.setupLightsView(i),!0===ne&&Ce.setGlobalState(L.clippingPlanes,i),Qe(e,n,i),_e.updateMultisampleRenderTarget(r),_e.updateRenderTargetMipmap(r),!1===de.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let r=0,a=t.length;r0)for(let t=0,a=n.length;t0&&$e(i,r,e,t),le&&Pe.render(e),Ze(A,e,t);null!==I&&0===D&&(_e.updateMultisampleRenderTarget(I),_e.updateRenderTargetMipmap(I)),!0===e.isScene&&e.onAfterRender(L,e,t),ye.resetDefaultState(),N=-1,F=null,C.pop(),C.length>0?(R=C[C.length-1],!0===ne&&Ce.setGlobalState(L.clippingPlanes,R.state.camera)):R=null,b.pop(),A=b.length>0?b[b.length-1]:null},this.getActiveCubeFace=function(){return U},this.getActiveMipmapLevel=function(){return D},this.getRenderTarget=function(){return I},this.setRenderTargetTextures=function(e,t,n){const i=he.get(e);i.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,!1===i.__autoAllocateDepthBuffer&&(i.__useRenderToTexture=!1),he.get(e.texture).__webglTexture=t,he.get(e.depthTexture).__webglTexture=i.__autoAllocateDepthBuffer?void 0:n,i.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(e,t){const n=he.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const it=Oe.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){I=e,U=t,D=n;let i=!0,r=null,a=!1,o=!1;if(e){const s=he.get(e);if(void 0!==s.__useDefaultFramebuffer)fe.bindFramebuffer(Oe.FRAMEBUFFER,null),i=!1;else if(void 0===s.__webglFramebuffer)_e.setupRenderTarget(e);else if(s.__hasExternalTextures)_e.rebindTextures(e,he.get(e.texture).__webglTexture,he.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(s.__boundDepthTexture!==t){if(null!==t&&he.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");_e.setupDepthRenderbuffer(e)}}const l=e.texture;(l.isData3DTexture||l.isDataArrayTexture||l.isCompressedArrayTexture)&&(o=!0);const c=he.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(r=Array.isArray(c[t])?c[t][n]:c[t],a=!0):r=e.samples>0&&!1===_e.useMultisampledRTT(e)?he.get(e).__webglMultisampledFramebuffer:Array.isArray(c)?c[n]:c,B.copy(e.viewport),z.copy(e.scissor),k=e.scissorTest}else B.copy(Q).multiplyScalar(j).floor(),z.copy(J).multiplyScalar(j).floor(),k=ee;0!==n&&(r=it);if(fe.bindFramebuffer(Oe.FRAMEBUFFER,r)&&i&&fe.drawBuffers(e,r),fe.viewport(B),fe.scissor(z),fe.setScissorTest(k),a){const i=he.get(e.texture);Oe.framebufferTexture2D(Oe.FRAMEBUFFER,Oe.COLOR_ATTACHMENT0,Oe.TEXTURE_CUBE_MAP_POSITIVE_X+t,i.__webglTexture,n)}else if(o){const i=t;for(let t=0;t=0&&t<=e.width-i&&n>=0&&n<=e.height-r&&(e.textures.length>1&&Oe.readBuffer(Oe.COLOR_ATTACHMENT0+s),Oe.readPixels(t,n,i,r,Ie.convert(l),Ie.convert(c),a))}finally{const e=null!==I?he.get(I).__webglFramebuffer:null;fe.bindFramebuffer(Oe.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=he.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){fe.bindFramebuffer(Oe.FRAMEBUFFER,l);const o=e.textures[s],c=o.format,d=o.type;if(!ue.textureFormatReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ue.textureTypeReadable(d))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const u=Oe.createBuffer();Oe.bindBuffer(Oe.PIXEL_PACK_BUFFER,u),Oe.bufferData(Oe.PIXEL_PACK_BUFFER,a.byteLength,Oe.STREAM_READ),e.textures.length>1&&Oe.readBuffer(Oe.COLOR_ATTACHMENT0+s),Oe.readPixels(t,n,i,r,Ie.convert(c),Ie.convert(d),0);const f=null!==I?he.get(I).__webglFramebuffer:null;fe.bindFramebuffer(Oe.FRAMEBUFFER,f);const p=Oe.fenceSync(Oe.SYNC_GPU_COMMANDS_COMPLETE,0);return Oe.flush(),await Un(Oe,p,4),Oe.bindBuffer(Oe.PIXEL_PACK_BUFFER,u),Oe.getBufferSubData(Oe.PIXEL_PACK_BUFFER,0,a),Oe.deleteBuffer(u),Oe.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;_e.setTexture2D(e,0),Oe.copyTexSubImage2D(Oe.TEXTURE_2D,n,0,0,o,s,r,a),fe.unbindTexture()};const rt=Oe.createFramebuffer(),at=Oe.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,i=null,r=0,a=null){let o,s,l,c,d,u,f,p,m;null===a&&(0!==r?(V("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),a=r,r=0):a=0);const h=e.isCompressedTexture?e.mipmaps[a]:e.image;if(null!==n)o=n.max.x-n.min.x,s=n.max.y-n.min.y,l=n.isBox3?n.max.z-n.min.z:1,c=n.min.x,d=n.min.y,u=n.isBox3?n.min.z:0;else{const t=Math.pow(2,-r);o=Math.floor(h.width*t),s=Math.floor(h.height*t),l=e.isDataArrayTexture?h.depth:e.isData3DTexture?Math.floor(h.depth*t):1,c=0,d=0,u=0}null!==i?(f=i.x,p=i.y,m=i.z):(f=0,p=0,m=0);const _=Ie.convert(t.format),g=Ie.convert(t.type);let v;t.isData3DTexture?(_e.setTexture3D(t,0),v=Oe.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(_e.setTexture2DArray(t,0),v=Oe.TEXTURE_2D_ARRAY):(_e.setTexture2D(t,0),v=Oe.TEXTURE_2D),Oe.pixelStorei(Oe.UNPACK_FLIP_Y_WEBGL,t.flipY),Oe.pixelStorei(Oe.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),Oe.pixelStorei(Oe.UNPACK_ALIGNMENT,t.unpackAlignment);const E=Oe.getParameter(Oe.UNPACK_ROW_LENGTH),S=Oe.getParameter(Oe.UNPACK_IMAGE_HEIGHT),T=Oe.getParameter(Oe.UNPACK_SKIP_PIXELS),M=Oe.getParameter(Oe.UNPACK_SKIP_ROWS),x=Oe.getParameter(Oe.UNPACK_SKIP_IMAGES);Oe.pixelStorei(Oe.UNPACK_ROW_LENGTH,h.width),Oe.pixelStorei(Oe.UNPACK_IMAGE_HEIGHT,h.height),Oe.pixelStorei(Oe.UNPACK_SKIP_PIXELS,c),Oe.pixelStorei(Oe.UNPACK_SKIP_ROWS,d),Oe.pixelStorei(Oe.UNPACK_SKIP_IMAGES,u);const A=e.isDataArrayTexture||e.isData3DTexture,R=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=he.get(e),i=he.get(t),h=he.get(n.__renderTarget),_=he.get(i.__renderTarget);fe.bindFramebuffer(Oe.READ_FRAMEBUFFER,h.__webglFramebuffer),fe.bindFramebuffer(Oe.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;ne.start-t.start);let t=0;for(let e=1;e 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",colorspace_pars_fragment:"vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif ( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif",lights_physical_pars_fragment:"uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\n\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\n\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\n\treturn saturate( DG * RECIPROCAL_PI );\n}\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 uv = vec2( roughness, dotNV );\n\treturn texture2D( dfgLUT, uv ).rg;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\t#endif\n\tvec3 totalScattering = singleScattering + multiScattering;\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\nfloat computeSpecularOcclusionImproved( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\tfloat baseOcclusion = computeSpecularOcclusion( dotNV, ambientOcclusion, roughness );\n\tfloat horizonFade = saturate( 1.0 - pow( 1.0 - dotNV, 3.0 ) );\n\treturn mix( baseOcclusion, 1.0, ( 1.0 - horizonFade ) * 0.3 );\n}\nvec3 computeMultiBounceAO( const in float ambientOcclusion, const in vec3 albedo ) {\n\tvec3 a = 2.0 * albedo - 0.33;\n\tvec3 b = -4.8 * albedo + 0.64;\n\tvec3 c = 2.53 * albedo + 0.69;\n\tfloat x = ambientOcclusion;\n\tvec3 multiBounce = ( ( x * a + b ) * x + c ) * x;\n\treturn mix( vec3( x ), max( vec3( x ), multiBounce ), 0.5 );\n}",lights_fragment_begin:"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_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\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\tfloat depth = unpackRGBAToDepth( texture2D( depths, uv ) );\n\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\treturn step( depth, compare );\n\t\t#else\n\t\t\treturn step( compare, depth );\n\t\t#endif\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow( sampler2D shadow, vec2 uv, float compare ) {\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\tfloat hard_shadow = step( distribution.x, compare );\n\t\t#else\n\t\t\tfloat hard_shadow = step( compare, distribution.x );\n\t\t#endif\n\t\tif ( hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\t\n\t\tfloat lightToPositionLength = length( lightToPosition );\n\t\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t\t) * ( 1.0 / 9.0 );\n\t\t\t#else\n\t\t\t\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif",uv_pars_fragment:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_pars_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\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}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\n\t\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},yn={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}}},Nn={basic:{uniforms:i([yn.common,yn.specularmap,yn.envmap,yn.aomap,yn.lightmap,yn.fog]),vertexShader:In.meshbasic_vert,fragmentShader:In.meshbasic_frag},lambert:{uniforms:i([yn.common,yn.specularmap,yn.envmap,yn.aomap,yn.lightmap,yn.emissivemap,yn.bumpmap,yn.normalmap,yn.displacementmap,yn.fog,yn.lights,{emissive:{value:new n(0)}}]),vertexShader:In.meshlambert_vert,fragmentShader:In.meshlambert_frag},phong:{uniforms:i([yn.common,yn.specularmap,yn.envmap,yn.aomap,yn.lightmap,yn.emissivemap,yn.bumpmap,yn.normalmap,yn.displacementmap,yn.fog,yn.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30}}]),vertexShader:In.meshphong_vert,fragmentShader:In.meshphong_frag},standard:{uniforms:i([yn.common,yn.envmap,yn.aomap,yn.lightmap,yn.emissivemap,yn.bumpmap,yn.normalmap,yn.displacementmap,yn.roughnessmap,yn.metalnessmap,yn.fog,yn.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:In.meshphysical_vert,fragmentShader:In.meshphysical_frag},toon:{uniforms:i([yn.common,yn.aomap,yn.lightmap,yn.emissivemap,yn.bumpmap,yn.normalmap,yn.displacementmap,yn.gradientmap,yn.fog,yn.lights,{emissive:{value:new n(0)}}]),vertexShader:In.meshtoon_vert,fragmentShader:In.meshtoon_frag},matcap:{uniforms:i([yn.common,yn.bumpmap,yn.normalmap,yn.displacementmap,yn.fog,{matcap:{value:null}}]),vertexShader:In.meshmatcap_vert,fragmentShader:In.meshmatcap_frag},points:{uniforms:i([yn.points,yn.fog]),vertexShader:In.points_vert,fragmentShader:In.points_frag},dashed:{uniforms:i([yn.common,yn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:In.linedashed_vert,fragmentShader:In.linedashed_frag},depth:{uniforms:i([yn.common,yn.displacementmap]),vertexShader:In.depth_vert,fragmentShader:In.depth_frag},normal:{uniforms:i([yn.common,yn.bumpmap,yn.normalmap,yn.displacementmap,{opacity:{value:1}}]),vertexShader:In.meshnormal_vert,fragmentShader:In.meshnormal_frag},sprite:{uniforms:i([yn.sprite,yn.fog]),vertexShader:In.sprite_vert,fragmentShader:In.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:In.background_vert,fragmentShader:In.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:In.backgroundCube_vert,fragmentShader:In.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:In.cube_vert,fragmentShader:In.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:In.equirect_vert,fragmentShader:In.equirect_frag},distanceRGBA:{uniforms:i([yn.common,yn.displacementmap,{referencePosition:{value:new r},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:In.distanceRGBA_vert,fragmentShader:In.distanceRGBA_frag},shadow:{uniforms:i([yn.lights,yn.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:In.shadow_vert,fragmentShader:In.shadow_frag}};Nn.physical={uniforms:i([Nn.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:In.meshphysical_vert,fragmentShader:In.meshphysical_frag};const On={r:0,b:0,g:0},Fn=new u,Bn=new f;function Gn(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(On,g(e)),r.buffers.color.setClear(On.r,On.g,On.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(Nn.backgroundCube.uniforms),vertexShader:Nn.backgroundCube.vertexShader,fragmentShader:Nn.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)),Fn.copy(n.backgroundRotation),Fn.x*=-1,Fn.y*=-1,Fn.z*=-1,i.isCubeTexture&&!1===i.isRenderTargetTexture&&(Fn.y*=-1,Fn.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(Bn.makeRotationFromEuler(Fn)),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(Nn.background.uniforms),vertexShader:Nn.background.vertexShader,fragmentShader:Nn.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 Hn(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);const l=!0===n.logarithmicDepthBuffer,c=!0===n.reversedDepthBuffer&&t.has("EXT_clip_control"),d=e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),u=e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==r)return r;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");r=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else r=0;return r},getMaxPrecision:a,textureFormatReadable:function(t){return t===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:l,reversedDepthBuffer:c,maxTextures:d,maxVertexTextures:u,maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),maxCubemapSize:e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),maxAttributes:e.getParameter(e.MAX_VERTEX_ATTRIBS),maxVertexUniforms:e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),maxVaryings:e.getParameter(e.MAX_VARYING_VECTORS),maxFragmentUniforms:e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),vertexTextures:u>0,maxSamples:e.getParameter(e.MAX_SAMPLES)}}function kn(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 Wn(e){let t=new WeakMap;function n(e,t){return t===R?e.mapping=L:t===b&&(e.mapping=P),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 Xn=[.125,.215,.35,.446,.526,.582],Yn=20,Kn=new U,qn=new n;let jn=null,Zn=0,$n=0,Qn=!1;const Jn=(1+Math.sqrt(5))/2,ei=1/Jn,ti=[new r(-Jn,ei,0),new r(Jn,ei,0),new r(-ei,0,Jn),new r(ei,0,Jn),new r(0,Jn,-ei),new r(0,Jn,ei),new r(-1,1,-1),new r(1,1,-1),new r(-1,1,1),new r(1,1,1)],ni=new r;class ii{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(e,t=0,n=.1,i=100,r={}){const{size:a=256,position:o=ni}=r;jn=this._renderer.getRenderTarget(),Zn=this._renderer.getActiveCubeFace(),$n=this._renderer.getActiveMipmapLevel(),Qn=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=si(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=oi(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?s=Xn[o-e+4-1]:0===o&&(s=0),i.push(s);const l=1/(a-2),c=-l,d=1+l,u=[c,c,d,c,d,d,c,c,d,d,c,d],f=6,p=6,m=3,h=2,_=1,g=new Float32Array(m*p*f),v=new Float32Array(h*p*f),E=new Float32Array(_*p*f);for(let e=0;e2?0:-1,i=[t,n,0,t+2/3,n,0,t+2/3,n+1,0,t,n,0,t+2/3,n+1,0,t,n+1,0];g.set(i,m*p*e),v.set(u,h*p*e);const r=[e,e,e,e,e,e];E.set(r,_*p*e)}const S=new F;S.setAttribute("position",new B(g,m)),S.setAttribute("uv",new B(v,h)),S.setAttribute("faceIndex",new B(E,_)),t.push(S),r>4&&r--}return{lodPlanes:t,sizeLods:n,sigmas:i}}(i)),this._blurMaterial=function(e,t,n){const i=new Float32Array(Yn),a=new r(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:Yn,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:li(),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:N,depthTest:!1,depthWrite:!1});return o}(i,e,t)}return i}_compileMaterial(e){const t=new o(this._lodPlanes[0],e);this._renderer.compile(t,Kn)}_sceneToCubeUV(e,t,n,i,r){const a=new D(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(qn),u.toneMapping=w,u.autoClear=!1;u.state.buffers.depth.getReversed()&&(u.setRenderTarget(i),u.clearDepth(),u.setRenderTarget(null));const m=new I({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1}),h=new o(new s,m);let _=!1;const g=e.background;g?g.isColor&&(m.color.copy(g),e.background=null,_=!0):(m.color.copy(qn),_=!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;ai(i,n*o,t>2?o:0,o,o),u.setRenderTarget(i),_&&u.render(h,a),u.render(e,a)}h.geometry.dispose(),h.material.dispose(),u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===L||e.mapping===P;i?(null===this._cubemapMaterial&&(this._cubemapMaterial=si()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=oi());const r=i?this._cubemapMaterial:this._equirectMaterial,a=new o(this._lodPlanes[0],r);r.uniforms.envMap.value=e;const s=this._cubeSize;ai(t,0,0,3*s,2*s),n.setRenderTarget(t),n.render(a,Kn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodPlanes.length;for(let t=1;tYn&&E(`sigmaRadians, ${r}, is too large and will clip, as it requested ${h} samples when the maximum is set to 20`);const _=[];let g=0;for(let e=0;ev-4?i-v+4:0),4*(this._cubeSize-S),3*S,2*S),l.setRenderTarget(t),l.render(d,Kn)}}function ri(e,t,n){const i=new O(e,t,n);return i.texture.mapping=a,i.texture.name="PMREM.cubeUv",i.scissorTest=!0,i}function ai(e,t,n,i,r){e.viewport.set(t,n,i,r),e.scissor.set(t,n,i,r)}function oi(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:li(),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:N,depthTest:!1,depthWrite:!1})}function si(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:li(),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:N,depthTest:!1,depthWrite:!1})}function li(){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 ci(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===L||a===P;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 ii(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;C0)return e;const r=t*n;let a=Ti[r];if(void 0===a&&(a=new Float32Array(r),Ti[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 Ci(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n":" "} ${r}: ${n[e]}`)}return i.join("\n")}(e.getShaderSource(t),i)}return r}function Rr(e,t){const n=function(e){p._getMatrix(xr,p.workingColorSpace,e);const t=`mat3( ${xr.elements.map(e=>e.toFixed(4))} )`;switch(p.getTransfer(e)){case ce: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")}function br(e,t){let n;switch(t){case le:n="Linear";break;case se:n="Reinhard";break;case oe:n="Cineon";break;case ae:n="ACESFilmic";break;case re:n="AgX";break;case ie:n="Neutral";break;case ne:n="Custom";break;default:E("WebGLProgram: Unsupported toneMapping:",t),n="Linear"}return"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const Cr=new r;function Lr(){p.getLuminanceCoefficients(Cr);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${Cr.x.toFixed(4)}, ${Cr.y.toFixed(4)}, ${Cr.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function Pr(e){return""!==e}function Ur(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 Dr(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const wr=/^[ \t]*#include +<([\w\d./]+)>/gm;function Ir(e){return e.replace(wr,Nr)}const yr=new Map;function Nr(e,t){let n=In[t];if(void 0===n){const e=yr.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=In[e],E('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Ir(n)}const Or=/#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 Fr(e){return e.replace(Or,Br)}function Br(e,t,n,i){let r="";for(let e=parseInt(t);e0&&(g+="\n"),v=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h].filter(Pr).join("\n"),v.length>0&&(v+="\n")):(g=[Gr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,n.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",n.batching?"#define USE_BATCHING":"",n.batchingColor?"#define USE_BATCHING_COLOR":"",n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.instancingMorph?"#define USE_INSTANCING_MORPH":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+u:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.displacementMap?"#define USE_DISPLACEMENTMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.mapUv?"#define MAP_UV "+n.mapUv:"",n.alphaMapUv?"#define ALPHAMAP_UV "+n.alphaMapUv:"",n.lightMapUv?"#define LIGHTMAP_UV "+n.lightMapUv:"",n.aoMapUv?"#define AOMAP_UV "+n.aoMapUv:"",n.emissiveMapUv?"#define EMISSIVEMAP_UV "+n.emissiveMapUv:"",n.bumpMapUv?"#define BUMPMAP_UV "+n.bumpMapUv:"",n.normalMapUv?"#define NORMALMAP_UV "+n.normalMapUv:"",n.displacementMapUv?"#define DISPLACEMENTMAP_UV "+n.displacementMapUv:"",n.metalnessMapUv?"#define METALNESSMAP_UV "+n.metalnessMapUv:"",n.roughnessMapUv?"#define ROUGHNESSMAP_UV "+n.roughnessMapUv:"",n.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+n.anisotropyMapUv:"",n.clearcoatMapUv?"#define CLEARCOATMAP_UV "+n.clearcoatMapUv:"",n.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+n.clearcoatNormalMapUv:"",n.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+n.clearcoatRoughnessMapUv:"",n.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+n.iridescenceMapUv:"",n.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+n.iridescenceThicknessMapUv:"",n.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+n.sheenColorMapUv:"",n.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+n.sheenRoughnessMapUv:"",n.specularMapUv?"#define SPECULARMAP_UV "+n.specularMapUv:"",n.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+n.specularColorMapUv:"",n.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+n.specularIntensityMapUv:"",n.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+n.transmissionMapUv:"",n.thicknessMapUv?"#define THICKNESSMAP_UV "+n.thicknessMapUv:"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.morphColors?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+c:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_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(Pr).join("\n"),v=[Gr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,h,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",n.envMap?"#define "+f:"",p?"#define CUBEUV_TEXEL_WIDTH "+p.texelWidth:"",p?"#define CUBEUV_TEXEL_HEIGHT "+p.texelHeight:"",p?"#define CUBEUV_MAX_MIP "+p.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.dispersion?"#define USE_DISPERSION":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor||n.batchingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+c:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==w?"#define TONE_MAPPING":"",n.toneMapping!==w?In.tonemapping_pars_fragment:"",n.toneMapping!==w?br("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",In.colorspace_pars_fragment,Rr("linearToOutputTexel",n.outputColorSpace),Lr(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(Pr).join("\n")),s=Ir(s),s=Ur(s,n),s=Dr(s,n),l=Ir(l),l=Ur(l,n),l=Dr(l,n),s=Fr(s),l=Fr(l),!0!==n.isRawShaderMaterial&&(S="#version 300 es\n",g=[m,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+g,v=["#define varying in",n.glslVersion===Q?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===Q?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+v);const T=S+g+s,M=S+v+l,x=Tr(r,r.VERTEX_SHADER,T),A=Tr(r,r.FRAGMENT_SHADER,M);function R(t){if(e.debug.checkShaderErrors){const n=r.getProgramInfoLog(_)||"",i=r.getShaderInfoLog(x)||"",a=r.getShaderInfoLog(A)||"",o=n.trim(),s=i.trim(),l=a.trim();let c=!0,d=!0;if(!1===r.getProgramParameter(_,r.LINK_STATUS))if(c=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(r,_,x,A);else{const e=Ar(r,x,"vertex"),n=Ar(r,A,"fragment");y("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(_,r.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+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:g},fragmentShader:{log:l,prefix:v}})}r.deleteShader(x),r.deleteShader(A),b=new Sr(r,_),C=function(e,t){const n={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let r=0;r0,ee=o.clearcoat>0,te=o.dispersion>0,ne=o.iridescence>0,ie=o.sheen>0,re=o.transmission>0,ae=J&&!!o.anisotropyMap,oe=ee&&!!o.clearcoatMap,se=ee&&!!o.clearcoatNormalMap,le=ee&&!!o.clearcoatRoughnessMap,ce=ne&&!!o.iridescenceMap,de=ne&&!!o.iridescenceThicknessMap,ue=ie&&!!o.sheenColorMap,fe=ie&&!!o.sheenRoughnessMap,pe=!!o.specularMap,ve=!!o.specularColorMap,Ee=!!o.specularIntensityMap,Se=re&&!!o.transmissionMap,Te=re&&!!o.thicknessMap,Me=!!o.gradientMap,xe=!!o.alphaMap,Ae=o.alphaTest>0,Re=!!o.alphaHash,be=!!o.extensions;let Ce=w;o.toneMapped&&(null!==F&&!0!==F.isXRRenderTarget||(Ce=e.toneMapping));const Le={shaderID:L,shaderType:o.type,shaderName:o.name,vertexShader:D,fragmentShader:I,defines:o.defines,customVertexShaderID:y,customFragmentShaderID:N,isRawShaderMaterial:!0===o.isRawShaderMaterial,glslVersion:o.glslVersion,precision:g,batching:V,batchingColor:V&&null!==M._colorsTexture,instancing:H,instancingColor:H&&null!==M.instanceColor,instancingMorph:H&&null!==M.morphTexture,supportsVertexTextures:_,outputColorSpace:null===F?e.outputColorSpace:!0===F.isXRRenderTarget?F.texture.colorSpace:G,alphaToCoverage:!!o.alphaToCoverage,map:z,matcap:k,envMap:W,envMapMode:W&&b.mapping,envMapCubeUVHeight:C,aoMap:X,lightMap:Y,bumpMap:K,normalMap:q,displacementMap:_&&j,emissiveMap:Z,normalMapObjectSpace:q&&o.normalMapType===ge,normalMapTangentSpace:q&&o.normalMapType===_e,metalnessMap:$,roughnessMap:Q,anisotropy:J,anisotropyMap:ae,clearcoat:ee,clearcoatMap:oe,clearcoatNormalMap:se,clearcoatRoughnessMap:le,dispersion:te,iridescence:ne,iridescenceMap:ce,iridescenceThicknessMap:de,sheen:ie,sheenColorMap:ue,sheenRoughnessMap:fe,specularMap:pe,specularColorMap:ve,specularIntensityMap:Ee,transmission:re,transmissionMap:Se,thicknessMap:Te,gradientMap:Me,opaque:!1===o.transparent&&o.blending===he&&!1===o.alphaToCoverage,alphaMap:xe,alphaTest:Ae,alphaHash:Re,combine:o.combine,mapUv:z&&S(o.map.channel),aoMapUv:X&&S(o.aoMap.channel),lightMapUv:Y&&S(o.lightMap.channel),bumpMapUv:K&&S(o.bumpMap.channel),normalMapUv:q&&S(o.normalMap.channel),displacementMapUv:j&&S(o.displacementMap.channel),emissiveMapUv:Z&&S(o.emissiveMap.channel),metalnessMapUv:$&&S(o.metalnessMap.channel),roughnessMapUv:Q&&S(o.roughnessMap.channel),anisotropyMapUv:ae&&S(o.anisotropyMap.channel),clearcoatMapUv:oe&&S(o.clearcoatMap.channel),clearcoatNormalMapUv:se&&S(o.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:le&&S(o.clearcoatRoughnessMap.channel),iridescenceMapUv:ce&&S(o.iridescenceMap.channel),iridescenceThicknessMapUv:de&&S(o.iridescenceThicknessMap.channel),sheenColorMapUv:ue&&S(o.sheenColorMap.channel),sheenRoughnessMapUv:fe&&S(o.sheenRoughnessMap.channel),specularMapUv:pe&&S(o.specularMap.channel),specularColorMapUv:ve&&S(o.specularColorMap.channel),specularIntensityMapUv:Ee&&S(o.specularIntensityMap.channel),transmissionMapUv:Se&&S(o.transmissionMap.channel),thicknessMapUv:Te&&S(o.thicknessMap.channel),alphaMapUv:xe&&S(o.alphaMap.channel),vertexTangents:!!A.attributes.tangent&&(q||J),vertexColors:o.vertexColors,vertexAlphas:!0===o.vertexColors&&!!A.attributes.color&&4===A.attributes.color.itemSize,pointsUvs:!0===M.isPoints&&!!A.attributes.uv&&(z||xe),fog:!!x,useFog:!0===o.fog,fogExp2:!!x&&x.isFogExp2,flatShading:!0===o.flatShading&&!1===o.wireframe,sizeAttenuation:!0===o.sizeAttenuation,logarithmicDepthBuffer:h,reversedDepthBuffer:B,skinning:!0===M.isSkinnedMesh,morphTargets:void 0!==A.morphAttributes.position,morphNormals:void 0!==A.morphAttributes.normal,morphColors:void 0!==A.morphAttributes.color,morphTargetsCount:U,morphTextureStride:O,numDirLights:l.directional.length,numPointLights:l.point.length,numSpotLights:l.spot.length,numSpotLightMaps:l.spotLightMap.length,numRectAreaLights:l.rectArea.length,numHemiLights:l.hemi.length,numDirLightShadows:l.directionalShadowMap.length,numPointLightShadows:l.pointShadowMap.length,numSpotLightShadows:l.spotShadowMap.length,numSpotLightShadowsWithMaps:l.numSpotLightShadowsWithMaps,numLightProbes:l.numLightProbes,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:o.dithering,shadowMapEnabled:e.shadowMap.enabled&&f.length>0,shadowMapType:e.shadowMap.type,toneMapping:Ce,decodeVideoTexture:z&&!0===o.map.isVideoTexture&&p.getTransfer(o.map.colorSpace)===m,decodeVideoTextureEmissive:Z&&!0===o.emissiveMap.isVideoTexture&&p.getTransfer(o.emissiveMap.colorSpace)===m,premultipliedAlpha:o.premultipliedAlpha,doubleSided:o.side===me,flipSided:o.side===c,useDepthPacking:o.depthPacking>=0,depthPacking:o.depthPacking||0,index0AttributeName:o.index0AttributeName,extensionClipCullDistance:be&&!0===o.extensions.clipCullDistance&&i.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(be&&!0===o.extensions.multiDraw||V)&&i.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:i.has("KHR_parallel_shader_compile"),customProgramCacheKey:o.customProgramCacheKey()};return Le.vertexUv1s=u.has(1),Le.vertexUv2s=u.has(2),Le.vertexUv3s=u.has(3),u.clear(),Le},getProgramCacheKey:function(t){const n=[];if(t.shaderID?n.push(t.shaderID):(n.push(t.customVertexShaderID),n.push(t.customFragmentShaderID)),void 0!==t.defines)for(const e in t.defines)n.push(e),n.push(t.defines[e]);return!1===t.isRawShaderMaterial&&(!function(e,t){e.push(t.precision),e.push(t.outputColorSpace),e.push(t.envMapMode),e.push(t.envMapCubeUVHeight),e.push(t.mapUv),e.push(t.alphaMapUv),e.push(t.lightMapUv),e.push(t.aoMapUv),e.push(t.bumpMapUv),e.push(t.normalMapUv),e.push(t.displacementMapUv),e.push(t.emissiveMapUv),e.push(t.metalnessMapUv),e.push(t.roughnessMapUv),e.push(t.anisotropyMapUv),e.push(t.clearcoatMapUv),e.push(t.clearcoatNormalMapUv),e.push(t.clearcoatRoughnessMapUv),e.push(t.iridescenceMapUv),e.push(t.iridescenceThicknessMapUv),e.push(t.sheenColorMapUv),e.push(t.sheenRoughnessMapUv),e.push(t.specularMapUv),e.push(t.specularColorMapUv),e.push(t.specularIntensityMapUv),e.push(t.transmissionMapUv),e.push(t.thicknessMapUv),e.push(t.combine),e.push(t.fogExp2),e.push(t.sizeAttenuation),e.push(t.morphTargetsCount),e.push(t.morphAttributeCount),e.push(t.numDirLights),e.push(t.numPointLights),e.push(t.numSpotLights),e.push(t.numSpotLightMaps),e.push(t.numHemiLights),e.push(t.numRectAreaLights),e.push(t.numDirLightShadows),e.push(t.numPointLightShadows),e.push(t.numSpotLightShadows),e.push(t.numSpotLightShadowsWithMaps),e.push(t.numLightProbes),e.push(t.shadowMapType),e.push(t.toneMapping),e.push(t.numClippingPlanes),e.push(t.numClipIntersection),e.push(t.depthPacking)}(n,t),function(e,t){l.disableAll(),t.supportsVertexTextures&&l.enable(0);t.instancing&&l.enable(1);t.instancingColor&&l.enable(2);t.instancingMorph&&l.enable(3);t.matcap&&l.enable(4);t.envMap&&l.enable(5);t.normalMapObjectSpace&&l.enable(6);t.normalMapTangentSpace&&l.enable(7);t.clearcoat&&l.enable(8);t.iridescence&&l.enable(9);t.alphaTest&&l.enable(10);t.vertexColors&&l.enable(11);t.vertexAlphas&&l.enable(12);t.vertexUv1s&&l.enable(13);t.vertexUv2s&&l.enable(14);t.vertexUv3s&&l.enable(15);t.vertexTangents&&l.enable(16);t.anisotropy&&l.enable(17);t.alphaHash&&l.enable(18);t.batching&&l.enable(19);t.dispersion&&l.enable(20);t.batchingColor&&l.enable(21);t.gradientMap&&l.enable(22);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=Nn[t];n=pe.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let i;for(let e=0,t=f.length;e0?i.push(d):!0===o.transparent?r.push(d):n.push(d)},unshift:function(e,t,o,s,l,c){const d=a(e,t,o,s,l,c);o.transmission>0?i.unshift(d):!0===o.transparent?r.unshift(d):n.unshift(d)},finish:function(){for(let n=t,i=e.length;n1&&n.sort(e||Yr),i.length>1&&i.sort(t||Kr),r.length>1&&r.sort(t||Kr)}}}function jr(){let e=new WeakMap;return{get:function(t,n){const i=e.get(t);let r;return void 0===i?(r=new qr,e.set(t,[r])):n>=i.length?(r=new qr,i.push(r)):r=i[n],r},dispose:function(){e=new WeakMap}}}function Zr(){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 $r=0;function Qr(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function Jr(e){const n=new Zr,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(Qr);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=yn.LTC_FLOAT_1,a.rectAreaLTC2=yn.LTC_FLOAT_2):(a.rectAreaLTC1=yn.LTC_HALF_1,a.rectAreaLTC2=yn.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=$r++)},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 ea(e),r.push(a)):a=r[i],a},dispose:function(){t=new WeakMap}}}function na(e,n,i){let r=new Ee;const a=new t,s=new t,d=new X,u=new Se({depthPacking:Te}),f=new Me,p={},m=i.maxTextureSize,h={[_]:c,[c]:_,[me]:me},g=new l({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new t},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include \nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const S=new F;S.setAttribute("position",new B(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const T=new o(S,g),M=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=J;let x=this.type;function A(t,i){const r=n.update(T);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 O(a.x,a.y)),g.uniforms.shadow_pass.value=t.map.texture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(i,null,r,g,T,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,T,null)}function R(t,n,i,r){let a=null;const o=!0===i.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===i.isPointLight?f:u,e.localClippingEnabled&&!0===n.clipShadows&&Array.isArray(n.clippingPlanes)&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0||n.map&&n.alphaTest>0||!0===n.alphaToCoverage){const e=a.uuid,t=n.uuid;let i=p[e];void 0===i&&(i={},p[e]=i);let r=i[t];void 0===r&&(r=a.clone(),i[t]=r,n.addEventListener("dispose",C)),a=r}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=r===te?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 b(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===te)&&(!t.frustumCulled||r.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,t.matrixWorld);const r=n.update(t),l=t.material;if(Array.isArray(l)){const n=r.groups;for(let c=0,d=n.length;cm||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/h.x),a.x=s.x*h.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/h.y),a.y=s.y*h.y,c.mapSize.y=s.y)),null===c.map||!0===f||!0===p){const e=this.type!==te?{minFilter:xe,magFilter:xe}:{};null!==c.map&&c.map.dispose(),c.map=new O(a.x,a.y,e),c.map.texture.name=l.name+".shadowMap",c.camera.updateProjectionMatrix()}e.setRenderTarget(c.map),e.clear();const _=c.getViewportCount();for(let e=0;e<_;e++){const t=c.getViewport(e);d.set(s.x*t.x,s.y*t.y,s.x*t.z,s.y*t.w),u.viewport(d),c.updateMatrices(l,e),r=c.getFrustum(),b(n,i,c.camera,l,this.type)}!0!==c.isPointLightShadow&&this.type===te&&A(c,i),c.needsUpdate=!1}x=this.type,M.needsUpdate=!1,e.setRenderTarget(o,l,c)}}const ia={[je]:qe,[Ke]:We,[Ye]:ke,[Ae]:Xe,[qe]:je,[We]:Ke,[ke]:Ye,[Xe]:Ae};function ra(e,t){const i=new function(){let t=!1;const n=new X;let i=null;const r=new X(0,0,0,0);return{setMask:function(n){i===n||t||(e.colorMask(n,n,n,n),i=n)},setLocked:function(e){t=e},setClear:function(t,i,a,o,s){!0===s&&(t*=o,i*=o,a*=o),n.set(t,i,a,o),!1===r.equals(n)&&(e.clearColor(t,i,a,o),r.copy(n))},reset:function(){t=!1,i=null,r.set(-1,0,0,0)}}},r=new function(){let n=!1,i=!1,r=null,a=null,o=null;return{setReversed:function(e){if(i!==e){const n=t.get("EXT_clip_control");e?n.clipControlEXT(n.LOWER_LEFT_EXT,n.ZERO_TO_ONE_EXT):n.clipControlEXT(n.LOWER_LEFT_EXT,n.NEGATIVE_ONE_TO_ONE_EXT),i=e;const r=o;o=null,this.setClear(r)}},getReversed:function(){return i},setTest:function(t){t?W(e.DEPTH_TEST):Y(e.DEPTH_TEST)},setMask:function(t){r===t||n||(e.depthMask(t),r=t)},setFunc:function(t){if(i&&(t=ia[t]),a!==t){switch(t){case je:e.depthFunc(e.NEVER);break;case qe:e.depthFunc(e.ALWAYS);break;case Ke:e.depthFunc(e.LESS);break;case Ae:e.depthFunc(e.LEQUAL);break;case Ye:e.depthFunc(e.EQUAL);break;case Xe:e.depthFunc(e.GEQUAL);break;case We:e.depthFunc(e.GREATER);break;case ke:e.depthFunc(e.NOTEQUAL);break;default:e.depthFunc(e.LEQUAL)}a=t}},setLocked:function(e){n=e},setClear:function(t){o!==t&&(i&&(t=1-t),e.clearDepth(t),o=t)},reset:function(){n=!1,r=null,a=null,o=null,i=!1}}},a=new function(){let t=!1,n=null,i=null,r=null,a=null,o=null,s=null,l=null,c=null;return{setTest:function(n){t||(n?W(e.STENCIL_TEST):Y(e.STENCIL_TEST))},setMask:function(i){n===i||t||(e.stencilMask(i),n=i)},setFunc:function(t,n,o){i===t&&r===n&&a===o||(e.stencilFunc(t,n,o),i=t,r=n,a=o)},setOp:function(t,n,i){o===t&&s===n&&l===i||(e.stencilOp(t,n,i),o=t,s=n,l=i)},setLocked:function(e){t=e},setClear:function(t){c!==t&&(e.clearStencil(t),c=t)},reset:function(){t=!1,n=null,i=null,r=null,a=null,o=null,s=null,l=null,c=null}}},o=new WeakMap,s=new WeakMap;let l={},d={},u=new WeakMap,f=[],p=null,m=!1,h=null,_=null,g=null,v=null,E=null,S=null,T=null,M=new n(0,0,0),x=0,A=!1,R=null,b=null,C=null,L=null,P=null;const U=e.getParameter(e.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let D=!1,w=0;const I=e.getParameter(e.VERSION);-1!==I.indexOf("WebGL")?(w=parseFloat(/^WebGL (\d)/.exec(I)[1]),D=w>=1):-1!==I.indexOf("OpenGL ES")&&(w=parseFloat(/^OpenGL ES (\d)/.exec(I)[1]),D=w>=2);let O=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 z(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?ce: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===xt||n===At?i=e.DEPTH24_STENCIL8:n===M?i=e.DEPTH32F_STENCIL8:n===Rt&&(i=e.DEPTH24_STENCIL8,E("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===xt||n===At?i=e.DEPTH_COMPONENT24:n===M?i=e.DEPTH_COMPONENT32F:n===Rt&&(i=e.DEPTH_COMPONENT16),i}function L(e,t){return!0===S(e)||e.isFramebufferTexture&&e.minFilter!==xe&&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 P(e){const t=e.target;t.removeEventListener("dispose",P),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={[st]:e.REPEAT,[ot]:e.CLAMP_TO_EDGE,[at]:e.MIRRORED_REPEAT},O={[xe]:e.NEAREST,[ut]:e.NEAREST_MIPMAP_NEAREST,[dt]:e.NEAREST_MIPMAP_LINEAR,[H]:e.LINEAR,[ct]:e.LINEAR_MIPMAP_NEAREST,[lt]:e.LINEAR_MIPMAP_LINEAR},F={[vt]:e.NEVER,[gt]:e.ALWAYS,[_t]:e.LESS,[j]:e.LEQUAL,[ht]:e.EQUAL,[mt]:e.GEQUAL,[pt]:e.GREATER,[ft]:e.NOTEQUAL};function B(t,i){if(i.type!==M||!1!==n.has("OES_texture_float_linear")||i.magFilter!==H&&i.magFilter!==ct&&i.magFilter!==dt&&i.magFilter!==lt&&i.minFilter!==H&&i.minFilter!==ct&&i.minFilter!==dt&&i.minFilter!==lt||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===xe)return;if(i.minFilter!==dt&&i.minFilter!==lt)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",P));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 z(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===Et?null:p.getPrimaries(n.colorSpace),f=n.colorSpace===Et||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=J(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,P=void 0===u.__version||!0===c,U=d.dataReady,D=L(n,m);if(n.isDepthTexture)T=C(n.format===St,n.type),P&&(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&&P&&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=Tt(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&&P&&i.texStorage2D(e.TEXTURE_2D,D,T,M[0].width,M[0].height);for(let t=0,r=M.length;t0){const t=Tt(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?(P&&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(P)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&&P){const t=ee(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),Q(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,$(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,c=$(n);Q(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,c,o,n.width,n.height):i?e.renderbufferStorageMultisample(e.RENDERBUFFER,c,o,n.width,n.height):e.renderbufferStorage(e.RENDERBUFFER,o,n.width,n.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,s,e.RENDERBUFFER,t)}else{const t=n.textures;for(let r=0;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)throw new Error("target.depthTexture not supported in Cube render targets");const e=t.texture.mipmaps;e&&e.length>0?Y(n.__webglFramebuffer[0],t):Y(n.__webglFramebuffer,t)}else if(a){n.__webglDepthbuffer=[];for(let r=0;r<6;r++)if(i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[r]),void 0===n.__webglDepthbuffer[r])n.__webglDepthbuffer[r]=e.createRenderbuffer(),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 q=[],Z=[];function $(e){return Math.min(a.maxSamples,e.samples)}function Q(e){const t=r.get(e);return e.samples>0&&!0===n.has("WEBGL_multisampled_render_to_texture")&&!1!==t.__useRenderToTexture}function J(e,t){const n=e.colorSpace,i=e.format,r=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==G&&n!==Et&&(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 ee(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);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===Et?null:p.getPrimaries(n.colorSpace),u=n.colorSpace===Et||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]=J(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,P=c.dataReady;let U,D=L(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=ee(h[0]);i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?P&&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===Q(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===Q(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 la extends Sn{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 sa,v={},S=n.getContextAttributes();let M=null,A=null;const R=[],b=[],C=new t;let L=null;const P=new D;P.viewport=new X;const U=new D;U.viewport=new X;const w=[P,U],I=new Tn;let y=null,N=null;function F(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",F),a.removeEventListener("selectstart",F),a.removeEventListener("selectend",F),a.removeEventListener("squeeze",F),a.removeEventListener("squeezestart",F),a.removeEventListener("squeezeend",F),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 Mn,R[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=R[e];return void 0===t&&(t=new Mn,R[e]=t),t.getGripSpace()},this.getHand=function(e){let t=R[e];return void 0===t&&(t=new Mn,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",F),a.addEventListener("selectstart",F),a.addEventListener("selectend",F),a.addEventListener("squeeze",F),a.addEventListener("squeezestart",F),a.addEventListener("squeezeend",F),a.addEventListener("end",B),a.addEventListener("inputsourceschange",G),!0!==S.xrCompatible&&await n.makeXRCompatible(),L=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?St:Mt,i=S.stencil?At:xt);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 O(p.textureWidth,p.textureHeight,{format:x,type:T,depthTexture:new Z(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 O(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),W.setContext(a),W.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 z(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=P.near=t,I.far=U.far=P.far=n,y===I.near&&N===I.far||(a.updateRenderState({depthNear:I.near,depthFar:I.far}),y=I.near,N=I.far),I.layers.mask=6|e.layers.mask,P.layers.mask=3&I.layers.mask,U.layers.mask=5&I.layers.mask;const i=e.parent,r=I.cameras;z(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,ca.copy(o),ca.x*=-1,ca.y*=-1,ca.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(ca.y*=-1,ca.z*=-1),e.envMapRotation.value.setFromMatrix4(da.makeRotationFromEuler(ca)),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 fa(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=w;i.toneMapped&&(null!==I&&!0!==I.isXRRenderTarget||(m=L.toneMapping));const h=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,_=void 0!==h?h.length:0,g=he.get(i),v=R.state.lights;if(!0===ne&&(!0===ie||e!==F)){const t=e===F&&i.id===N;Ce.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===Ce.numPlanes&&g.numIntersection===Ce.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=et(i,t,r));let M=!1,x=!1,A=!1;const b=T.getUniforms(),C=g.uniforms;fe.useProgram(T.program)&&(M=!0,x=!0,A=!0);i.id!==N&&(N=i.id,x=!0);if(M||F!==e){fe.buffers.depth.getReversed()&&!0!==e.reversedDepth&&(e._reversedDepth=!0,e.updateProjectionMatrix()),b.setValue(Oe,"projectionMatrix",e.projectionMatrix),b.setValue(Oe,"viewMatrix",e.matrixWorldInverse);const t=b.map.cameraPosition;void 0!==t&&t.setValue(Oe,ae.setFromMatrixPosition(e.matrixWorld)),ue.logarithmicDepthBuffer&&b.setValue(Oe,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&b.setValue(Oe,"isOrthographic",!0===e.isOrthographicCamera),F!==e&&(F=e,x=!0,A=!0)}if(r.isSkinnedMesh){b.setOptional(Oe,r,"bindMatrix"),b.setOptional(Oe,r,"bindMatrixInverse");const e=r.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),b.setValue(Oe,"boneTexture",e.boneTexture,_e))}r.isBatchedMesh&&(b.setOptional(Oe,r,"batchingTexture"),b.setValue(Oe,"batchingTexture",r._matricesTexture,_e),b.setOptional(Oe,r,"batchingIdTexture"),b.setValue(Oe,"batchingIdTexture",r._indirectTexture,_e),b.setOptional(Oe,r,"batchingColorTexture"),null!==r._colorsTexture&&b.setValue(Oe,"batchingColorTexture",r._colorsTexture,_e));const P=n.morphAttributes;void 0===P.position&&void 0===P.normal&&void 0===P.color||Ue.update(r,n,T);(x||g.receiveShadow!==r.receiveShadow)&&(g.receiveShadow=r.receiveShadow,b.setValue(Oe,"receiveShadow",r.receiveShadow));i.isMeshGouraudMaterial&&null!==i.envMap&&(C.envMap.value=l,C.flipEnvMap.value=l.isCubeTexture&&!1===l.isRenderTargetTexture?-1:1);i.isMeshStandardMaterial&&null===i.envMap&&null!==t.environment&&(C.envMapIntensity.value=t.environmentIntensity);void 0!==C.dfgLUT&&(C.dfgLUT.value=(null===ma&&(ma=new An(pa,32,32,Ft,S),ma.minFilter=H,ma.magFilter=H,ma.wrapS=ot,ma.wrapT=ot,ma.generateMipmaps=!1,ma.needsUpdate=!0),ma));x&&(b.setValue(Oe,"toneMappingExposure",L.toneMappingExposure),g.needsLights&&(D=A,(U=C).ambientLightColor.needsUpdate=D,U.lightProbe.needsUpdate=D,U.directionalLights.needsUpdate=D,U.directionalLightShadows.needsUpdate=D,U.pointLights.needsUpdate=D,U.pointLightShadows.needsUpdate=D,U.spotLights.needsUpdate=D,U.spotLightShadows.needsUpdate=D,U.rectAreaLights.needsUpdate=D,U.hemisphereLights.needsUpdate=D),a&&!0===i.fog&&Ae.refreshFogUniforms(C,a),Ae.refreshMaterialUniforms(C,i,j,q,R.state.transmissionRenderTarget[e.id]),Sr.upload(Oe,tt(g),C,_e));var U,D;i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(Sr.upload(Oe,tt(g),C,_e),i.uniformsNeedUpdate=!1);i.isSpriteMaterial&&b.setValue(Oe,"center",r.center);if(b.setValue(Oe,"modelViewMatrix",r.modelViewMatrix),b.setValue(Oe,"normalMatrix",r.normalMatrix),b.setValue(Oe,"modelMatrix",r.matrixWorld),i.isShaderMaterial||i.isRawShaderMaterial){const e=i.uniformsGroups;for(let t=0,n=e.length;t{function n(){i.forEach(function(e){he.get(e).currentProgram.isReady()&&i.delete(e)}),0!==i.size?setTimeout(n,10):t(e)}null!==de.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)})};let Xe=null;function Ye(){qe.stop()}function Ke(){qe.start()}const qe=new Dn;function je(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)R.pushLight(e),e.castShadow&&R.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||te.intersectsSprite(e)){i&&oe.setFromMatrixPosition(e.matrixWorld).applyMatrix4(re);const t=Me.update(e),r=e.material;r.visible&&A.push(e,t,r,n,oe.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||te.intersectsObject(e))){const t=Me.update(e),r=e.material;if(i&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),oe.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),oe.copy(t.boundingSphere.center)),oe.applyMatrix4(e.matrixWorld).applyMatrix4(re)),Array.isArray(r)){const i=t.groups;for(let a=0,o=i.length;a0&&Qe(r,t,n),a.length>0&&Qe(a,t,n),o.length>0&&Qe(o,t,n),fe.buffers.depth.setTest(!0),fe.buffers.depth.setMask(!0),fe.buffers.color.setMask(!0),fe.setPolygonOffset(!1)}function $e(e,t,n,i){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;void 0===R.state.transmissionRenderTarget[i.id]&&(R.state.transmissionRenderTarget[i.id]=new O(1,1,{generateMipmaps:!0,type:de.has("EXT_color_buffer_half_float")||de.has("EXT_color_buffer_float")?S:T,minFilter:lt,samples:4,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:p.workingColorSpace}));const r=R.state.transmissionRenderTarget[i.id],a=i.viewport||B;r.setSize(a.z*L.transmissionResolutionScale,a.w*L.transmissionResolutionScale);const s=L.getRenderTarget(),l=L.getActiveCubeFace(),d=L.getActiveMipmapLevel();L.setRenderTarget(r),L.getClearColor(W),Y=L.getClearAlpha(),Y<1&&L.setClearColor(16777215,.5),L.clear(),le&&Pe.render(n);const u=L.toneMapping;L.toneMapping=w;const f=i.viewport;if(void 0!==i.viewport&&(i.viewport=void 0),R.setupLightsView(i),!0===ne&&Ce.setGlobalState(L.clippingPlanes,i),Qe(e,n,i),_e.updateMultisampleRenderTarget(r),_e.updateRenderTargetMipmap(r),!1===de.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let r=0,a=t.length;r0)for(let t=0,a=n.length;t0&&$e(i,r,e,t),le&&Pe.render(e),Ze(A,e,t);null!==I&&0===D&&(_e.updateMultisampleRenderTarget(I),_e.updateRenderTargetMipmap(I)),!0===e.isScene&&e.onAfterRender(L,e,t),ye.resetDefaultState(),N=-1,F=null,C.pop(),C.length>0?(R=C[C.length-1],!0===ne&&Ce.setGlobalState(L.clippingPlanes,R.state.camera)):R=null,b.pop(),A=b.length>0?b[b.length-1]:null},this.getActiveCubeFace=function(){return U},this.getActiveMipmapLevel=function(){return D},this.getRenderTarget=function(){return I},this.setRenderTargetTextures=function(e,t,n){const i=he.get(e);i.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,!1===i.__autoAllocateDepthBuffer&&(i.__useRenderToTexture=!1),he.get(e.texture).__webglTexture=t,he.get(e.depthTexture).__webglTexture=i.__autoAllocateDepthBuffer?void 0:n,i.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(e,t){const n=he.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const it=Oe.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){I=e,U=t,D=n;let i=!0,r=null,a=!1,o=!1;if(e){const s=he.get(e);if(void 0!==s.__useDefaultFramebuffer)fe.bindFramebuffer(Oe.FRAMEBUFFER,null),i=!1;else if(void 0===s.__webglFramebuffer)_e.setupRenderTarget(e);else if(s.__hasExternalTextures)_e.rebindTextures(e,he.get(e.texture).__webglTexture,he.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(s.__boundDepthTexture!==t){if(null!==t&&he.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");_e.setupDepthRenderbuffer(e)}}const l=e.texture;(l.isData3DTexture||l.isDataArrayTexture||l.isCompressedArrayTexture)&&(o=!0);const c=he.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(r=Array.isArray(c[t])?c[t][n]:c[t],a=!0):r=e.samples>0&&!1===_e.useMultisampledRTT(e)?he.get(e).__webglMultisampledFramebuffer:Array.isArray(c)?c[n]:c,B.copy(e.viewport),z.copy(e.scissor),k=e.scissorTest}else B.copy(Q).multiplyScalar(j).floor(),z.copy(J).multiplyScalar(j).floor(),k=ee;0!==n&&(r=it);if(fe.bindFramebuffer(Oe.FRAMEBUFFER,r)&&i&&fe.drawBuffers(e,r),fe.viewport(B),fe.scissor(z),fe.setScissorTest(k),a){const i=he.get(e.texture);Oe.framebufferTexture2D(Oe.FRAMEBUFFER,Oe.COLOR_ATTACHMENT0,Oe.TEXTURE_CUBE_MAP_POSITIVE_X+t,i.__webglTexture,n)}else if(o){const i=t;for(let t=0;t=0&&t<=e.width-i&&n>=0&&n<=e.height-r&&(e.textures.length>1&&Oe.readBuffer(Oe.COLOR_ATTACHMENT0+s),Oe.readPixels(t,n,i,r,Ie.convert(l),Ie.convert(c),a))}finally{const e=null!==I?he.get(I).__webglFramebuffer:null;fe.bindFramebuffer(Oe.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=he.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){fe.bindFramebuffer(Oe.FRAMEBUFFER,l);const o=e.textures[s],c=o.format,d=o.type;if(!ue.textureFormatReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ue.textureTypeReadable(d))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const u=Oe.createBuffer();Oe.bindBuffer(Oe.PIXEL_PACK_BUFFER,u),Oe.bufferData(Oe.PIXEL_PACK_BUFFER,a.byteLength,Oe.STREAM_READ),e.textures.length>1&&Oe.readBuffer(Oe.COLOR_ATTACHMENT0+s),Oe.readPixels(t,n,i,r,Ie.convert(c),Ie.convert(d),0);const f=null!==I?he.get(I).__webglFramebuffer:null;fe.bindFramebuffer(Oe.FRAMEBUFFER,f);const p=Oe.fenceSync(Oe.SYNC_GPU_COMMANDS_COMPLETE,0);return Oe.flush(),await Un(Oe,p,4),Oe.bindBuffer(Oe.PIXEL_PACK_BUFFER,u),Oe.getBufferSubData(Oe.PIXEL_PACK_BUFFER,0,a),Oe.deleteBuffer(u),Oe.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;_e.setTexture2D(e,0),Oe.copyTexSubImage2D(Oe.TEXTURE_2D,n,0,0,o,s,r,a),fe.unbindTexture()};const rt=Oe.createFramebuffer(),at=Oe.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,i=null,r=0,a=null){let o,s,l,c,d,u,f,p,m;null===a&&(0!==r?(V("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),a=r,r=0):a=0);const h=e.isCompressedTexture?e.mipmaps[a]:e.image;if(null!==n)o=n.max.x-n.min.x,s=n.max.y-n.min.y,l=n.isBox3?n.max.z-n.min.z:1,c=n.min.x,d=n.min.y,u=n.isBox3?n.min.z:0;else{const t=Math.pow(2,-r);o=Math.floor(h.width*t),s=Math.floor(h.height*t),l=e.isDataArrayTexture?h.depth:e.isData3DTexture?Math.floor(h.depth*t):1,c=0,d=0,u=0}null!==i?(f=i.x,p=i.y,m=i.z):(f=0,p=0,m=0);const _=Ie.convert(t.format),g=Ie.convert(t.type);let v;t.isData3DTexture?(_e.setTexture3D(t,0),v=Oe.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(_e.setTexture2DArray(t,0),v=Oe.TEXTURE_2D_ARRAY):(_e.setTexture2D(t,0),v=Oe.TEXTURE_2D),Oe.pixelStorei(Oe.UNPACK_FLIP_Y_WEBGL,t.flipY),Oe.pixelStorei(Oe.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),Oe.pixelStorei(Oe.UNPACK_ALIGNMENT,t.unpackAlignment);const E=Oe.getParameter(Oe.UNPACK_ROW_LENGTH),S=Oe.getParameter(Oe.UNPACK_IMAGE_HEIGHT),T=Oe.getParameter(Oe.UNPACK_SKIP_PIXELS),M=Oe.getParameter(Oe.UNPACK_SKIP_ROWS),x=Oe.getParameter(Oe.UNPACK_SKIP_IMAGES);Oe.pixelStorei(Oe.UNPACK_ROW_LENGTH,h.width),Oe.pixelStorei(Oe.UNPACK_IMAGE_HEIGHT,h.height),Oe.pixelStorei(Oe.UNPACK_SKIP_PIXELS,c),Oe.pixelStorei(Oe.UNPACK_SKIP_ROWS,d),Oe.pixelStorei(Oe.UNPACK_SKIP_IMAGES,u);const A=e.isDataArrayTexture||e.isData3DTexture,R=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=he.get(e),i=he.get(t),h=he.get(n.__renderTarget),_=he.get(i.__renderTarget);fe.bindFramebuffer(Oe.READ_FRAMEBUFFER,h.__webglFramebuffer),fe.bindFramebuffer(Oe.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;n Date: Thu, 16 Oct 2025 18:42:37 +0900 Subject: [PATCH 3/3] Updated screenshots. --- .../screenshots/webgl_animation_keyframes.jpg | Bin 40887 -> 84334 bytes .../webgl_loader_gltf_compressed.jpg | Bin 42524 -> 42692 bytes .../webgl_loader_gltf_iridescence.jpg | Bin 34608 -> 85674 bytes examples/screenshots/webgl_random_uv.jpg | Bin 51644 -> 51723 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/examples/screenshots/webgl_animation_keyframes.jpg b/examples/screenshots/webgl_animation_keyframes.jpg index 5926436f0d3e9802fe3b98d979d68613e15ee4d2..9ad14a65586bffdec73eee930618d60408bfec74 100644 GIT binary patch literal 84334 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 A62q?Wrq!Z~KLZV2o0s_*d3kZ?kiS#BQH4u82 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 delta 34550 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

_3s{hT%F7B*DY6>*-bxV+go>=VH6qy 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 delta 34412 zcmb5Vg;!hM^F17(Knn#bxR&BB#a$lU-L1I0%cW4a- zuH?J0q0pX{K!V^S5d_lwAKD60il?R?oLcOkr6r9n&^&S4-_=|OIxuH!HQ_X}R zd~?2OIkfei;<7qnNG{_u_r8CZ9zd#3j2FM(Ci}eL*xPZzxxx?prbaU`*LT zW^KIl~l;FW&)SL+rzR{mjQMF=ehZ(CU!F6zYk+~cz={eHq(VIo0$9~ zE;SKz?{ZBVFz3+zq6P6{zgG^t(PhR(?8*;BEF?{;3S>Kz2O;{Pae-Ew8;K(SvdR86 zkxK@t)`JR?1KSCIp?$c|^#MrUNpOZNH~tF2vayazQUD(*9x8Bgz5n-81=8}uA1lj$z6LglC;(x2`scTZ2p*0gI6RzyRf!R~z zGo_F9_^>m1Yy+6q0kMnb+DfYa6uP_H&wc3w(93H`&h0 z=Qd4q&8RcEQ_Wq_=oXUnK-;SR7{o=Wp7WwWU%@z z^FeOiXTR<1gbtJZnF=7Hxx)UoD*VuO;`B_|#NQ3-c((#ID!oA8_Zpd)`?T~5GJKH~ zCi_Mfg;qYpua*4rO%FoO|Bbf2X$>P!4A>l=Tvgh8?v3{M3>%Dl;;0sB$6hf z<3|ogoryyJ^;;;ZlK)H3kStlD`!K7bl2FsffQ;2VB_0TSPtzWVb~e1f(QBU6+Hih_vin3b2lc+0M6kM-RDlT9+HS{T9FtOZlC{pB znzyDtFHN;RBU1x&rp^PdG87NKHR=1u+vhBJpZQag?0eQXDHeIFqcem>O3Y%z7uF>-_YlTVU6 z;)aUmA0F`5dZnv^wr4Mim`8ifWJ&{>MfbO{ z!J+J*yX(S#UxNL*_!c+F(v}orM0C*io~Cd=o8#3ic!mSCBK1)Zb zB*HSJ#kT`Ekbl_;C7}c=N4}}-GxbsC|MJ#%rbV}}35^p&+<3xj&Qi2S6D7!wv;j*L zjSwDX{zZbs5RPdPxT=dl<|2%5z2A(~vnYBj*Y_XVNC#L< zY4}BQ$*cAImyX4KfQyfh9;4g^RXn!wie2a&Ri@;?c&EluyqG$xn$lTYPP`Z;x%TKN zav-CmtiaCG6en?N-DVu!fp0;TGr|YyLU~-3saHXqL%NaRzH&LATJ2Cljt&d8k^D!` z#SKv0fWp~&rY`foqz1?O!?L03JD9EXq24DgW@E6Rdk**XY5 ztGvHZ7H;wnkxa_k5&XJ+nEwd;&nQRIwj<>Yn2b4aloSb>DF(qe{jXr_n-VvWsn8r| zFOJ{oM%3*}FT zXk2yrwLc$Yir!bZ_Kl|hBujwBjn}ID8&DL?fK7@l3EJvqZmCVpwgaFge`|dtlm8b& zW?E1te5Rc~z53r=xhGc&nHF~w3a8C*V@`z;+N6Br2r$=eMTi1K&*RD`a75K6km`{aV!I6?G=P| zB$;QtgvxJ|JX8aO;6~MWd>)+?mq!}?vmf&xf}jFJj5eaH{3k8EQPLaCze)^?*l0t8 zIhTf$A6dd)L0cJyv@`dmFDr{~QEV;ltG*-?!dHeZ^{93Xg2YvHyPwZoFDoQRN~ycd z596vMTc?&yttN}isog{gH9K3XJlqN-r;LHy3c7DrRmCwt7Yg$C@!eLRwdiO~hyB{x z0K#B(y}*M`i}8;ZLiD5q`Q{XhjWQmj?+$4}Cz5?1Za4fBLZ1osmF%+1@0u0;f9J7Ti9!jHn|Klpc}(B|&R$W7+M! zr*ZGX{9VpJh0k zGEVV1#*chEgiNRiLcJkL6h7vxZFo@fq(pEqdv$%y8?eptZEl3(Wo9$=IBsy9(nN%` z@p?w6809uqRR5}V{!I*n7{bj>rD4f`fC7>0k8!hmE+w(&GSnR13F!rvvON0<40ERO ze8Zpnc^TAt!7KF^5xAxT>g?0(q|iwmWUR+2*2gI%{kw9puZgP*U_oh523dbw?UJcM zkFFwbz4R4ocKS8gXwQCQ?14ZNYoi7VJ40~>FMUq!E9g=}!Oi9sRD&AEakkwJ)VXJ= zE)qPob|m-#|Lk5kZy)qCdImgNFLlQ3<5IJ_DUP2jjtoPV_uyWKIcE^N@Y&{oC;wCv zqv8neiSKHBX7};!gc=M$aMJ)4FpWxEbZ#a&q14_5R;_VDGAHdI3`>uiK|I+vRg_4IDoX zu!i4c_05^5%si9CS=Ol|5hjWDM+4$2KHMS#hWs_VgsQ_e);r$98(Jq-Nw`yB#2iUX zfudu13erH{06b%$Cf^kN2K5Ve)9e2sH8PF#1TFbYAv8RyxS{Sj!ie{FESfGCdoGX% zXpNeTPPFO)X6e5njPU^-V@fcTj9sAiRagPPr#)>PVz z>64uX&$^6*Hab?xZy(ihW&U1>FrdeegVl<#s1+CF{Y@D1A?>MKGOcSaOj)!0$J{xdv)&Y?n!W4*iWFM+XBz>f)vhs+5 zj_MZ)e?#S0&~p0q^T*4FQ~M|dccTiSBQ&4yo#F#?s)g>@NG;jggC0}3-`}7H(!N1q zF%It|KOrKH8ZD$a#?%h~0WnDZQ5B9XKRhHF$DI`t>B zM*m^AET88+u9a+g$Z;nM)dBC(_FbJw5G#HS zF|^|6T#EcvqAO6ZB~%VIeFY&$J{Jp-LhS{(HfZz?caiL_E?+^vw_Y?ZwxKy}C8W9$ za+B4!R{}?S>Ute|Qndk-o0m?W16XftPpl!reKHl=(o5FlzXlJ#Ew%_3`OJC6CIiv| zk7S;=FOuw|^fL>ey2~CtpQzzcMy%`Y%X|Q7Q}<XnrE@J4z6IXHeCgCf{66>Rv*>O$B!iN)|&>Z5K!9o;(ozPhJexVvKiMUz*3-Unc zQkpW$k)6mEj{)NzotVl%NHH@SW{sSGTnfuV7oQ}kbA>*Gv#9k*(@C?b^-7^2J>)M5$-s#lO4(V?W|!WZt^9&BZB^k{{z zEDFwL!^z;R)Cn2vGsO$KyCpd2tDtN`CrX8X62-{L9x zdpY}FzoR+ziK`mp{sj~t`Gmw)o0I05@(p8`5)kNp2{r)pw6hIdGo(1jCPlvYi3A}& zqJe1J&{3x0pl$LFkYx^pQNDtLBm5Mo;ouJ$D@^)RnF8J)KJ)B94`0$8s(4AdcXt6u zH6E*H^_5T*eN4^$wGh*+C>n;h-Ce;y-5K`?_f9`Ash$<;f*lg`Rzk^OvqiO7k+oqJz7C;s!Gl467JXIehmO#VL#-a6EFiDC0>9ZHSxn<+@9JK)^(q-_gDG3W~pF=}}r5x>JIh z{Sy8mY>9R}y1tYO3*H`&FsacXVt&Lna`)2KJ{IuYc7z4*5t{VZfxGP3y z-?o)LN+90{bGV{(7aQ`v^DG{qObiW={z1=?uqXX6A2x;tTKD1})up>GntI4=B5t(E@$k_)TfYqJ>teoS zyz>c7B??s=7L6Y;k5@`*jQQs7Lo>d4sfY!o{sl#-gy!rvM++Ey6OJrQvLcj>D$^H9 zNpWON983FEe573-SU_LS%c%Em--4cjwak1z`&_kz7=yQ~R%*KK1qj(CA;o<{jl@$^ zc9}lGJ+9+^`l^j1hUH3>Gs*eWM!_m)!_nwtQQAK6VW(!no_fa5a{J5OzW|7N6JE+y zc8^%l!SQrywPc9S>SoMhO7~^JzX^_H1GT4{S5Tne?(W4B!<{fR==#LyGQWfWO{J?) z$+pUK4y|dnt}Sl#IWT!2>u;+w{pY*ep2FSo^J=yOb+PcXf#XoTpoOLW@v7gh)(_B##;snwf$+YE^7;UnoM{R z@Vf8ctg9aQ4=M_ol&)*-NMB}VY7|Bvr>vFxoPZOpTHZzqV2ZH(<)JCNgz%t-CF=iu z%&drHeaK>VkZkiC-5`Me*qS63x$@HM$Gum;e?CQM8pV5pG!XzF7}6wVY8=@nkNfFn&Bs+)$%XGq-@mI1 zXh^hAYX}su}c8BEawwc7jBAu74D*U9<=41iJD7T zDEhj&B7r2+8gZ;(uE@-8Z--Y;?n~#ENTe?}OcaXY$ivmZ#QAkHOu*N7dp&?ePNFq| z?qkm<3gb{zFxsbRhX$+2_=A|Vr?^+p8&3EV=0In6k>Ejdr>XFMQ4@k-3VfxtP-Yi5 zB>_-SWgnyKNf`ZU&~k`#pAXSU8W4N~`@%?hZ#u@1i+(Sc3 zqQz8un1|nV-|Jq!4gQ|#r!rrCF>lW?G;=yVYDsFCYDFM&do3`5`UG=w3eh#OifMA|-^^{tBA5XsemLk2-iD;XJ>* zcs%yLfPGq(x#|KzsaE$*x1IsUlp(b{>4$1l5^hEkn&d-y@?>GqB~8?na9Q zn#;qzaMr%KQ?L1l-=Pfa1PWz%b`hZMQnE&PmL8(5 zYb~rcTCH0sc-SsX@mb|%`X|?FV~#-i=FtAuJynm6_Ot$vqm>pKrTC`=TL^qH<;b|B zhnO8V)uK~h5MQ9H5P4YFb4%sR8^3_(&hwjbr5()LypsUDrpAVJ^sEnt)~@`(XvY<0xbuB(SG!%0cno9ljss@Wt-01Slt$fB9R@vzE|!5o z;6vjm7KtB6D3c4nfz4o#qaTJF^_*#=7Tvc8TA^vufpZ9m?+T$hdAnRYn$v4KDJhSk z+0q@{=Fs)e$GeK*qvX$HljH;ZCU8}mwOeEDfzTIdb(tSE6zJPA3VIQ2&C#g8e5rRf z#|uwcG|Q*`M_Z>a+3`NwJWPC!cyUQF$y8S*Ogty7C7-v;K(dNjATfRU{nl{rVK5JrOF-iT~LJ%3Z;!Ow<b@Zh1(o0GUCEMNIKJ($0^L&5A z6A|>|Xp*3s|8vq{vXZBTkNP((YbArpGy&7?in#Z{36_O975BCh*c+$Jmrnb}T0xPU zo!NmHi}7(za)B;46gA#&fcI-+k}}xIUvgWUd52AAfUUI95o)BI4ri!{W7?qQBSm@! z#eEmex#L?S#FMYIj_$w3#Ws)sg(@!(*`(hbo7|?1sTUEZQwVEMH>|qJG#ok|y9~!R z_Q?PXiPq_y7CslJo=-~9;5$?3aG{^%^qa`01lm>!ntic8Cs>FNfd%;%MBu_cC-1_{S+XBTvcRc_$&W+Yc68SKQ^r2fEw({O8kA~#bNNZ) z8J;z^>Nm-RX#B(*VqZbM-Dog>uVDEsoczwYlzm%U_hi>=djAxyo(aFg_gt;0iSNR+ zGu4mftX?dm1|R0_D!#-JV$PO=1IpZ+GdjB*R&q3;8;%TW*E~D{wu>q*QNqc!K(c=d zmD1SM4AZt(QtmN(aYyTB`p_XSqxFQ)g_^5EJyj19O18(eG*gu(PBPZkapX9qSuxD!zb>E24XKH@-$0{r!vWjh&7IA_DRDK-hCLUnb zNI$9Q`G3h~2>!jj`3B%TO> z9z(!UiRjpe<@DeQ<7FZny)#E@hRH6!1)_0MKT53fHhH-Nsv>7UG2MP_o3C1-heha5 zj@_^+;ZPE|EsGza-aJHoyQ&os=K3TF^f(A_<&xFo#hrD1eA(Qriwg!Qp7ia8owuHK z3gV|e5X_~ONK#Pjk$;Q-ThXgt_A|*w_vjuDWGo}{w|)G7*2mUb?=z-=Ychgjk6iy zpw&aPJ^vca`m%qK?|w)rS{O$_=QGpvf+ILy-zAQ`MFe$ro1O{O_}{gE7SN5xBeU00PIh_)*^?_ueF*`KZTIRb#q?F)G_AgZ zs02>?(2leYESa8|U*>Z@__;rMTWw+n(AYvw42d8tk^9rs^@}&Fw)f3VZJ+eKKghWf z$Dw`vB33GvO!+ZLBA_!UGTSWwMxpVcVAmPH(w_7~h;^f?(@(045+*gp`?iGH@&wz~ z+XHwZTJic0GEc7r3tDWD%LjI4fTAP zx%5{`x@kgy$es&_TOwDylMV$cYBF`cYG;+Oh5HLWB&$KUP=)KdgfFjx z(RcH4d>sVb^mdfDAHs8GPU3Am6E+?P}g5< zk;FKhlz)!zqCYl56JkBgW^I5V4`wcSLK-gY)=l37@7{Q#;;bgmyE&_5B*zcM6irGD zuH?*CpUy)Vq@Wd-fH*`ku?#%bQWH~{ymoQN^xZA0{yAsn zhc+VVsE9V#WA%}UHcSR8!L)c90%uI2&qdu9Ea3s>?S2Xnbg%B-R4vqh?XfxzEMj>) z8-76hFm^mlv#Ri)>ZnE8j?HxH%6x$E0hEkvM+mc+;%iZ4P+RdCi;RxZg^b^%9VGAC z(TKG1xX27(-Dkcs&p}sWeOo0%>|{GKP*{?817nG*K&QUpKf_%%>-)IUx@!@)QU~p= zR8QwuLKndg#7(lunyen7m-Lh&joA*z8U_Z;Rg28?#Fx6yY zpct_OOg5Lrx3tc5wk{%sk%itKX5%j0&U%u9nWNBqaK@a&mtE1ClPU>@8O!kx5&+w3 zEIMDl)KhQXWPCMcYg<>(ouN~~Cwf26=llyHI+!h#rogL2@A7znG={m6XcDFT8Hw*?Mr?^&Y`2QV&sd1&UysD%ms62h#Y8LKUe!$vh1_v~pGuNd=$vx&Noa zdnuyoK|-#cs+M*F^_VtN+g;ikV!+?FEjjH#D~?@YQa9{dGfI<_j{gS@{&!gNK|!M=j#5{+`ma^W%w0}zJrCn6uv@KTiRG^1hhx#oGA)J zV2gkElIWGkOXvKF9bZ9?bm$TJW!w7&-7qBhAHIP;y?kIw(nFe3-&+DCE>sQT(buj)C>Z{@T(VWBZ>#GX1vcIm@Ck6!&#n~APFn+A zuOR0qr0CnK#Ptt>K9QlfpcQyg6$QmLQiKRMYw4}pOu8{g5MQLH2zKEgdJ(bQ*rZu2 zlruqRrQa3gbep0&AquPLtc724u|}#_jP6XHqi)DP>3iAkz~f&O#}il*$69k#xkV!x z`{4Y^qgu4wJ+&)!>_Dwd;VBxH_1x-5cB$2y&1U~?>vr}ztJul(+OrgCYH`v+B~R8` zO(+a>qFLgdjREiKp*NLym}(MKvq<_lhcvO+kb-;}qBqu%MW4@aqmOC%|J&fP6!ww8 zP~Dl8e;&;C+6DG;K1O9%ro(<|Mrfj^QKjy=PJ;DhDAHt7*0XWn2>Dk~R`D0xTW@?J zGkxNiPTuV_=NV=qkV$21q|K-J`zwSd+csUf>z_=)_u2m1W&I%rwk2Zk-^Y@+1sM2) zx~DD*+-`A)zAtY}o~-=dLI*B2SGN~~vKZY-zEbH`NVNbH+V`MqBYVPzT8^YL!G>nj zKR>C$%C}YEEvnBK+Ua!a91i%TTl@8V5r}L>Ziqi`Ia+@sD2Yq4l92*E`odc&nnst( zK-i;FOcx$BmJAJMe94$&b;%OBzWy=v?9AM0IOQW7QSu)qBG{h~6W|aV2ahC!!X}Gf z$=vT$D@Xw=8J&`H>zu3{Ou&|f5Nf-F-CZwrR=s6g4f0c(@fdQqEFahtEn}7i_ha3Y zki7{NQ)w#`MD@TUE`K?%N`#T+!On)dh^$_d^tsMgMslDj=L`>R{uK@{@t1zT z)|0P(e_RSq?;~zC^GijS<)kv5f$^J%YXC(qv%mu5^9fDvOSNg^<#=vyY21CIVjMFi&QbN9S&-L^&>A8^EQx{v@YNyql=-WbpRQ#d4k38DaPOWQ#Ank;V zb`ON7X|anFYAMp1g}d6ffTw%5`P&KCQ_b2w6EZUFHYD z6o}YiLVCf|3cTgH&CqJ9eVKZ)J8~-evc`0G@nzdJbkJw(QL8Ad_xl>nQ*-(0Q#Q4I z?4QOrDlPsTzX*Awi*eC12>x_z^X88goW zyh8lQg!7K7^mk2VMo#l@v~&^(aOQ5zi~$LAqCUyEx)L7Q91erU_|cP;k&h81rLKw7 z#P|`4vVX6Q2z%c-6$pp;XuHkK?I-in8f05muI4nb4tP*k`n@o->HTiLd%z!XUC7!9 z8{Stv@FDvQ^oTS>bZ}Qehjt_?uo|?z_!YBfW7W*ps)is}VS7gLkZ27>^1c~gMS$;x z_6hTSW_Mj-;)>%{ln^^qqjclA`~6v7dwg0^3q+za(kJLqp<@_&9-agCUTSkLifKDK z&3RE=JeKsn81(dAy{^4Z?PUo9u!RI*^0PvOezccDMLT4lY_$djX(VR9un5k&$lOTJ zA&yggC@&wA2Ep6fgo@Ub%>wD_fL6VtuH?{70X)cgzzKyOyvp_F9;#6WfAprh^!tHs zQv7p2d+@`cMx#oK+*^ZIGf4}}#1~!ON&5I7H~2n^2`-5p*#|f}s(Uf?DtkXQ5_Bo! z?=*W(47l0qFv41M8Oc@om6=u8L{5W#xP)LV@ro0i$R1k1YgDo^B~%6uB3Yc?fA|)O zY(}NTs)K?muQJ9~RZv>uL?muvfx~SKd^2jgKdUYA^MYjUcUD^~>u>UVyR_vYcpRMP z$S-m+5TO=GNs^&bpQl}sMR1arZxa2TE-?H%o~ad~TGCMFdU!Z}r{2g2rP91md*U!g zM3JdvnEO}kVO&Pvcq#!v$es)*j+iE7O=;4#y(MK&GkX*>Ph<7p$&7MvJ@v`}YVpgk-&PBZPUNAv@;#FkMZx_s;>vCp;6oL@$M z0e)9O*RaQU117(w{&X#SOd40Jb(y}te*y|Z{d6pSk||AIbdf1grWD%!ff>x?FcHNT zx_u`~Y3gys|6c1qr)1U6X5P+DA^XYYO(=yY?33l75YeT3>LA#3$fqi%)R4ZzS$o3t zK^Ey6t8M);@=<`4G#e4mw|=NvReSiTPFNe>j$+WdjQyR$R~=3>M}m#T=jR}-Z>*tF zLD2cp?WhH;m|qJh?q}x7dx(nYAS0N0)10|KVFZl6f|^-=X#Fv2NbNllbYS>yBs))G z(LBd7j0J0GYK@Ng%G*PaIr!&&B~NLYB92C34BcE7jaU5^7QFA(L)E>N`wFVfE`97i zwS>qiK?k;eV;Wyd#avL-EHcgVd=z&RTU81R6tbPnWL8Bfa zmRWaO%_G3M#ISJqX5_PCCJOe9%W&i_T{OKhU^a=tI5JYvkD9(0$t=Y0^dxY z^C}G(rBMk4($mzs^QPm*SqW4P7j*CRUO|5Zc881_ZwM8il(0mp|FBXOcLVYnygp z@x_ujjAWSSXc&y^9a9XJkYpI4y`qHRmyD}v?XNyd3*q`%LyRK)Odaz!R*tSj`C%h= z^Wg-yCh112It}ORQYE$&1sK5&`Kq!T;q{P;o%={XqMgNQw^0nZ4dNO&HUc-3TTJ8bg2Yq_~;HiEEl7L!D}# z>Zw7}RSaeu!;>o)qeMZa9(Z?@I}9dYW?3oajJX|iK1xm#yG29dZ(|bMryg*_Ym~C- z+P&`sHKZ9dF-vwI>$rcqfjQVg!%o}4z>m3`dk3)7N?rpg82QXt-L#(J*jXUpG=rc}9ot?nT%K zyt^alyoo*c8CJEPAL(UMJ$l*M;%LX>`Muaza`Kol&GrI=!jZj2Pd4r^zS;pKxhKB5 z<>w2F23dEv=ceHU%9+&={!L)?<=tb?6E@s&_`1zrK}+bps$QOVUQlO}raW(a1aQRm$VXTow#fOefABN9q|{~I)>NMT-wLA)>GW>Q zFWoOQc+&^pYt|=K^jn%*?Iy-*73TLPav~mw?o#Sz^a9^_;g93<*^8^z>((aQqgZu+ zJgamwpLT4J{(FrCaFlz0?UbHx@V4`+BA(gjhSP8WRk)uB>x1FpY9-S_^cscKFYFJB z&KhV9&*k=3@<)@)?cb(fLDrK*ezefqo!^{fVLtj?Dqp|i#=NNJs*cf5fz{T^^`wNy6(ZW4R=(VWk;K+ zFMP)VZ#!yIRhslx{e^bNLUB=11zl{LLQPK7RS#Vj`Xr0a=Kfb23-W@mnX?e$CR9rf zYPqwHq|w}^v7``Ey#o64a_sjCD)O!AH-VI2`rHXL%2wgYFky9eusvD$p+THP3!#Mt zZ9!i3#xq5Y?+Hg`*M zd|Fu9!%d=cN!A~?Wcu>Xe@7|ueg&^@GK`c0Y7Xq!>fDjYZO1md7rwoo_}+vJ2E94h z3#%dFDPnB;Ie!p7;24u%BjjEkgx?uMD}Dxok{#BU4ZS>d{D z==17JP6lLX(`U<8iZqk45=;{H(SKf0cp%c4ELSbuRiu--J-b>0Lv{yV7(!pf%ZA8* zCIDZP5w8B8#a&hlf2KdzJ@u=utuU-emhzayTDZ+veUSUsB-EJ2_bE{@nhWtMt-_k4 zgwfTYrdMdFSqkBw583Hru8b>$?{9+_LfAD<$;iP)Kp=w+&>_R#!^5)p`68=JUkq(?VM) zy<+3R;1X2Y#_C_URcw{ciuehud&jHFAB1I8 zmvoWK?U03bH!Hx4b}$OTN(-a+)`l3(EuAuL(xx2=#u{(`ArXDhz7oMXSFILM_XmcT zJ?ex)V?8y&REmXa2`6i_mr}3~1$WeSbH)&?AttFI0QXi}Uz)j#9NO#s9cvBU*XS#* z(tqyGv8@6N6&P~fhK7|9-%rknq^7kWbGD6ol!9MDh<;oGWS4r|Mqz$bMTqZaVcZ3x z=IE^W?=^9h$72tunPhbdebqrA+L?b!N=DYsEtfz*Ms!Vm+4W~1bgS7)1xdW(6^KbJAXEHeY(v0w@-z^px3KU zd&^UuQzBVRt!4G-b6dKVXWn`cK;E>_P;t<_0M4e17}iq7Ix*6rrdzmMdm5miCZTA#8kV1s2A=47CBRa0|uZg41H}%XtoD#)46LE+VGkI7=p+28o z29E-Q+-=0Eh)PhYPd)!TGx1v^Si=z;A<(}IPI>f~q|KL0p$~IK7{v_UXdErqDvF8>Q%fWP6u%X&#T_}`$zKLE zSNrkT&IwUKh2@)CechN-)FP%bG517Ij0|)ul>C)QWB9=;=L>h2D`GWzgE-j6v?L6P zu3#xqxJuXsDRZVxWPWgMqG_sOLIjO}RyT4OJ9n{izrl8x60O`f-NO_8P^!=?rB5$K zx>65Fz5h*$kXH)%$V>l*;~l}>$r3S_ zvJ1j*q9_Fjk`-dq?jcoo~}~MeI~v&>%W_If>b+dO#7%hYAva);cACTFsEvn zs_)0wsSFUEQql>WgUi)|mJZ8;!jC#o?af@804`pd^ebDnr1<@XKeMNNvtqWE$|y4d z$GeSQ_>~lEm$hE%4YeCEc8F%hc8nx1xX3X%RBNH*5$D*X{LpWL=KaxVI?ZeV{-Rnx z-+#K1#S7*{i&KjW)8*wo(&ZY0h3;!p!$;{$Gr(VVAB(^`#6Rv|qe6bcRYqpm`h;k_ zKX7-WG zEvgcqY+*!DhRYd2Je}uE9fyFPJ$;)LWXu=71VuphhE_9#kYQcG&y2?CBh9$K(yuNy zXjo4UX@@9t(H0iUF`d9!NZe`v*6k?+A&?ki>6QD_T$0OfTR`fG72abA{nhnlQ2@so zqk#H0elAw%C)z<4T8);~3QpOGru>fXgldLgea}JULF=qN>VOHIo$I7*tlMCG8BG{v z=sfeAWhxgf4z6G~%?2@==YJA`XR0gG<7=z4Cc*023=A4ep7!4**%jzG%_xgn?||?ntnrCu8sEj_;-iBrW~%4OVn^_CaH6aK9sL$|x>rw0{2y6RJaN3$}U=VN8J{itHDD7c(t`k_+FYGd?6bE)h8Z9uG>ip z@F)FIWyABaBjK%lIH1QH+(h(ahRaJMy3meP6ug0Qy|0BafpTquKW{(@C^GotF5lVM zdeyp4FM3P@nz_gGW$Gg@rOrxrSt7DOwn2k;Dw2a06V)3dbxb36W8B)k|Fi!ZJo22c z@~y@}1CefGOA2e@XrUa)f85ygymf@4GCJYdKFL;C={-KUUkk!dIyHwCFX$fg_Eo?} zwhnl2$_ns#*E*O9M)N-Ti8s!g;ZcaC5`#O3zxRTa#ouj)fAn!nJ6t3PU$ zpgH}xY0)o^)-2yID*4IDaEIaUPLa3>wx4_p#_OW8m|;8BLG~B0|E@c}BxdKg)+DFr#*e2|s9KT%moLcj{+R(9?WM~b z+ioT{n^?bs2FVkT8HCJkcr9g!C%{`jaBh_LOl=;uFudp_vZ+}xvqqZQtY;gMlV=f( zvKjVkvFGUZAM5}JGD)AfzMSwqmRZHCk^W6Oo~kucKB4*l9x6s+94V$PAaS8*IU_BL z_8L8XKj`t|+Qt>69<{TSNQ-eK@1#59PLV(1meivra58w7o~k?)#;%X|4w2=aFJ zm7cowKjHp3^XEx3VrOE6{iIRCHIX2l5`wYbjn7)w3Fi9Ef{r)FR8Td>)C7$+dC6AIy z+HgK(K?9_nNx*u-wX<&w-ddYvH&hK-AP?CvlNUu?NK9ccBJmMl6%Kq6gX06 z$=hSEHU>Epz70;#EsojZxJ`DemrlBQ^6ghKbCkxs{QJ9}gwNSq#FwmR=~^P2Oobhp zYDhnGtMs-x#E~h*&2u>0G-asBhpk^-c~78q%L%wjW!vyWgLYnKY|Th827J)$)R}we zK`Pb1?zyX4!Jk*qDHtCxmo4d?Y!c#m+3c<}8n_5@_L6$yTG9tB!y|`_?a3prmprQ; zOs!nby`4uY%IpFxpoxEkumWwHo6`AO+d7#{8catOm&gvlUiJNI`yNsi&sloO{Mkm; zP~e;TrwIG$k7`hvp2{q3eIw0GrY{ zc$8z))OwCJMRc-5l4KZXHae$n0BHca7ytHTc!A?P{c%@>7(?-TQ#wH(&AFm+5`|hG z+S!1kiyUOYx&kZA2#wM0BGd@4aUD-R5_p5hCiiuizyXShg>yJR=!?d%EU3hdmD<~B zdFCeNo(Jvg?Ix(Me4#q&5^93)k61kAY&SFuq-1x^`UeYB=n3SWRz^R$6QQL}T`3Gu_X9c}Ow;NP3o^1MT>a zQZQVsK_g^GlbUI8{=9uUu<=~J7tG2ujG7ZLXTIFUj5(jm4pZ#d4PhT?Xf2aVG1MdN z+YyGcEcR#%U~XE??DG|fK8?~YeIg<|Gv&OAW9=D4v(EutF={orJ&}EeR==Q+L#h>^ z!OZnrXK4HejDMg01J8Y42mUMq-zEyitp;~er1Njn_Jye6ye=DhvTHQZ;%BhS=E$DX z>-|=8qU&Ix?qxo+oY~y$(@1{VN=EBl>L09?U3rLLOk5xE0V-hBdG+7a7!&IG;+N3( zPVY$98CFV+(ucDJ4zJd3SyoPl=)2LFI>=jsEA)$VtY(Wn=ptnt@O@Z;#?Y+_Gm~Vc z+6UNifkyu7G+=ZYAO#LCEj6F@H#dI{K;QT7?myEU9NN+f3&2|G?4ScLzk&+a8$!M^ zF-nibjs_J*=OShGVEJkF9i){beKn3yGODsJW!O}1{2wIw#9)j|^;UVL9csefQ!#hde9$L?4$(?BV5 zWwl#vzs%%F?lYaL;n{j8AIU;;{)D{WM}1P9?6B<|bds`G@2b@B zm^cS)yExG)KgM?TH)P2!lb<3IYB#;``XH;v&VMOD(OM{9+mZl+ebZGpo!XrX4DkBH zuc7S55W?dRwc~*~Oy4rQE)(bzlr=ZCb1+P%X+ z@j0vTMHEa{iydXARObfMIb}UF^ba(8_}y`1>FJHx6QF+Wpi_4{HXvh&=)1^! zXofe2y%Kjed$E9(Yy-7E;g6j5!Xl8^7|b$jTU$TK0Lh;*?zbQc%8u`9hBvkD zYiiM1=|XYjMPUQR{?IC`b|CfkpLg|X1^ix2a78^8)K{%$8l$VKEeSFzIG7KnjFc2X zb75QDXmf(DBrP&%Nm;PaKMk@V(6rFWglW!lzF;NjvkuH%^Qo07HNDD|eNW9a=_sC?)`tec3tE-lmV=+Lh}twQ9xtl!ike{Wh+-D#%2l^eNfPiTUNe%-dO+huW+)UJDA zeU|G*d}O@Bf5$K6!(>){IZz*GR~ICd3!6qK`?e&kNToEDQ8BvIh2jshYt*91 zpHGG4oL>z_<8{^38BM_yC7cjwn28ZQ9p1&_X*b+L1t z7a#L}gYF5=S^45f9qyb~4Mu{0E|gY!n1;ykPh0NamEV#Q*_v}HlC7aK zOkivE8h0e;`m4Gd9X=p9PuJd}&`Y$5e@T^;s(1ZxvW}I_=Jzo@WvD|ziDnBOSx7T$ zCe{pzrPruI?5IsLiI1dx2b%6ZUr|>!rHJgbeMH)=CjgSh`dsOaI}1Zy{A+o>D8CeY zr&7xFDcb!_cFH93ReQD|#9{f>#?*dER%^UQqQ3{###FU~vNC{HSELfG(49-^-Dct# zf7VuYVLm|Q3yPW)UKt$luPBi+Orc_WF(G^^=9A1J-4sLjubWI|{b`Z-0zC6A{uN=r z4u|L-x`q~?&^l+=Q@tpGwxxwbVZj*_)8!R;_0HwPyOhfHV)gsU3$?_Z{}IL9P@qfj z#{4P1$mZ_I9H5Q9a9I`pjVggt+?C5PLH1;929_~|jYq!M4x(^fg}sj@&wQ#7kJ-W6 zHA0+m;miDw@d8-(>+^5?RWr@ZYV{dIA6jGWcjr_H>3-dmB%OI0Yv>|*BLWZO$t%*$ zz9%)Wa^BE-k`5cseSi)PxP*{Rp0sWto3D5XTYv#TXbNTC!SjvDF#09AKG~+*y>Hi8 zAOG*sFi(c{tdxwuC35JEvGlE;9h~G*hjvxmvAExoovx#EE9+)!=)&Qr|A@Y}2(;9c zryA0U;1aHd)FvJ%LRAE`>uer~YrP4eBiKT(mp|8=ZA>n?>G-Gd7tYCq*VzNrt{rSg zkLhLs?MS6*=OO$RHiNrayHnK)9eY0-*6C}+zbC)g4)~1K$Tm7{$f`>e=gK`F$W0n` zT$VZ@oS3SnzBehZ*yH(aEDBP-$gQVKYSQv%h*9>?Y;1GKRzH@PbWtk`$l!BKYEODP z{PO_hi|ucdp^R7Z_GzUik?f9>%P~=*XNd)Te^Y)EJ!eHtHudnxxvy>e*PH1YQ$OFD zNiK5chGdl9m{xCoR>fv^P@g&aB~U`ASO?zckh{HQ#Zoo}mj$YFCbB!G(7_1bEU5|^ z|H>-hr`L3vv^g)KgBa;-#`=W&<)ZgwB_k&bhtZ?&6}$M2n8cKvG2i5Z$A*XKT)x*Rhr1_C(=E? zqlbk=Yj3w?Ny6sFlSnznQTUuVKf6TT!+<5ywxpH&!N?r4NkSy0ul3hP?qlX=? zXt{_>#_}&&^(~NRIQp&MRUW@{8C57Tj)bsHF13Q2SHkLW(JOQc~K^i#4tx>B0>PwP{>6c!+nhnXJEXEAm)WqPkb zLN4??qGQ*~!77^=G1kdnMa=!B&BY~iKdww(Js`S&f*Rg3bqYpBuG#wJHLwrH=zRh! z^POI-m`%8+?awGaPqeeoPHx1B<$x)Ke;Dm)dA5~Mak;<0OtU`W?mv9iZ9DVSB|X;O zVC!XW@=3Yg${7&Awimk;J^`Kt^{x#&K4JbhbQ09RI$YN!_A{v>cj7rAjAU2h^9GWl z*#b4{5Qv^#LnWRmn6%!-8`4|ebs`k$9kX{v%G<6HtGf{!I0r0=I&F+e&@I^&Wvk6v zWK~5WR{vvAUJ6zP{SM4g|0&>3=8jzVQhYt4-EtC|3K%&P08{O)z0>7sxD|#O#3(r7 z!_laF(8PtNDxvQACsl?^7*s?xx3tCnA}>YQstYRnTg)N^Zj=zJKN1PjEl_rw+GUKS zvAqox>Ll|9Kid`)Qy(x5ThUs29^v6z&kmoBbE&Pr8!|#SJ$0g&8_LEs}nJs)Gu+Z1S1%5C*@Q%oB;{oOw;-@Z{&3`U9Eo zmaQ^<1q=UlqiaR3eHV`GHcu>@(~Z2n)--_&zMg)BZ+podgNXx(TEW}VZ83dUA^)dr zpNgnv-RX!5>e=pnqEvWuU%))?lgVhMFG$7Di1+vvLAIN_qy6@s@2IAOS4itUyjII*-iWKrsiSF~RBn&Q5!D zv`-$#%LSWX2b|fX6QKJ+?Bqq&e3p4gY~6JfNrVB?`s(U0aYnkQwlq^dKM3GM3wUQ@ zzMXeyciEjGWqj`V7*<}82Xuq^#6U4BTF&#`O__||jY#M9aKi^|Zx?x@fvVt?U(<7DJ3M=5^mYh~C%r5>HAJW4%Pp=?Rnl^8>W>Tt6ou=J zW{>&Fg2xcDd%^QB4wD-50KvcrZbXIrGTTzPGn4b-%yP;EAR`RUBt?Nf)N-L} zxB;G5u(*p;6tZ)P<@CcYM1h1^e`lXJeZF=Ps%X*>{~%ab;YB?6hQnyOvUum!qq-JjPY6M=q&=fO3yk)yBI%# z_HW_zC&xOtewqTXVaMe)Mdrr(?Pr@d`>Y7TH~yM1qYKGM?Sj!uQd-Hx#MqTTbm^!t zyjtFNrTVSfbeh$(O~;SCy6R0f>z*rFdv3?!UP10fH)GC7KQqj5hnP6xmD_r&YR5QK zMMVkkNGm_uDPEaWc3tO$=Pcn3kKp*UoAV59g_s!PRscK;#L6dNGj{LCPL50G!2({RD`l4!AWE8AZH?=j{+W~ij%O0N+8e8I;%!^8f0UHp#h!dTT@6j#cWn< zP1`S7%ghWopBat1s2y#ntXD_!o!UtxubkXr_zej$_WnG8VHc5o;FqM8q21+y^l+~? zX3aVWM4Al^xfv$aGR+Bc?B0Jwj<39jL(a_~L)1zh@(b^2PBM#rtYl?eL0xqQQzFh+ zHch1e8C*>**X}VcqQ3ihY@6{2eUraM+s4 zmPVf+-PBO1X;-hzQJON!k-lh3c4)HgG@2c>Y+i6y9JJ-+)vYJq8YxQ~%-|rV;qYsg z>Q;G@nPY&T(U{Rou$5a?u&BokEv|RzYVNI~G#bvCCA@9H{mwK?Yrsu6J)3o|iTn^a zZa07CB@~$L7dv5#5qiKzptewW)CBvmZof(a7P+Hn07Jkak=+;g_Wqj8@_TY=sa6u)p(nz`ttoh?;zB1nxa^9-FmLS3oLmWy-+%y3fVb^>dV(}} zyQq;yD62BC#L+Y{`J9M-ZHddhhv?SjdNW9x>p4}0$Ehv2$)N~*tzmf`*79OzA$Sr) z8Dc=9UzhA;Eh_g#^6}?j?-~aq=*JpJd8N`~x22U{RCvl(>!FUcws9>EGl?*9mrX)j zm={Pehx$u6(~kE$07LxshSCn&-Y?>}E;H#NpK;+U#?tTG)fBolAANY}Z4xT6leVaj zR1y3xqFBV>>^Hw7XRL`!0U_j5ud8PS0FtNI^8UD}NTrQ1zP)X?g=aT>sU$O|rB*y0 z8{!i9cf}Xu$TUi9T1iI8Z@jD0uJCGx!ly$%Hcr+ZbE%&@0BdgsCxU0IREB#t@|1f} zJQ~KS;`=_E>tO9idAwh*<*z$aB8!vxl$sLu1X~YL;>bSUekdEtF;+!r5m}qjk|lpW zQe`HpOrdd>$#%5c=7vxp(qO)Kv-PqQW-k9DVqIwB6-Gl?N9Xr#{qL3Q`8p*WMHz-( zPX>z9a}D(XakxosrmV+VbG!hz<@}6&;&?Q-LX%D3ju_8O3#G zFq@y_*`G#SQ`~!D!@vD0!A|(*@;!4qZ3+cH8RP9>U&VV7`6&%aqnX-@h5wefxsz^7 z7{J}!{85=5mMjXDEj<$}Zg2q_zZp-8&hsRX3tng7n8&WvGebZ-2KA_#5-PY0+8lL{ zI}YzU2vO{0rawVN>QVE3>-!*xde{B##`{Fvq&w!-s~SkDEJvqqmt>q`#qct(4C7P2 zNFqg=3s}HKnr?1{GqXkLdKeXG4wlv;aWgG@80m-L6;klIpeI{aQ6-fq%I+BO^cz7$ zZY%&4vd+UX7(L{@jZnOu@4e!)qMurC38;)qd=Z8Aw8w(gl4lgS*;~_F@$r8|HDX;- zJ2j0H)wL-m5`2EeAi01e;}?(g-D#QA&1;ZBAIBH8 z=VhKi+;N_P-ryCp*oQf7JSE4kOCxmiIg9{b#kv28ZUK&rjIo{6d>h;Y86W4WWlRE)`MI3GoQGO}ZiHaeV3PK$or4<9o zB$=8wlY|VpMiet+6R*9^m=Sv3@ofcVI1|metCA3YvgGDuTyG6VcLifNy;|6DL5|suGd$KWDAMkuWOUbdONaH6NP{d# z?JN!}djfhopaE=Q*Q3h!!uG4zhGgc&Wa3l3GTBl#&FKM0Q&s(^TX(cxMFVumiw3Mo z|2+wm*Rg+Ip~#o*T&s)}`Ze`HpVx_JtBcJ;t6QRXcCKFaYEZnrW+>+< zr}RGe(D$WBwNBd!38BTGjanl}ab>ky#W`zJCBB18a2X%>ZrxlN9rQ$Z@&Z{kRcwNH)wsiX`4)-{B`#*}X<3a-^VD@zIRyXrl_XYx>N#lq9{ zrRt%|B3XJEJ0EtF&z^)fr=X(TlG10GMqNWg&1`9hRqdysBCd)xz#hXrSHERm8FY%k zE068+W#1=h{OcL-=M5gKWz*i%h@3kN38pD(C7^zdlO&@N1veR>lq6+!s zBR#;2`RMwE*PB$MOO#IM-;Btr#bwak!jc(WqDy%AS9@Nj$+@o1yuS~a{c2i2nW`$#3{OAlR1ytsr zZTMP?m&EOwmo<-LgC{dck`(9Fb_gYU(KW|>dVbu;;wh{CF72x9?EqgqWo4)25bR3T zq$b_(FO{J$=UpbnPkyB!L{5^1@}Q`Suc zwOZg<+5%F@1kCxNg{!ANp!)Y|+G~;j%oZHx#Z)Or)>Mt9{IjX4^!lE2=MROJkMBQH zLNU+6jcbuBmTAbMX@Zw>8zNjY3A$C(YvmC)SZwAJ?oU!9o~V#Lv#u`-4Sde>KvmD% zX7;e1WAZW`9{xQaEki$JUu#r?%$QJLGyFPC1LQ(~7q%IekZY3|$2VgFGU!*P3{2JE z&4_Y$M@?k!(7U`w1n`WMN5rb$>at=l4cod3%gbF}Am6Gj!>OzpXn5S3sSLs0P;PbH zihz?jZu-H6K*9o`q;c=_UKd>j(b!w1e0sUI0cqQx8U&YHm~AaQ?o%q`i_vhzmNmHrHyfp^x9bMFyO4P78LedSF0;IVm{YV>J$N}09YCV8{Ggeen;zXBqC zaw8pYM2O0h-?49D$q-sq36q}Qmp}n_JU$7Ep|Sb=R#ciAcempGZs9eYB@bed+`EpL z^)0JDFMcN5AuZ*XpyE{bX|2f(wk7B20R6~nX$}is_)h8kcbQk)Hja!u=2gs4;eN5| zkWPKBipP@CVMMT@2A0>QxdmM%>Ym!Tl)`P7d7pxP^U`yU)W+GIcma;_7YzXMfP~X& z{=kR_hwXfQm~I?1!zpDI$3X7$l#yxNiecd0^7_`eZ29)EVED6C>*@1_nVGgrod6zc zA3fzK3FkS5MDCMKCX&jVK|Y@^vOQO>A05gSUjG&znuoV=FpTf|;~o}Ft;_tr{@Fre z4za9>)=65+ihS5j&3d~fpqd@Hzg#P`aL*ipc9m;ybx`Bh7`b8Frqj(mOl$M7@{qD@ z9=Ip==ruEEhQ4mOhp#Xp-ZaRk&5>R5a-~0pD-Fmr8h#UhZVAdGL;q~y#**%u@d*vl zesL3u6))zLR}YO_2rpfVS|?00zu=imA-dQ^x2=(ekQYR8U!ywy$&mwLnoGz&kKq@4a!unmy+!g7hn z`EOT!eXxUuL&#pD>L~yx8NNhn;aKjT%xBKkGs?fe-nvzmW7!hI+s|dOnkruI*JVc5 zlV$+cf+~s)7*TS1Ordr2nll^gm*2Z$0%z!blP2{)rK_sd8>|d-(YP>&x@)H^$tV|9 zmb!mW7B&lGJlW(+GB!?fI^{JBm2ojvW`O&fl>Y1~6JyVJsCWykBQ=uc(#Je~Nu^XA zoaepnex22n_&3d}fNhX$eQd1IPX_l|U=`<-F3NCjtn|~?*R<2fbLd@Kpn2~#18Y2H zVT6HuR`O<~q+?j5`0~dP4^($&iI}SYX*|o+8jqJ&J(HZ++XKL; zyRs=?Fh4ITqP99Gwfc+r(u&tQMP7ILXOs{;OTFf?16cq)e9h2&EX!kh?uire<+k_<#^+G-B z9*u_AD^mlzEtZP{e^@hazCXf(gKzS=>@xR^g0Z{imEqq&$~k^!(o#l=y~rKkK~UBZ zr1~?7-R7?iMxoe=;Rj<#^VHooCV5{TQ*U+p%3bEK8FYs?MJ4jTz#dMuv5e&hG8rv- zje-~*ta$PsIY9f`;!UA&5{Ay4sfF1OXe&r2*MVKt8edTiO4)ZP2@p+a|lrzWU#1Tf4e!e7l|>i z=_JPCy4J2yHoaZ&PQHC+kQlXV}OD+GFKPkpV{QUCOpZJRx@(OqWr;~X(T87~hh zO_&%qPEeKU;(alO7r9(V1}U8zEmROC?5FFT>i>uy%!5hRXjgB&w_+v0s(93B`X8B@ zN2Ga@$gIom`7fGkNh_E-$=B=ic^83S;<3so|n zn_-de#7#{hmtZ=jsQ3lGiSB5joM>WkAdRhLv(cx1>WX=Q-`Qm4v+?YAi!u`G!)xSp zSQM(>gAT3giL)b-hAArd6*HyFq`vle>i2uXd$jA&ggpk|Jg@Dsb6}(O67X!dm|9afV#^O4iyO#m@>J4RbrP{{){u?sTkdnYzZWWbg!)g8F zP(p5WD#4F$dRmNw)>yd_(^1)D6?T+R8L zt)1bJX@I9|O4dE>_p>r;iOH#Rd`M%}pKw)w;zGbxs9bEB2^-#^=*W?s+*O#L zU(OPYL!ApWYgLlL>4e}+{$D|zjG%~>T(9nmHEFQ76ruv;E2cu(*49sMgh{vaG*lDz zGOx^s-36-izw`bI@23hVydCt87|)IF6h74D#iNeI0V_Ro!*4-T>w$Lo=csNy^bHz= zCw9zx;sz_4JU$&W^FC z{8%HU3fdVq8nTVx@ogX-aBmZ~S@WOT=X*QMc(G+dxzQI98XQ`HXR!*Pvvpge)TvAe zlUD8lRF1a$Jd9{3I_0HRun@Mf(-Kt;$1ZZFjBb5@qV9li!Rd|&t{hjJB9MtK7vC1s z%wbO#@EAhBq6DH}u|H*>I+e1P^sf3uR5nv~PxV>wvA0afoyq1x11?qaUQX1fKiWm_ zuJo$yiWJ=)m!M|r%Yn(U^jfNtHDm&2L3DaRmpG@@LXmbVS*~U76x0id$Y9De9uYC* zv-lcS?(h3~gK{i3>s3c8Vx2}Za%i&rSho9srZkMRT7LGxGqi2%SU*!iEbb%$305le z-uVl8Ry)ZX2}y&MsH$da>vHZ6C(GJPb1w78;`Q_WzWiC+-S}&<`|bvQTKCcWk&Xml zcyVTzY>B05@v5;KktGi1ar9xLt97NC$GW;!I@YQjmNzAo_+=`8Dbk8%njodP(#6a0 zd*&%4`8J?&Z6{q;Y7N>Sxov6u+uAn}5W%Tn5}fZcVR9Wq;Lknj<8y(d4W_^3h)VCw z+>C<}dLtK6evhS9ju3$iTm7FU zpZNVPEf$I@w)(qmF$0?4>BPXlLoJg(3bfHf15aF?HJ%l^+1j1$Ev0UF0JFzN|4d8< zsWY&4F&{QUj5xky?9f1EQZ|Y?6cYx^n`=V)T4F)myRw%Pl+R{&v!vc-ua&rVBwxCe zcsmO7guR|~Q_K>+n35ZIoG;I?vQ6VoV@ex!QyN2il?VAU7VqmamMN7ix#Y@ovc)bR zET*H*-p|{gYxRmM=#OgwXVIC7CxteL2IkPT5@TG&@{-QaInGkiw(bTrQT{v{rXW3DF z#BRf;IM1;DUGI7`b@_4m?3pvux-@H>sLz)B7Ya|9$}wA7VKX@pOdkJjd}ab9=bVod zoSgwH2Hqa{U74$Lnm*dBf(@fJOu*5f<q_^e=_Wd(IwbNNR@0 zYAj84_Ln0i2PK#sJ(P2e;(u7UJF5(w6yQIa-E(ktV_1B&=4Fx;anjsiRO8vg8hc%R z>rCH8gYvrr+in*iy1t(h9(Z@kcj0r!!2x7QY16(_8_JgZT>h0L+@GEoETDQX$H>cb z)tbnC3eo*d3pr>t-lcu!7pyaYdT!KLdw)Xx_|KMUgGz#A!KMn9|s%s#m~}3 zMS9SoF+J7xX0OJp%*pQ7)HxNK^A8TIVCNpFAWyt@RN#!{pRd#Kj>KJi_oZYRcFr1P zvRxqMNH7V&E${Jb$@fBOm+el>;(iZGH{#D&QG{kpd~l%9fF_Dgy_j-JclyMXd0Pn_0#At)SNsg{fpr98%2$?ea0fgID%l%I6P=)ruRCCoNBEiAWjjOp$pCw z-jinU9Ijum2CrSaOcQPh&ch1myYS?9>t6EYb9Yk0+TJm8m829`dND+UUW&`!~t`;t6`z3ONQqWtikMNB5L+>XN z0y{v6Tn`jiK1n2-{-v0E&0wp@Og8X8faoO)0^Krv$XEaoIgB>oCz#X@t`Cj7s0a2Z z1Adtg7KeT$pjnc7dkD+qsXwqaNT^55KgJ1&rsQoktfNYdz((GaoRtU+?FzLVNT?XA z&~{(&{+l_^*rvJ$ia+eM!t0kM$#{w)?zU^&{Ay&y*0q-ec}&s{@m~GXOgs=Z?*h9u zB(ZtV2MudzCRbMkkwfmzq4YuX<@XTw-dl4O{USYP#u)J9?<}b zzn^md(H$e*egwQXJGEQ07SI+vKPyJ>9x(M7lri(qa#BvHa&17z#JM-3(sq~q4?6i{ zFK>|CGAUB*m9bAXz}_BRl#bhexU}v()}>J<3x4RcjZeNAOTRq=l0cIbZR6hqGo(D$ zClZ;vl9Mo*7?zZ;#04(Z?pXmo*2ucQ@ORksF<4Db6S&6h*{a9GUtLd)jWe>khB?pnKUpHxaw}Q+GtV6JJk_ zTuRb_GxdBya{6ONrs@tKJCzs?OuSg5&bKC_12TCHr7B-8*@jtWMG{@=b+UVzR3iLo zKe?<2Uav zEvuqZ-_dynWZDIHw3cl|vHoz(eEvC!GxGTH$CSJ+qbPED#(P;jhxSyVVpjL&5ty}<@KgLZp-D!!}RBK zFgZt{F?{sA9mgUlT{H|$9JZdJ5sc$&$lpD=|k?xqY#>ra+H-p1QVSTn71_3HGgCn| z4&{=F1!1?FON=ga*Vn!vb@CbEXfcomj@$tZYe}fP)k>1Dww>qWy>kDoj#)FGHr068zb5;l(rKn4h@!L}xV`$om z+*=jopkUpF@HBP>z72Ncc4vcKyiI=e)lBO1AGU!OG!{Ewxck#q7=ng2<(pV~AWS%O z;4r@f(Uno;$6(qw{DgI~`LU^yOG2f@8*FBkzRc_EYCQWguVObM5d%1*{$|np+}b9{ zyO}S)w>7mS+^0iTTsQ}Bh!0^A7L&FaN|NQo+~~$_w1+b5K*zF#^$Z`l^>H<$Rp;a6 zyLJw&QJYz6-Bc1-ZKz7JKsD?ESkijEH-d|pK~s-3PF*vqd}E$_biKUZij!Dc-lpG@ zZA@Zw6+sgB`bWh|8jv>L7f(oKW^5D^XrwkJxMP)!|A^j?t)^INWI9=|h^$PkL(TMj zM}Mtp{9J63b?1X(nHJQV-&YuK-xt$kh*jzeEc@nlqnJtEt8@Jn=XfRKm)W^MwuIG# zyWR>@<#Y3Iqe0Q-Q3cPWFdHi}DqGYW9_fb!lR8}Hca=D{1DLCyIbrKIZB8B!2_e+x zf_H(0^t@47bn&(Nx%_o9guZb4;`jTZc=+cWrqeckYA(-em^OK`7E*n~e{o?NwiH~S z_i;)rK_2ueNu5~JSi4iAdl~udJG)f^ma{#RWJ}KnVbeCtyZ>H*dq(^>4FXQh8=XNG zL%Hv`O$hG+`d?4~>g{O!__p}~6M{}iSK6}R;e8Z!F2QScCSF@pcl-6)(dB-R$~@?- zxmw^dhV8^I`=c*f zM++B(mFgX>`i;>!ydOh&BUk3|Jc@!VJ~owFCCve7tP1vbV4@tyzeCO#_fXU(b13z= z8>r<{KsjHt1wA};>}Y_76<3%wzAt~#CcX152VU%}9a7&Gyg)rgH-yY{`0=>Ifoj9) zoB$3onH*;;wt}ktW0ou_dg(^KW=f`*W;(iiz|kQ8Rf)Z>%Z{Vigu-KF6stM@>?!F? zykZLg&dMPLA3F^>KTR)_eIzPS4yN~C)_B8ehl$=+b!J4hUrD=cFZMgKXbFAu@A`;Q z+V1GqvK`7_3es1GpF*|uwIo=Gb_`$75m-7_uWC7lWDT)4vs1aw9=|evO{hN&OaXlu zJ6Cg*r7_*4gNUI^H@e-_EOu9TV__xgPt<_K-5b^+Z;C)3NYapyx}W!p?4LvAmQzt6 zUH-^XI{U-t?)vXD*+R{q?I`NFpO2D*;LN$Mft9g(<(89M@x1*bkCKww&uXR(Q5goh zZ`mFrGUPqwjkX8Ay;h!qSV2*GaQ{i5J-Dd^R zmNMI3><0h_FqU1}3eoaK67Fdcer7)Tlg6yCtV16*CgE@FV?!o6fHUgwa!`{-M-y@ z)T}br@vbwEP2cRky-2RV-Eb(rn@kIc5Wj0DJcyJNDCd7YKR;JCJ!hB*4wQm`O3zw) zQ)TE05$O9so6wEmwv{GM@k(un`keGfJkE2uuEAz2?TIyO!OE6~s%mwBnYTznxqFdIh zb)b?OPdj(@vaeBl**7Nqy2lxI^H0ZfO?uR5rcH1i74TM5emRNy}% ziy3!(G17C*^#893cXGAAM*l}7sMNYRLOwmL?#_*u!^T-lkbxBG;{GFoV4}eO`u^A0 z|A=0!b)UiJ_>ZO3=x+ehj_Xv&^DH|Y7Avar_Lc%JC5YzF88kkjW7S(M1n|9}<56%Y z4>P~izeukp=veMEMcljWmZD|yC?>x8%CSX<9O@R?@lv7>_aZTN>}A9s8CJ6LuTv9x z9h6&BuX#iecA7rAS{MA28&G51R6Aj*Pns3A56Q#5=^2StfeFNnLXf&UTdin|jw{2) zmrvrB?`sSmTdz*_Z`7%HROS>nux=lj=-N;fHTEMjiohevF9&4gjx8GWhsQdUyE1mM zPt~6DTGzHTQ5_D}ZG<2qmeyCr%$`O%8lr8ISm|X1ZYI2S+IqVT*7KvIlJfgAnE(P1 zQ}!81Kd96mkP)k@sJ8EPeSDT%Z*u%2XlL`N&m%v)((Y@DD#ntZq8-9}#o+f3Zvo`Y zK@`x5axA?975j@!5~UkHLl3%AeOt?0a&3y)YMF$-$+JElF|n#`HcE~C-j@)hf*9U4 zU(%~nP5qCEW+5gst&6MXRbpBw9i;d#R%4g<@a6G6poM*hCH3IotGcYp;O`5~LD^lg zL#q!>P$!VL^zH`&X4|2b2=-U2s^JN8Od2=~8o6P>lh?PPt2SBcsvB!R(JF|RiFD{c zl$cnTrW22H%l->l!U~xKDgyE%->Sc`({T7kyVwVG6D?i~u zg)6s2o40+Juv~96Ou>EPJSXs`_3DKIo_h2p);7E#HDaEXZIt92{(MEaa5Sby;e?aR z(Q^>*UILCCRb3j-knW9q6Y7u5ey?IwLTnB^N%OK30qlxRjA->Wj@h<9MEQ$s7faK0 zpNX@Y6|dR$p2#xb2sGH^cJ@QGDw&%{&({k*!E9P5Xu5;8Pkk=ZQSz+Hxm~Ns;1hBzA#e4dGc5`EcHn@2rI0vbJzZ8u2bvnI(m>*ts8v!7y z^D^Vyp2VlBOrFNA!5KY8YG}Cha9S|AUxM-&=mX!WV2jalm~=0StHMQ+$(x#zyK;IF z*Sz@C*h%Y84y?H`*MCS*YRL#;2giR-)xdo%2920Le4h5&TxBzBzvQF)GpJ%#zx-j% zK-aloFuXBksG!ph&obGd^Lzc?T_C?i&N=bd?|o0nnoy+U@n4ol_mu`s(%~^io;FVp zkM<`z8ejMPDz3+{X!-IP+dqn>TJpPthJlT8OYZKp~ygN%XjU3?!PHRn^8SW3z5}+oedh_t4U%`{EE}R;@{?K`Tj_BsSyQuW$jQ< zGgcB(RQt8Vgg)$qQx+l6jFY}5jc;p;?w+5$N80f0YJTMWcTQ*6Te+0w2 z?#2=JlD4zBK|mt_ghE|w6wXjdF=4P7Oa`=Z5h@(yQ3R;6r>#?1rrY5F z8%D;4E#OLDwNpX;@2Jfwb?2_{*}|csd4%2yU4GQ>_hb)_M*tNjAnQ~^NZ~)Cn}>{r z4hXqJk}B zC7D%RFXMipS?7Ivzivk@Md3UkV=T`>k1nyS-&cCXuTGm1SdEVP5y1G~EM;bKS1jMRp1A6Xu&RP7+7&o!ovLylI`aAf{H9G?>N#W76O;+mf4yX$t+pj1Ye&2rvZ07gq`-6dwA>)IQXeP-|J2 zKj<3NU2C|K{`sK}l6Z#(CA2MOmvvf1OSM1&lCyGe>3WoAB~iliCCXa$Ifk|XuYm2& z=}he=-ZCzx+qK5t7upHt_*s{VAJ0y#z#ik=Jd6N5DsD@+G(MxTQ~m|2x3DKhhWDiY2mr$#@Q z3iFG&bhoO@Iq@$(4Z=hxWU?Idgw^eI&EFAssELYl{=X*+8Pm}u%aVjhpr5;l766MP z;3(ijLufQ`dn-b`S`(*x_5ANyZUl%v@83Y})0xs!iMwR-M!zGy4I8Bg*RCVRO4s;l zXdbEQmq9ysRJ!dC^`M*!RpwptU?i)UW<38_FCMF12g2t(YWeW~=gQ%6$5Gyx1?^?7 zmZtH;n!YhSKbl<&X-5F(e;FGq7xR@sQ2{qY2*n6qvj^`#7<^8z=6jO-emtikBhdHi z$sDboqqNzZze~xlw+tn@vx*&uI4KW1ZXR-DeY^Fd3+J~-+87FHt&SePVD4_wGYI7i zuRoR9Jt1+$y-bGMcBrlh(d?HSlkXq~$9F7~NX=8&mS5h=b~xb7G`}06vu8nHy0oER`tpg76C`T>Pfpkt~_jlGw|@ z(=pg24M=Krs<0~(t1EUfQ`|gqWF{@u^h&jI-%!!jqvU&gTJm~1C|?dn5#~iX8tHgA z)lC=Wa?_b+H}SeJCsQuvbpq!fek#BWD5;6_9I>KIJxh<)Oqd-R0qjim`c4VV2cGN# zaI$)l5o>_ga_#|B?_vI#G0u5e$`1u`bh%1$?s|F_bEnJ7>7!}fmO=)VCc(}QCf_2^ z@f16NaD;Q{)OX%B1ii(23av6PZW5a>1+Hen-0Ubb%A@wgu3p)XilbWqdV?k6J_CMP zI5eD1w83-VIjb~;E!O&{zgB&y^|4?o|E?Zd*3tNyTsc~G4F58}|Lw1w2V6J#+|RI2Bw87R(JkUw zFNIfl(O-Ak?7C&Sh75gys<~takNgUWpDhx2r?EwQFL>--o0*&PI!dpKIyu{q$F! z=O83`GrZj0NMQ_a;cto;!rvz-9F!IHNTvgCuMDkUYbQW}$aMnJQk@y>IDeF1^jl@i zq^%S2(1F7S6&e^@8HAFyFKk#Y=5dz^7gD*){z>N$)JDpbZzdxSTXgg2>7oAedWoG) zAucTF9xp9xRV4v@mCDa*LA)WPP}oe&7G>Zh_^X=H#6~iipvFD9Ayl}nLrGq*c~xv> zyM0{q!2TF69>BaX96f`j^mxdo`_vaPsO6p5Ey$MtN3=&MsP-<>({mqSIRE%0^UZ5* z9s70n+UV^-^Gwc5xwiVPU)i6_#R}2yOKD0fYOq^94%xCDP!o=+bTkm`- z=$`Re={4d-dFZ~ZJ?wU8BRU(MkAFFi;>tbukupm#7Ac*f_#g~>2pfz7O(y{J^w zC!lPo!lcUbm&p($42vu0_$eDMZ`WeOm^FGAzwj<{+^g{2cX=w4Q?1qdUn0BLj9n>= zhi7BUE3N8LdeLh>0Rd^0R%uP#ypPAf;*=chcnI>M1t2G*I>vv+FrK4vR3{HvAI@wnGL({!@^CjHy{s^-X zI88Y|y$=m}KbrlyC{K!9*Fyhqb)m8SJJS$PZ{F`tm#iW}-}6KW2dKC=&1*%GOLOc_#V3v*Fhn#kS#*o2I5^_6M=zCofgq0F%CPiJS3U@-nI<)# zC=>{^r@`d!Rb!*Iv?%o8I{y)Qya8m>Wedd`xp$tJl9_8?7s?2NDV~V*m-pD+Mt+7@ zTQ_NM#%gzFQp#}RifO7%!Pt?*PeYx|?a0rI8k2dSm4AaVUmyQ?HeZ}l!WtIiqu^1z ze#($Z3NiFY@BLuvtN#5vX0|_R;ZAjLnzC<@1WlpNZw(RXHS1zx2)ITAlmv)Cewg0R z^~^T^{=WcH1g-nOV~Jx))N#>jqX@o&l-gUCV)%O#cLiBluBrXiW{mL>CX?q&ZDhkE=NX zo`K6F2UyX57-|xEny!bZ-?8iGSfl6aNcX1f`U{a?Q!?|yKLsS^z7TkI@zIWpe*r(4 zTF;U_k$jOe=JbXUG5FO>WJ7+ZPE@9$Q zpb}}N&|KOM7fKIbz?!a6ISBXXg;o4%q$a_286!9nAI_;OkihDbV~JbyqQFFTSxL{@ zPt!EnItl%|cNxmuIQlWBtV6RWPZ#RZC(C&!{q;$-9Ed;RI@duMyK(r`f8SAZA?@S+ zaa4b#=h)M`u$?&Ed|wfDxUj{66txE!GTa{(b#Oo+`+#YwG9^kK4J$v3*YU^%i2PM^ zNs#D7*|+%72GAx}&weSU*$#CRksJ`gFXXAw;wQu6xIhP`D$kB3KUC$|w7`gq@{{Y`L;hyUW zA%rgxFa7gP0X4Ky90MBuRaVrCvcg;2i4Gu6pWPI?4VNIcxBmd2bnE@WRETB!SRqy$ zVNvu^L);Oyr^O!8`?dV3bs3{>s$v;Y*V334<4_>T08?9o=vBIRe+$E&zO}4Oho0&wJ;b`529*R6 zAo8I_nxm$^laVo4PfY>YmJn%rw+f$@#S$D1MZ-#P2J)jf+x7WX#{ertz3_j6LW zG$6jYxKucu#~ql}e}mY{GRn?FO2_Kd0vO|lpa=;&`uC=c#c#Vypmh>2yndB^0FNi0 zX^LAC01N{nnVZ;&zz%RJ$6{Ex7#vk~7eQ02P%%k3>)Nes4`MKWU&PZVpv#V<=|C|Q z{ok!J2;Bbg{V4#~Cyrb#8m4nkzQ;(YFNEA6{4kYBbxA!@nv~rfFmWv#? zksOGMO6AI(qLMhsEu!KU5b$^R{`|iGA;@dpH~00t9?$D)NZud&cK^p;#ejxOtF-nB z-KW9!U+N3+V#@_vm(9$z9B*6+(4DWLw&W$xMwIqkynZ<9#w&~8%{#5^RtAJk9#YEJ zKK&S4dlaLYK4H**a|`w`QInrRB#@0OM(rPw`{ZXRSIhPc=yuG zfv@Eu?t^7Gi2(WZrhfJ?6AIVVlMr5Yvl+}(=NsB(RpXENE|so4P<*-Cq-!T18%?_w>{RJvATxHDa;Z0@pxHOQD2FthG}V1oAzLJ>qi%f z$pW9E%0G_0cM$zo{|r#|r;1T>a-jlBaktcQS^*;YQ4i$FmV{#Bc8flzhdXlJqi6&6q zG#}bGoB==;J$F4f5rp>(Vgr^y&K^Xfhk`Js&Qr$!x?0w_2YCP#?m?VipDugP7Rs!D zC=I6t)NeVC0L|)4)?s@PtkoW5cn@+UZFH5zl7@27$F27u|DmziElhUYw*<=#fiYK@ zk_@a0odJNx_|WxAEnFzWOWfGZ*Aj#nBvMgA`-(t?J&1we2pxMsQwi;s) zffT<5+S?|!e*Ap|e-Cn9VE6>K$u39_a!w4O5?oDn_yB>z1t&+)_#&*esw@3bdk}E7 zkHBT&?*e$j9wgaND7KsSht}oDcY6@P-~;#x)8Sv-Q6Yl52Pq5Q{&4&XgSPN<+tTgy zXK8$$5(aw@A{Wu~NV)*%bLDts+UU?}l<9_00WJ?vdBI%Ynt!yFBSZ?$I-I2B; zU9$^3Oh1n?10&61%%^EjHaD~`V^;ern8FApQ(@DFg#uF;B0VkK2mGVy5{bof5?ic+ z)yU;N$nn?U!YP>cK-8CUXrJYpBub|czXv(HMQe!MdAze3nXU-DO^q&7p|0~qWVVWw z`{sl&vl)tpg*>wlTt9%F{ey-{&8kNU;g&579meJ!gk{ed-v(ZAvDb8ab`Z1t9`SY5 zEYSHwEnOFw-q?d|4Nx!wdBiHjO095V&`*v`>;E7*w@c#kJ?HiyBEkcE5Xgaz#=e;= zKmY7R%wxI_hD`hr9^_dOkZSycTfc-e0`?%#c=3h7Mzrt`wRC+7JI9a#@RJa8`=1vw zqj2b@++WSK- zV+Cr(XEOMf)D&>k3>N9rm{4yI5-(1{)Tw0IVqss?po+=Ok}$-gnZ@)XqEW5Kf5*Z9ajPiI`Wu9T4uw(pO>3gV8{hx_=R=&|30MSRYN%IU`%JFy1-lOqOrito7)YNA&ri;FTzRpuMg|-!> zTif+KsqE4V+QY9?YZkwzejQ$V+M1GyB+8)gL>Nd$HFe9!gu{7Z%*rrI?!w%+mJ;~ddoEWooz2_myDVyToy}W`3GAM z^lN^nH@Atw$`Bs68mmd6{(%o=U!8{Gd#L*5#X*eO%YW%7J+|U`{aPsoTp~LO#Um>v89B5 zjLF7&uc8A?qd-7AXHe4Ptji4u^e7Z0zudMhbk6-!|2OcWs(A|8OK8-+v8$(mnUI(6=73-DC78{QoY?rC;&GNmM<53(E}2#OEfFt1xE7;0a~B-TYoB6WN@!$ri{@^5Tuw0g=5)p35<_Z4vOhkAS}gIVxI^>_J&K#rKcYF@$S@~HAS9i> zT#vhSLH^{I5(}?W> zT&Z!3Zu=6K1v{C2q`^JC_+P@q69ePB_`$fmf{!VwJ9SHmlY5YVrO*3M2H_UPCJwFP zT7jzG1H`E8xIVwrnwFvyiO0Ti09)e}IXi9N1$uXy^AnOdsU-Vu(6=5Xs+TA<;yAIg z2=5k5%*XEdQ-X4V{M9|kOAcQn>H^v}{ehji&GWxG3pg-z%wQ`BDnE6!{$ z&~VOrgR_xL=9Q)%@5rvV9`6H#ZV!JNp7RMTH9{pdo&!`&F%z+@1?s@Ul${f}k{@7r z;n=l*Bny@Oc>p5u&Y-XV{6a)TB3FRaS>GA~Lsogc#=ZJ20Qr=kz6Xg0w(24kZvog( z|BFH-D*TrIbWJah&>!BVCYuEvRQ4dvp_rx}^U*Hrq&>)stx@_4phr9kuu>D{AvcC?nVW23b7$B*`&-Tk9*n4=TJQ1NeX%nziD z2Udr)J>d$f@tXdMlFTFK56K*tF+bz%g!fLGw~D7)HO^!=j+c{QLb2~Vt7op;GKY&r z@1A_|p?I+LVRq(~Z^`y)Rq;rrN10}ct#%YWS5#e_US(wAk5b8Fn)9FQ1Mx0ptARxlyRe}OKP*kj&q&xea=Tvhimm;#%*zFn%6FuwBY$!gwzoLADM^`6 zYB-MX6k5l<_(ZISpPOvV+~R$;yv9r?&7_VCNr&8?JIzeA-2Ix&1(Gzf?GbNkzx48S z7w{3ME32AT`U=S37rPftCY2r!Y(EGXKKM&#IkR&kLFRNRhHh?zyD=1$ZlC!i%S3}) z#i8sv1qV$!ZBtxRw6Lc;BzsckUtE3TjSDjy)k18NhL`Cn~FifEZh!)DOdRNOikjtS#9Bti9Y))} zjWri!=+D{wF0%x0G4r|nM%L@@*K3){obzmS2Gx<`xCcqY^jsfthRU~giM(?`xuE2{ zVQ-SGW4u+Z!c0{PJq~MeK!Rlj%3ZbLb^CU}NjdRhD;>defvb+4(teKl6y($U1k(U_Yz+~JpL zcksL^UV@rq1=B43!tb}*X^grzYFpHpsi1N*zqmIe$O+Mgc$P*H0ky&N|L&b)1mD`e z_au1-Nb1Yg?~bckh2L)u=lS>S#_AgxI-Hu3)U~o9@2a%nHqZX)e_c6+uH{<4t6sCB zw&7SvH3xDz9xUUDIvGKR1`NO&!Mx8d}(^~$^lP5d&AT;Sg z0J~ORBXqWW)HECcJy6p=BJP^Z0EGawozJVXQFyoypc+VoYpoq@S++x|$o;6KZf+)^ z5e|*W16j}2uOEu3FqS3hR7Lrqkf-L1tl?8}=YA8d_&rZ-MzCTxl)tqcwnWIo^x)r5 zdpJy-m-}Mc7~(gSl$7(L(z;mJz+NSSZi4I63QToQ{r?` z!q!pXoZekktlwYR5{9@_E@#~aY0%9aBL!>Zn=*I1ln-9%3i08(iAPbX;tCJG5tlD^oQ8Fa zcddKBZm6rNji2b`o!hzXgSk3P(_a5$9ryQ8Im@B<_qe*coEuDc^5Q0?72lBf{d%4E zLCsH7*UolYwf?B^Z_M&~=+vJHYw$R%;%Y6Dic@+WzMAQB!$kAFKvCEXh<^~|MT&Xy zfJWk|Ck=MbY9ZSoeoJ@6;=d`fqcTc)S?&ISw?~#~pU2t3$K=B&)BCI{-{6q3MmI0d zn)K!-Z#VS#<}V-cAH$Z8vX_8!YdRuRwFqeIlcCIEsS87Y-$;|q3O{k#I!dDC$Qqg& zZ)z(eDh2zPqNRLieqkXbD`%N3rK5{cv4*x6_62jSapUhruq+Kyt-^|^uhaK zQT6+|=R;tQukcbPDv#ibHrCtqChcZAd2sk>s4}XHkdxU|l6A-K=Pu6iH*W=G zDPYjBQ<&81^cNbHRw;9n3Rj5Z4#5=1fv3X0d`Cx05B#eO&^$aev?|=Fbe%2KlV19i!2qL z$P3-EPd&XKpQT644^l^7K41Fb8E~()d+mE!ve_+})dz*kJ{r#-`pjCG%hKbV3B=j% zG;_2cTYW6LAmX7y*OPHQDKVcGR|SdG08gtzQLBy{lnLA7u0y61(=9seD>c9^d+Dlh ziT~hUH1P>}@<2exl;V`6rR^%QwAsh+CaJc5O(iu&z8F=)1iYrERz@9bfVBH#u1(Qr zqEYW6j9rbVF#60tVJ z9jx*fG1y-hd2-L|?+x2YU0E&bUALUX2c9lo=v^=GP%S%SBH0^XbPJMa_f55W`N5Sx z)N0~!M){K`OpHW58{tZ^*;x}S+FmyE)a=YWHSKD7+*w=8_YQjiM125;CO8HL!HIgG z!)2xrzj&n?=yPO%GUU3aXL>5>M@PAA-LQY`eK!qDAFthCrIc4&^It|Ar4H*`T9|x5 zbvfb_@h3uSgS*lT#M3+cES_VvOnvOVAEcYn2jK9xQ}~|W(r#|toHP8d`y;h^?riW> zQHN&1w5VPDP$m;FR}Br&3i2}7B-Za(GDJ8E(B&#HRg6oO2zs_veDPbPlIN7-0A2BM zHE~#b?8AT7)PL>YY=DUgCFK!b}7>k)@?>(oAW{8+L!2?ER`QZiHbzctJA=hX5O(?!E)Ak-h#oEis(Ja z?V%~M8AV52+AV>pM@~&WntUPXK`&lb$8Ih-oE514#~S?ev5KJn*!WE8t4y3+;10NuU=NrHrr~DL^$FI6r?FxAeK)wW4Fd(KS`#O{%TzU&Z>P#PUTbB$uu4`N z>)fj|!+B7n##^P*-}IoF#y3B;RVNj`${)XKE2(y*qMtt6TD>fri(4~NIu*}H%J1w! z^a7*@BSq_0(qz(ZfTS*sI*=SFtmbZ0eDMM`peM4FXFruz2o(T6>_zC;PD>t(YPJQh z-`YY6Ph^GFa(7~P>s4;JG5bKax}PWAn@?nUH(B;k>)G?A)M(2MVOYY%M2ZR*PevH? zpuM97S~~z-j~tmHVP!_eZY;AG4JgsxjA5Z!uYUG!2t57z&$or4F|W09l7T`lQz%`u z{D;IFGhrCOOI!eMS@PJ6lrF*#`YsP}jvz0W7Y)Q9R@=cWZ~q=-u?WLwbBTKplHnfY zvoeVRSd{ie;D*P8v_7O20zwK$_=0#>SijBJHK44bjB>ntQGICm6KM;-R|4e zj0Gnyq;df(J_Wc18HjPt1XFOtnzXRwe^c9zuAl*Uqx8bAfMszQ+Q$K|vmGc*72@)& zGTd{Cmet9R0Jhm?bQoX76V0f6)s!QCAc6@)rk^3y!fRQtf6Q$XiwJn8i-5?lao zVBZj4AD}svT*&1cydZHuS#ePFBABlLZIqwBOEC(s4XIn96baq4mKiIU^q*5Ofyf4~n^J7XPZH^B#P87eAVp0+JNzhBbm$)B2P{%C z(Q;)EGV|pXXb@Z%p7Cp9uL8M8)zseNx#Pk+T!!V>0ZcEu_xc{>nYHEa@Ol#9dqJ+< z2kYKy32X@-X@!OjZ^XABt{M{_Pd~T^`G-G6o3iwluggB~c``qJ>d}wrYvO)g%Fp9} zv$S)EJlUChi#uy%oossD!W#1=i46FhdaL-wR(|sA7xm29?t!?+8OiG=()qx#r^!F5 zQ`wS=?WrlZgxyC?M}A3NSu>G62yemHi~b9@_zJlG^44HA9F`*Lj#DOh)^WpbD^o4u zNl3Cou{N)YON-fHx;sS6mnPdFb&mL;>DT_Nb}0>I_E_QPBSZ%@(V9KR_G|i?-%#>x z!BXEMNQ#Qu+se08@(vp~h+VqyN@LwM<4Gjyem*JD88vPl>+6%IZb3KcO5F~s59|ja z%o}dBL4N7u;vTb+-Z5Gem@&3OlZHp(((e%@#8Ur{@%`;-Ja#mCVA_=PIUm7EA2=_5 z`?tht!IAsR4Xy7>6!lT=sl+TT4!PWoylFS3ZF_vSOAqs0S)%1_cJaa{%`Od&p%DBQ zR=>wc^=c0IVbv=0y1C<5p_(N(Y-ZygrW2E6s-DjWro7>}>_HAlWqM91a;yp*Q0eZ; zqM-XQB&oG*sJSe*qHSg=`#~0i%L7Av+NfJ z@&kD!v{`d~dX_`CPjKSxRpTg3`BNgwM{Pv4Ty;e@)@k)AP3qpMTAiNT6bv{fK{Owb%8-os2Q+N)Ta9jG*Y%Kx;#`QSh)l6asn-q&>oJO)<6A8 zVyC56F2XttsfB%B6>MoTyo}SXv4fFb7^oUf9nHwFJU$j2)MDH$78Gh3l{y}-ScXjF z>DHw96*?|LU26JOxk_Dc`W#e{>&z!_r>!V~G%#~`It5TI=n={HON$Coi{LZPt*tMJ z(6BSnxjV+GYMsy}*9}2Q0UG&+`Qxn6l$XO-s~tx)d+y#RRu4pe2Hn+1X5pBXY4V`z zQ>|Em9Z1&Bd)y~uTM~;oubmy?zNWquEt(u1-AackM0!rFn-f(ojAPa7HDer6Ve%f>jY!+L%D-K3ugNy0WxcYkKA>68 z$~isL`Et5drY6B$S$-m>?9_-^$mekN@Xr3mCi|D_dh#yMTU;tM8_N%hS|*<~54RcR zpsYh{2XO`tcW~INNf==1-$>#RMqgAfw@IYXy^ywSLVUNDx4_g;2#i&PV&n~-3IcO{cG0>wQIK`{&4&QQ8 z2X<{M?j@UL-~15taZT@5I8Au6?hPMkmJOUxpyIW_d)=wKOZF1F?3F>-$Z47p83#K} zsUIpJe__4nXQlIN45sDUu9DB)6~9xaVEp^^-SeiWV|NNo2EPnXbl!-uDIJKzBW;>p z^1?b0YatDzA^D_io#A4*m*`3C3ycB2-|51qazD2s=ah z!QhSTz#})k?y6ZtVu4BQ3?Q)00I-`&+dy~r&PJV4oF5p6vA|vSz=z{!<(PfbLNLr) zvHy@*HKX!{i0&|-R*09O8mPRCix#1o&}@oIXs8*>SOq#qWc zFT(wu!QCERPmA1x1TaInf^ndwzPywj`mO7y3In8?UJT?{H~Is#acTp)j__+Ew2!+9 z%{n0Qv5QLJ&TmLI)=vGSIhDru696p$uf!3Is0@nC_&1CN9-HB!aK19wQTIWf!&7u?`&NrSDM+Xim^;a z;Ggw1P!4j(1@n2~Y8B$bE5!OYI-|^d%Zm$m*^ImdZFlY;ZX1~wp6N9<>zaqW$3?=f z=Vr{c*gTlHbw|b2n}wK76f}-;PiXf*tJZ^zP7$Am3!ZD4lso{Owr1-CXJ-rO78A4r z7W=4fofaxr9))u6ucB zi^@Bi+@wb3y36rs9q9WCQ8+B=dBGB{n@!MQ?u5fe9T7RM?R1d6y&&Q*A3n9Vq^731 z6>~^T?xFWK`3X>8n`NB+T2M4)6QtcCL%(v==W^=CM>gHQgl<36;FO)#&uCoArm?=Q z`cQp}@q=jdQv7sh`DhhzIt*Ddu&o!gU9>7pEEV=TD-I_Kh}hr5HHWGRFKc!V`+w=A zcUd+jnyg7C|8gc56%wvf&barn^<-3d?8Bxfx=%`y`~j8`dP1iPeyXOF5Y|*v!BdE; ztLo$=@3+jl^{Bq$^OWSWv`0eeF->tp&#A?~O2~A*YCE0=cVI2Mw&_<6J}>Jrmm zPi-pxXxs3>7iXK=M6*E^;?eIS?_eR;bIr@!K}WARJTbwYy4d3Z8(R-D*SDoe8?c;t zc|3}47hs1;a(8f=qKtmL5vLh~_Z-T)8Fr49J5#!}SUT>kxL6K2MV?rL_r-+YoD{hJ zSxKETcQme~L8~A4lm+>C)m(RKb9<$5)K8}QN{Z>(eUP}5Cj-lUpFd^?^5mMbmg-d- zw_u<+kD4j8@XJ&3dCu%8*7fb^Tp3$rY7+wofL^+?w0XGNYI_V3E6(v)*?i^BcFEJc^mRe%#W?_CsxuaP1Np1#Imhz)U`arnxq~+0(;AE3$ zKvzrNXU6Yhiz?<%8#?+-H+upZ$0pw)K{w5_%)F1dIlz2!}5=vm(#HlDa*`LR=xuz_)k=5i`!!Gr91RCqgsl=_O?8O+9r|bp%L}%B%ZO74w26+{cHsRUf&39YB zR>bIsn*_PwW5dX2<){~FM9W{zuGZ|VGD+I~OgiHQ@sI?4y^W5VEHs-pd`df};`ev) zVHnc@X=37uU#-<#&O_FeXEn|?#ruw$`;RuQ@Kj?7U1$V3{CGbAR^I4iM7IYku)~-hdHtm< zj(2Ln<;)N#OgA05nE7-C?-rp-+8mcQ13qgsSWT<_hmej`753QC>=P%=L))ZZHl2LA zc--AZjHI3JzX8Nn9RI|9N<4}(znyn`j^XJe!(JaUmU&TCs)VGg+%#Ndi&s+NlDXp~ zXjX%3S7hOf&vQ3IEaGjQZzxgYGU2d?QK8>a#L{@}itE`)bCErbmy?A_k;hOEIJzyN z(Rg%3F};cGA@&dNY1(P?-wHK@0&lhA2Vh^9y$2k|k-!7PtE}Huwx6Ais(WksZSqRd zhAg$JrnrrjQi?~T$WPPhJZ$1>n|i^1Nu`R+<(JQ|@spChd~vV@rMDj%7wR6CzIYx| zR%b(}=ULA7(KkL{3s#smAovu1`iPXeUR|?>j>#2$B{v9rM7+}WhwkVDQufLpA$H_* zpKeH%@1p?KIh~9~Ba8EkQ^Z&>OEf{DwV?R*V>YNC<8pEex7*XI@@#JoU{J~>uM>uC zmNx4)o`5BNpqSz9LB4@6SVcR62+2Lj3CsX$&eIswK|4F3WRjKM1Vb$;Xg!Uq%e<>b z;ecNdL>SLIbnv_=1ltk3eR)*6k2w|K3xXGoiT@s88wDk9@(i z-fw+46u<()+P>Nz2&x&>JU?sNLj8-;j=azSE}+ibxu$gqq*wDaRze%ykx^Q``D_qWzyCW~F&lB8r(uzlcg3Zt`Lutp5f-YEo7{ye<&L)hU^KOxYE zu)0qqZE-M#7@5c5#A+M7&95Ka%hWgL`8?oXaJSX~ZEIeDa3QdG>q2~8;hCRm$sjLB z_&}h>(dE}94KTXN3tH;}@jZx_kkiy>U-~O$9@@oC3{TiP4wf*0Hk*(*lDNqpprg1@ z`3&GYE!z2i!l+Sz6x|pt-E9h_JKOzKMc|rQiQo~xxs5OY%_MFRj8#{BtnrpVs6?3y zfQZ*`kzyerTcLfI)^Ho$gUBaxkAOO-i`(x{LLSTwS`Xs?|GEPgFdi}KzB5Mwqws?b z5YntIs*(wf2Pmz30OTLWhReLPGj`dky8+u1i9azu-uM@B^Wz>wcT9LEO|1xO6wWi`xG%C+fJ=g#xNaU;wD}K62>J;+zI95IE@1ytHYehNZF2h=8Q zrY&u&`+F`1=mw%LOd#SY-3I6g2EKJ8qJ0sXrQF13yGqXof{aND7q)V+A9@f-JqlN_ zq4>u7>9<_|Y8v>;?PY!L$|XvmsA@{*>-#C65B?=Huc0*do#8PMe}%id(Ey(Grx4qE z!B@UzOSfODL4ugtpQ>W(@Iv?o+#s#+$#!GfT_)qVV65e6zM=Z~Xgl&W+|s8;`&op; zz6V+5v~@P(oq3z(~-dN#03oS2|(+5@Fqkk<*Y^DxFF^og`T zIcHQaNmw)&k5Vms<(g(Ob#VsIY`#XUjkP8o{ zFLt#^p!6c2i0$0c%s&6k8!hYMF{sJ)NIa^U5Qe+cm8Dxyvq%Y~NCl|fn;yZA-uUxR zpWvt3@`^=|uWh0}8w`CYX~jgys4Ulq`3uM(heUGzd&o)I)d2X%20cigWoW(gn91cJ z`wgin2ST`vkJ^huQiAcD$PSe$W`)}qvXb7+pHJ>czwgzEv(1_+qX*je6B(FK!Uw&< z-ez$cu)w%$54wH)ie;CzENtgtQHSycBYOI<->u`UXRO~or780M`$0L02o4Fq>mrxV z45Zzf$dlC;a|OC;(tG>y{w&?sQol%6yU{vOQ*i^;Z)O-L8$vLy<(w|qEu)MwlcM1BUkpT|9aH)z2mKX^gfolv&7A)} z^MsUqR6QnI4^_x)Iz9NfKY$!Bzn1fiZS_nJAcp-5cyz?>%pX#9Y~rCrb@CRLX}!Zi z`j0#_iTwsO%R4M;>9T7ZVUC98i=fw3o7?C{BoHf0acI`V7uTSPe8f>y)6M#RJ*~n~ zuRX|WcKEF|Bf=Eo)r4Nyans4Gd=r-+<~mdH&m%9V(jKjf#1iKQ{Gn$*w{e{^-vThx zBi9~;^{S9@L5j-6Af)^_wO_+hMXH`z4Xl_IlyY)gQ2II zf`?Ymy1z5m>2mGc0KQD61b#>^VfA*-sG@7ZsG>;t4((ra>d0&N8mrKFTib$_(IJ>X zG>aF4w`0OsHk54jrKakldj9JuCF{8JEw`06X49&-ADJFm&oj?otRE8Bvh~?^tYn>S?IPWwmcfcdZvC3u~&j76kqzv?*eBB9WAqW|4LLY(X1X zf+GAC0OH-p_aKD!`9b%%hk)e|Z=?u7H+Vd0)*lid|L4_3+>)>tQp&S-1NJ+g z`>B+g2LrW^uTXT*p{V}tFs(cZA%#F=uMfsJO=E==kpFz!;ccaYg)R)$Y!v3pAcdg1 z!r<9NqV5_g)`2yppm@v?h|F4B1D3qyro@t^omh4;$ewP32Ic%4T3pOg?TesU2Nv^= zznuC<%LRPR5ktOwtF$gN6KTDDC^2=x+8|+DPcBkQ}aD#%9?rn{=x$%D4o+Q zqhX~Q+`^WtPjH!Y7HUt8KVs}Xt#PK(0h7uA3hn%2U_x|Qrm6{ilT$ zMT!Q*7OSM295ZY_o9_PR5_0Uosrt&qH_0h}3Oe0_xtettVy>oseKE0Tb<5hE>`S*` z2ZSlJ(8*S0d$YiZAT)jfW*aNlShhae{kr{EpAtB}j1=i)uB?9fo?Z?8jdoAPr*7a3 zHv{go?d$h2&_czFP)Wqo;18E^gc5z2XdWhDTt8BIq$VXhwnxP~d7SLX>^sic9zZnt>+dwBK{NW|Ni{H!7D|GF*nz)3)^G}^ zMmhMocvnw+!`%RF!Ud}~vY5KK-N?BI3=jF0y7IQG{=^)&^j`e!No45eM@X zdfS=*df{tI6Pht_Ti5e2RPerYxGY}-Xz}g&%wV)NU16PyAPw01@F#XPB*J_uY2`Ry0&1f za$m*k$8l8`;bX5Jc^n1`&l%F~!c@ZGa^<8zhHZpolSQF6%QlJCYECLta{nO-I6h<9EC$s;-?<0CqONgPM-9=Nn& z^Oy!(eTnh|20|2|FV zf24-rEOM6I2bkp3_;MeDE55FFH(iP~T9baJC4JIik$xn9m6Q0$5qb)_Ev{2jsV7c1 z$jN8j^4EEQxl)p3?K^9Nelkl#FXNWwA`{e`7>%}g4W`e!iM=e`Z|x+T5EFh z5y(=1SF>H^QoX|ua#e=NE%$HUi8?BFEMNUi?eBkF%rcki&}0MV{;Zww7^@(=dNK@& zVd`Tifgx_+%SdGay}*;~NV(+k;!kp_wAN)yod^G3R91V}>$+~<@?!tf-nEyvbu)F2 ztsU7VZx0KRA&YFzMEgA?vz*n)TgETX*Haik1La3H@=k7@Pjz8sW~$Izl?FnaU0`tshBbdaCGn_Nz6=4-kKIpZ3z_K3e4g8;gCq0&}D<8NSrt9c}fl+FziuBL6VxTX_nTxQON z@9kiN$mp0v4|zw}zyrhRo!I_9wh$1CxtR=AHaaR!vvuaz-wRU7em2H z2)o69hMpmS4MD{2^lu=jfN_z8f`P^A)DNh;I$((n_|FC}(qE9a1fk`Lws{f=+E#g1 zD6XVlb1H*D;AnAR{e9$%ZquXJ3_!5te1#l#ly!aFqbj2MN$qC{qeX8aC1XdqW< zrVRg^@p}(wfPwsx#ZPp;vLAM?{wD#l;>7echO)tC!xzi^F0=6y44Ng!gOS%i>Sv+& z69|P$GavlaHEQe3jSBE!pzVFa3AnxOPWre1D{I=_xQ|-nlO1PE;I6@q@xg9j<7b_a z^6mq;glwz=j+78D0eWwvJiv;VPz{J!Qu-)cg=6tIeku&m1+^OG_RWKv-L+#@Z8pB= zSk3JcxO~*2_b#-V--i{^83+2N4f)tf;a^f7yOjAgT#sNR;*;veg5pi!Re0LsK5jOH z0G?l(PG-}>KTXJ;JxEjh1qP@WI{rX_EiX`E#0l znTQauU&NeiJR9({=~75zg6+H|lr*8`9^}`9Ax$i>86_LD2K+#*9`qOybXzI>Uk4>t zgDu-+xj|xa4k0u~K{&{=>JiL?K!~s*-J?d?yxYJC1dl3S79?OBh?!>-Nd7YSyOmm< zG+>2Y%OTR$sPBQ-g9sE)3!Lchv@z)-@Y-1cwoG}7Zem&op-x!3E)M#NLEwd9_4mxH z@sA22SGbf+HK7M)5|yKQ63M6!DI8Q&lb8zp^4)OXU8S>aC!V~?xq7hk+JXhO4R&kIX!06>lN!o2xr&();F;W5XWNf)^`)T1(2}7>*^^0Bgc~6h7hh#kTvVo;nPbIxg>c<@< zaL8y5ITF!xUPo++p_UXsK*?fYop-}JgLw?|f${?*wa7!i*Tuh)xHe$}yj)#L^SQ3~ z-%inY_t?HehcEh6^9g8SXb@{hD>7B-ZOI)|D_?UwY_^JqXP7BtybE!`((O717y23Y zRkgPgvZ*Grf!@(bl^pWl2ddL7zIJ{ySMO-Ltwl?JZYJ^T8%NUsuW)r!Q)PHf{}!v1 zFOu_Vt~N$<+JtDG>CVjo2wFHr=j$1)9@PL9YCPV(?{goWG==6vt1a8o$fTaFZF27T zKV`>$lV2@Qcx}G^{DH&`{P&^u#U1?+D^!s@UW<=|}c zyz{Knms`5zhUU}Oecn}}Ui48jxormjT$ebfr~kou zBE{*Nl;`W;d~s=VZ~3+5!9zaQ@hdnFx$>RB&`4+FnF-Y?kAJ7=QoR>?n@s*GTK2EY zOX!}&uMi6@Q(2fm8d8VnQp_Q$u%AmvfA3;Ml<+*KYF|2f_1C>G^n4QVM#KtJIboMF z*R}_lh!U|X8t|P3%$++;wiu3#e#i9+Zny@z29cP=zjMyWxssnfce7o8TyO`$xU6i?=-&mhJa?bB;5&Jczikur_F_#!T&$1-aC-3#f=-+eLHnf zMOz*AY?Y#lE|e6tD=E3HDv?HNZ>Nj4X2nSD77;6QjZg{FQWQmrBsD^f*u)+Yx$n{5 z@B99Ke~RNcC*eHLXFU(CTa$!DI_1O^dO3GERhihz-2v{b%wMHEEU%ykiLU(oC6!avb+Qyg&hK7lT-DdoK=;*I4hsr{0PD)X0;m*7ftd!FZriW! zqQp-8%lp)xMzOTk)ZH$Ts;v7rYD6o#s))*G_5)E`qcN>5H}Ywy(YS;e`B*eLVHr&z zqHSvuyH@1=sI@|J&8B{1!5<+94a$0LI+xrnb28u|Pi;)wR;a|Fzrfpc@WZTr6>}PB zY=6TIqkj0=7Ulno^SX1=C)uVL={EDUoQn;2!_-;D-AVRm!y=Hu=Wlo2k(lS?HcAcx zsJER6dtK-L=H@9Ji@g9Vpb!L~xAQ#H0=%DAsV6Y&OrORBWtU`(=(xZlS50|UqJFDk z|EsBoGP{(dZuqQHGbMKVDSYnVIoA+{^MmV`&-sRyMI2OZZdTB?qLnEq=$sn}s7Iqc z5=)^sj-ERaw_+sG8vH%o8PmtKjGo>$S|6T4Az6{rVrM$g_eq!Zfswc1v>K`B#0g5ckQ$1*|ZACMeIQ5NRys;5PhLaaJ_#NIdVENSh z_OHMdeG#zF;B7dsiwV%e+)}|VVv$C}8=HWCZ+xn9GVH1Pxs)vyBA6_exH`c{|0`e= z0_>+(f2O~1dkwz6)c&ckm%6+OYxSkOe5Qy0KE))ULyoD9H3yrS(&>%yRkh5F0q}yj z{Oar6A1;XljExCG6@z7+toCc`s!sy`qaRuJnHgP zIW?}Er*c>QA@+H@8L+q}@vngOO+J+{)34p=rMA4h0dfWFMb&}H?^?m04D5D*@YkE( zJYzn!1>VFF$x{Ct`(djK(R)9f`ynJaWR^PCi$IoMKKuLDmZl9)xhQaXK>L`e|E2#r zCiahcP!KGl&he2&Q+gZf7j1D#I5XUa?u48OQzuJrrLCcvdHMGa6}2bOe$uC}AW z_LFdX2k`qFT>}1pdX_YhHiiI|;1}0W z^k6Wd3%|6P#RbU`kkH3OfTm~?7g)~Snc+gs_*dY`X*6}Kdl3>$SdQrfZ@ai3O$I-- zhG#}T$)JcBc72pP!vjD6O)tSQ^~n^FC;4*;%hz5ok(_}1(bckBJz;ltT8N&QtE z^rwf}<~ASGVn$mAr)2OmHeL51y#P7HI`Nyi$|s(OUhQ+(^WPm;Ag=WI-mn(t zcAZSyiJRUfYSDl~>en+eZ96aMTI5}mJTRaU841|PSE$cs<0Xu0H5{;zv0z`l^dRF} zQqr(vOE&9(et)MWo~T6N*n3Q_A{5*L(_iD^thG|JuJhFLK=CLgscK8j@WCRhFxz`` z%@HG?JFb7hSn%)oUwnS=%A}C1L2HE@#D4NuCI^q1par7Vs;r=h`aA=aLOD@b$tKwz zKsyn*1wWUM3~GFe`(9Rgv_2@Yq=o;^v5HjXs94z1TzJZ9;Rx05UAD#Lhes~Y9~s5H zF;0$h*_iiW#~HV3+v(8QKI?8XK317HP-T)q!f&yrXV6%DFt=42Wc|CBB2o$py283o zPu)!#4(liyyZs_1Db{YRvi2e}JL(-k-uZq#@&sqa(LzpPfW^#Nt!8D|b`JU*T9?Gx znAAj6n6P-9%sV{MO#&$%{McgF@cUXv-xR6ICf_iUimT&3wu)n^ihTHT-|?ljpM6=S zO)?Cn&Y>_?8Dq<Bo!dp*Cy zij=G}P04tZhX@o&Tre%w4gK(b^o_wrb4h7-cx-7f)1x@+NLqhUQ$Gj3rpFA9X}S6& z9$-8vm(z8My^B?!?(yS+zRU`nrPUhesqZh%OE7Cjh-~|aR#Q-Auq*0kmAT-;wfdV+ zd^pR-7&#(lcf65`)`~O-lICT-U#H55VLe{gWVzW(rY%>OLziok3&yFZQ)isKv&DSN z%Wc@zEAAx_7{x9L43~XGJ>IzArJ}BlGVXEQhlo|`vY7xxZH;C|{EN=Q^gmzwA?u&$ ze;`cv7SuS|+@!nK-WQTZo^mT_&mDF!L*`UskcN^oflxDu6b>LOT%uQL4MQ4g=Cz}a z`<*XNW*n3ro59+;-)}sghLCD0ixW=Qd`M09dxUYa*0tNSe{bz8D_s62Yqi5c!*~MP z60FosDt5ywWz<_38D+C)Nwe9r%c~DFoCABte^r^y?`a@p*JKPUDNL_$ygd)H+pr!h z7SIV>mxXgUF0lDg`Rs+JotDPR$1jTC=09?^vl-1Z$b1^%s^U8_*2#fT6KlstUs)yA ztfaOlch-a>dox9>n%*x8(=l4(9D1 zN~6)2N@skShMgNrvp$xs*(ugf*NkUv$|eU9mD-%|6Q5)xJB=u$ESs(`_CP0)y~&fz zfPmgW(W}iz;t~`O?M}_8m+gor2R0et?CKII6HU&6-8#1I148_Bep&ZK0&X!Y&I!)^ zh4RWx`c+<1MlqNA>{mFGsHFZ_wV}Cw$YS(K74Y7ZB8Qi4FkMJ7Y15W+Mk!H=MPb73 zbYzodfsI3x2la9M1AT2)$YgSqdI%5eyL>fdRtauX^MhDlVy{0^cZ%L3znR)|)5+~` zi(*afQsfbz^LyM?4}2rsFL9OcYlYj3SNBrkdYBHejyw@c4Ou2@>J*`%Jn?GX(32Ga zaO*ht4^>1-sikm6DE(n3bRGL;$D!vDP22XIEtQXnO^W^`+cc!J)Jb+X(JqiP=C1P* z+>n&d?|mcNo*r32CPqu2h*%h}DH?n;>c*gMTz$gT5Dx6twb0rG%jiH?fUoduM(2L+ z%tsHct(uuT#ktmc;xRZpfLFP+q*DXLr|`@9#7?db`FX*CfiWIGYhG9hB>x#HZt0kg z4PF;>2Fz(3kJAIs|Koy-ekYoqt(8xMublti@Di5 zVPU&G252vHI+5QQFVG;3qW5v^F94-*GgTeYpOI1MHff zY?W`Im&w}$DqxR55@|g( z55DuRBGRh6#-)wgi>*_3VV&H;($5FJ zcY-a(pNUwGRRaKMdL|gE@{>Ws${z6{g)$oY$?|ao-FbVPVTEGJEsc|X2b>in&d9K( zUhMkiHGk;}I$izD^q9C8s`=2Ab2qNPX)**k1njmusV{b~$f`GI!h{0-;bxBBV5At; zL^Pf6RFgQ2Oun@e5ZcO^vIIl57HA` z%Umio_eC~Mx%K+!r51Oc!)e|)Sz-~?tRtC7c8e>a>$nw_8B+b6;a%zd?40Xr%E!mQ z0Isu-RM9?qRq&*wZQ>6HDkU_V?hc)F?C|OK_L=C`Tb%S;K5Aj45p3yEV!H_IUS{F@ zNLjpVonFU$dNO*SD2pMSUer#t8bl+69mHR{OQzd)f515PsWzWFt?}gTaf-dLpHxC?Zw7m;hp4$Y<#B zd1bN>7C$j^G(WuFfgb92b+@Bv`$|rdToZCx0y1SBR-ib_>P85XpWXI zC0A@TXban@GPCfS6y~z09Qd zu;Yl4U+r>MNrBx6+%lc|gC#M1aJEu853dtiomzb9-V3EuMUUU!NUXBkfAm1_3vAr# zt3;39r}Pd3q3J9WwXRuCfiEzPDS<7MD^m2N^G@Hw$stfscHnxq_DtYX2(A@o%_yw8 z?o8-0#2e)p|M=PZB(@nVclz7;7bt_5i4MhP4fuYFjm%2$hH;k6{PfZ1ze3Uy-*kh8AeGJGXf9_~HoY5LP zdsJXwt5#=?jPtv(iD%(b)k7$~pa?-TE&K3kFXqGv)kZ_0`3 z3{V=E+fPo?{E((JqGbBi9UAU(DYUm9DXyOlH_l!8^_QOiNy~4M=MoN!n_obNntWaD z!X5IJ{e-v73@EQmp#nB32p7i2ldeEJmkQGQv4KEvaFuUS4=Lxh_28#MhuUG&GMIH( z=cK+-HG(TqJX}L~sdlAFplT z)Vyfc5ys9JQn65dyZ6e%uGS!9Gb1e5Xy?^24P?ZSEX~RRb$oD?;o$Vl)60LSY&jA1m>);+ z_@$cJ77*D7_Mdt3Ta{SnaZkGfgVbNJMSG3tXRdX6zth05#Z&SQROZ;I`X=0oi!3LL zz1vb7_yIoWqsziU7_;uf!CRC2uYmQ}gfqbhWsttpT_AV0XKA1ULSl46?=%0940C*Y zL7|K>8h3z}--|+oP-F0hOq0`7o;F)=L*P8GaYzn;hDgkvZXa}1fAAZp^MeJ|Rk$;J zAA6g5mdl>Ofh7KqO}*NhXuib;wKe@<#zF`%s`33_0T(`ywZ2dJUx5S;3rN`rFQX>v zWsKH+m+03cm|dEt&Pg7}E*Q?jM?s~*5Ty0@X;oqQyI-^yiZtOsngX7@{--e8F8nLd zoH2J33)b2T{}pQ$P;pMs`}JA{lotM81bR00xLv7LAOybz5Qk1uK}g>8vK7SNNDz!q zS+TZ;WW^)^3LBvE@xQ}=PtFR(E>Njpph{3`fl=)MK9KhRF?;gCUuS=#9}Pl^}X64FID5d@TT13k>nv$_wo} zn%>l^ys#F5+PSl(!y^@}E^)Fc4^|5R2aibq34;(0U&d)us zd@R-WvU~<9yK^mz)6ipIkD?9P+85CRPlq60gz4>q2}-88dxUaLWY9G;L2W9v{qmKc zNEMwx(JWM<07-MJii+?&-uo(iSkxx$?^BLJCpF*gsPyRHUgqRYV7f)m$D_g(*B2UkwzDBAe0Uh(>dQBTh#p8R2^L%C(nI(LiwGfp#f z1Vxf?$@^5ke!8l!0#URvzBKcr>8=~;ikb)&Y95(Mlm%xqCGYoZfFHGS(m}weesN#>&s=kSZ9jjAlz&~+$x*nPpXKh3KH`0k&dWWmxtf0_IHf$2;ksh$8$5%q z`?y&b`!`VPaUZ{JWiBb?P~<8DCx6)533)j+-_y8lg$zMTkTZ(eq?ngr${75^b@jZ7 z&P_AeKVxQFT=_y)x+Kn$zN}=>3~>Kr(5^l zeKzl)OW%+wC^di^etuHDzhg9Ym_jf8ZM%=WJVYiE}q>v1t>51HE6?h zEM`wB4>i7OLhK+oAX z_2>GPIqI0lM@x;Amuk;{*jX@RAS`1I4VfHGAePW4K%?$FyeI zre+o``z$V^=clTPgf>KjsVOrMx-sG0nmHAS^c^qr=Z<~No-4;I^{`@!`|5Um3YBV7 z2|gKXq-OED7P$1XqGkW+(UUK}6kF~)&2VU)$Qr<5x)qRKn12P74o(l{TPBc-U?fiG2iuawOqVK*n`Y;G{ z@wgk_{y7+oZA2%3d5OU=Ws&XF%k!0rZ0Ix26u>6}XyPDyRxXhQPr@gBEM0eB6pkW9 zn(tTrI~qxOe&)%I)nkdOjdF*@lM-dWTV8z{Clom<54H3mrKXT65Lo|IPDOBFUuTpA zQr!f)5JzE?qh>jhShT;C@1rs^!{O6X^Qp`Uq;EmH9JwksGQh(@asFP0LQu2BW2sn4 zKY9{y;aR2CBk^lk*)OEstl@bhJ6%w+LI&GVw5Nk}ZYCO&yiFs6f7(?ps0X$f7Idhk zulm?lSmJ-2yUdVnKM@XlArmXG@jU*o%)bRTVs{?cvtKR_eV>Vcji1ib56%nhT#TCt znXuFDUn!Xc%pUm(PEVJI?xy+;t{``oZHnKVV-b=oFe{5L0YOjz$}(==?p71lFM9I89{rfG+HkKk zlU?j?jSvD48#vL+u9)Ago7sxAX*4|=eO@@ceptTUCZ)kP&%r!`Ve=|qtpd@%(nqH) zzg5XOd}|KY>VB^Oc;ES(=RWCL>e{G>Ur+FM*2YF|*PJdS3VZvc5xXy^_&|dh1HrLh zuDD$RSQG~p0#O|02IlQTY_&HX?HNNqq%sUOd`f@buRL!4Inno6&&Pc&8y%7O?;YQ+ z7GIG3AoaXRuaeU_1txk@;~$vVM7lydp~kC5O)kAQ&}AEx8|RTHWZ1-SBKFH6ytf*c z7MyM(J=qZyyT9b7<5hiD)Q{v#o?sa8eB^dORPyc}Z&Nk4dEo8qH$>vnW@K{m%E0)% zeUa~#!xjl~#(N>js^xhbtj(!145@cnZY^2KvhFG3a-#2bf|9o^!{yxWAzA- zLP?dYX0%G_2P<^!!$_mE3OW1CUl7bIra{A2@2GizD{GppQxSO2on186mQfb(+uaO6 z{M*b*88ZU~C@F+;$a$muz8q}8IQEKq_KT4>KJfPQ#>G7_xPjz*w=$MWH&*^?<*8)# zce?$_#`_kbl}!d$96F2^jdYfS)oWrHy7|B2XR_H@^m;^r4P*#bV6TpxjPt?g*Ij|N z=5L0>_DkL>k0PA5tN$FX9tL|`kppx)cqiO)f1h>y%dw|^5xT0$uln-J)0X3UVL9=E zn;SYtcvDk3%dxQpj&n1?H`_WrwMYY7lo;Rkb`ZtXFJSbzCbL#5C+;?bqUVU2vjJQ^yXTwdYsK473i@W{XK@vE9V-c1+0{S20_^`4P(gB8 zzAV^^>5)OMRi*0{W3>s*W|IPPf=xMvrEQo3(X2Oo9D{QNUCKjxUqQ>|vI=p`8~oo? zQJzBEQ}3wMtE?}rp6<`$C4mB=7g%OqZ|7}25B2T?cY%g?Viy4u5IxLfuzQ|^zM(nw z;*UbVX~A!sg6HQxWK-3t>jcYbMvN(LZ4|^fD@$An-0ldz1b$#_v3UTi2{12#r2n}QcUxQ_p_-hpgx#_T%yT#G!5t;cQQAyAv zgxD%@XOIYQV4@s#&;q^eT zt5y|UzBWj}E>tf$f+TCmsi=F-6LB-3cYR){S|^0l*s9Y>_Pwchl=nxAbeJDTvVsTZ z4Ax(H_kg<)o}x$M`p4UDYsD?2G81vuyXFqBYIv$Ir%q8#tM8`WAC zxkOO~y+sG-I=#bBc-QAjCZy`H8mfMosJc@_F$J@v8w zyhYG`{k=3~k^(i%y}S1@HPPN5+%++;$rtv^Bdf_ZSmd>8HW^>=G4V8BaP2EHNBPFh z_O9s-0b_5~GfpGRLx(OR7}s#2g?}Fo?H%=hnl&o^M*N>X%(Y#@T9uFZGJwwVI$wtQ zv|aG-x2K)9))%dpiPp*yE`~%%3j}VW*b9RF?#8-{6Fnqq__C(s@nrcv{hWwrAKjL_ z2?w5@ux^m#H$g(X9yzUl__VQ2Zz{3kmDbXDA<&#5MBLtzemW;yTr0}Es#LF27af6~fh($It4>rWOZMRG>>X6?Q`hL*qHv8(p@ zmv5SjA`hIuBxHXfWYXnWDn3wB=^`D~&s@LH+a7%|&s085*QVxp@`4WnZrY1Ro?^rd zi35SX2*=mvq4Bq3Awt;Qdn>}e#$tk!UN(HWC(NpR^~g~|?n<(P-GDFIlmWahpr@+O z#o=W&Od&QjcGZ(Y8ns&FdpQ*{>x-Hfhl;rscnh;w?CBolmj|9FUW}yVK8R-Y961Lj zz`RbY+u7W&ykGX-SGrPyjC&ME??nYr09}s5_ffxn76mtZWE=KnuH>84FSzzju4_3& z>Gn>;7$lKT<+Ry{KR+{mv?F#TJa%f4C1y{n)}+D0YIrZ=`+DItu>;{7ERx1q)E*1H8wG!0)N|Le zIyJ567abFTDD^e%acD3g4x=vJ>H5{BmZEu}hyF$Nc$ikit^8)J>WF>~EUbUs+aG(e zFDjB#FQ0g(H?Ecd^EG0 zXRmxfD?7}8z5LGbkkGnKhwhNUxkzED`z1F7v_~3d_ZG6HT2854iCcA~tLV64IH>4I zW&6JZH9eHYL4C#b(=%d(XQ|9BDDry4G$KwPVs6(}Lc07Qj z-&P2FnD1c-o5alIM3`=JK*q={B!+N}tBH`0uk4@!t97!;ug7I&VNN9HXoR@@dA03NbIr2~DJuV0a3h5bRsL zdS9!q6kH7v!ZowO&gKCsa(133mj@`1(w3`YN|sEnwBMo;yn3a2ca^!OL~DFo+cttd z<#0pQJ=8q(+7T;3=wYj&kEbvjy)4QylNUoD@4(+kMOcPMKCD44$1S35R}~~dCF}k8UFu;Er#f_VgMX;6;Df)Jxb=(T>L^Y=yShu~{htG~ULhAvm1| zx6Tb_Wq2)xguSu^(y4rE?%3joGAf~B^J>O;)L%KPQyjkEk{XfQ%Ol&Znl1g08e5il zvqdnHN(R<5dC%y7IJVy!9TCrBE^~Td+6B+?LjMy2`4YsD4MKV~@J{TX-;SBFADuNB zUnni}=K}S?--m8p7Pt>*fW&tXxd{%~DNj$_l(3#{v4o0N|0~eG4)6p+TqVG& z`lS~PdfQ7>pW0`yM_fbG9Bo9mN@m@<*VV0TI+OXhaK=5k*o>Be=2w6Vi{^#Tgvg8P zW^aJo2^{_vV7Y-0z~|g_9l}59&J|M@>`nFpd~SSae=rq3kNZw(;$bJBX=I?8JcOt6 zB2Q#wI~ooD0fYjFAf+KC!02a<3gWn4ZNe~*8X?fvPi;=%VTbvDOAk*1SAzP@H=b!o zSgvd6CGaw@WHwcH;rop}Z$z1J;$Wmhorz39LdfR|iF3;DSW|nZN?0 zA6btYK0DEC$?-h}Ev706V{;2LlZVw4i~b%{`2iBgQv6=loiO%*h(igtbpx!Q`s55+ zXq4hD$dQj$BQc>+Z@FfxF|qhD*_K6xVcY3fy8DsRi%_w0;$RBptzL4*79@VBcW&sXmULJrj*+C)lA#Z+NCW%)jvxeuh@w(@z04fV>{l@iYd11 zKW*MJ_fu==qe!cwRq;LJ#BQ5=qUOm&qs{#HLC6=07^}+RW8b`EPBfmhIZl=;46u2P z+XFjw@J#|L2Sr6B`j41hffY2|T@^X7uCy>BpO+hIDBN9iq)?t^#0cIvoQyXzV9;}VA9nlAPI?(8LHllpJnCybyyIo$ z#RK^P+s)1#^0-)lz~?hT!#i`--+SR6ExuA`6a&$34Vm!@^y)44Xlyv5MAKV|74=!f z47eN({UR9IFn`$;j4w#5;`|j|V5&3GTzcVL@^61OXUBXvO;@77$vmPg=Ecpg+ z3b#W96Bu|oK+0GMK@!I+RI4~46eg1?P!`OlyS23tZf_91ARKn_)K||?Na%eqY@iQmjwm5?%#Wnr4s^`VurK7FiZK$4r8=g$99kr_xNeT8dA#u~lbzzJhtF6hF;Jj@WufXQ<>|o)CDKvd$D)F zN5cgKc;NzhH6XlAX8;Km9pj(>E0>F1A?H9~IHxyAawtIk5Q_ydAd|=6v&gx9@HV)L zY@MGD3N#-MzIpsdZ!;W{-SJzk0)3-D7QsoszcC|N2;JgA9}11XGqK$;OZ|_kw%?15jz()n8e<3GzSSm(fd;Ma_Bd8%DtqK2oJya5;T{tr)rWi&S+ zBtxlYHqEBkDfyq)EpQ5ev7vYB4^y6lxVC^B(-mU1ZS6}Hci+l@imf#0Tpf#+9$n^J z6_E`&D89h&Ql?dvwF;ztRt+{AMcA(gxA1^xCSScD>WQg@40yob?dGgdq1U9@%M$JD zcekVAaL_;;Dj?2eF6j+k+r7NJDY$lbTXisS6AadVY+MDiKf4C_Oui2IR)5$5Y{1vR zBJA+&;2Qtz`b*yUHs838*Av&K8B?4}#fNs;(I>JHP6-UntSHeDjN#w8Zz2+X0iUzh zR!6^I6Nn4n8=v)8v#0BYaF2ML)QN_RCY8n(9R_mt6`95}86Wg^QyPmFXSRqrp4>z~Xn5`-<&@C86^M+iqcea5&0d&M_Ov&fEW2>SZqyLp!oSG5Ow zb*?lwf0r+c8MHeWwW}bg#K`{wDN2nsMZTE=4!!*qmgxP)X!NrBl)=S>D;7Z=Yit(+ zHqfZ0fQ(IGntfY5PY0dFzxAV8%NH-QHY4`hK1)?92rQ0t)Wz4_2|MW&x zA6zYawj6zndpQGZO91h^Dt30v&JwqCBvtsHep@Mq?FPS>I|gkwZBKN6RaE&fb2QufsuER$#Fyw|{c1(Lreq{VU^$ zN#5j@pv3-T_glS@Ij!pbxo<_^$=^^uTkd)IS<-p`p)Ds*(tOyfbDhkj%F9WM z$BBd34tAiw%9$u9pYTfxZ+4FS{oo9F;Z)Pk6WOnhwuIf8dHTK!2Te%*sFppQIxLGX zf7_(MnW|o?TvYJn~zevN3q@?-;{U$r1&=<`PO3>`^{^| zfkRB&mKf@@>wLxe``n81nv9R5jONK|Eg7eLh@ptL^W)@I2j-HE)Tb^&r)W=K>q$&K z+u!`c%~hXbtEbNd@0?m2(;5wJ&9q?K(x>=7RI^JMEqgaV`F||#VgQV1L_q)KjD3Os z_<)y%Sk%nd3x;Z?>pqkDu{rcMP5bt!*}6*69eI|}ylg_?Oy>sR5V%rZ#&2S$;`X^$ zjr6*4KwT*!_*4dxaJ>3e1^kSJtB3fg)T^6lo5vS3FI~R)+1f(OF}kF;CZ)G|qhJPa zrhv?;2Ob&2AIj#malKQuBO0%8rs27R)RGZzN#@V{%jXRau6RVu zGG5~+<`Gw}KApVqv%F+N%|!BB@%>(X(TktF!|7x2B%8a$i@;snwx@mhNHNt2#P#xJ zikZC%JA?^WFJAO-aDM;5@v5}QeoN{2JQCzcOqSG}0wqV88?NdX-WkuYW?2-{P_;NM z{Yy2)YYB*aeP1{9p|p{m7uBJ1SPL{q<{yV|Az~5Z;W3;{r?u4_k^_Yp)&FQi@Y`t$mDU_JV`Q9Ra z{fe7wnz8z^5sO#B@mR$NEwZ0T-blPO4O;VhiaN~(Hcb6QhO(VMXNdgW*>dg6nZOOT zstWSnldc3IhkL4hh0*i!`9{8<&`~2&8Ua?Ng6Jk=udcDnT~?LW={-gSaU%*voi#3h zuWvwxV2o2VI0s2o)_h}pmuNgwW2>pg-Y?nfL$m3%(T!M3**N(ncfwXzVeOJsU*>*C ze~p*kz>y#s%Coa^-+w3*2csV+#Xr`$ykZnN61!_iF99iOl3U>h*OyWVP!FbD9!QI! zfAah)*F>uu3yQ;QoM@ETb%K1q$!_TE&dgu^%Xtl|FUs(H3%X)HA1H;jDph~AxbD6a zTz_{bM(CfGWAPZd^G}IF#pIIP(L2s>Ke7Fsc-F_I%M6n}84rs?0 zuPo_}DDXC~tQU38l6lQ)=i&yyQL??AU`-#J8e^+Wq3R6eOu?`#e-B9Bg09dyE&xJL zd++~QZ@`f3HN=)f6u#K_ab^h&^MaiOc!W;Oo(iZy*9*|LGr`^Rt!(=rLj#!*1y9LC!INf$ z2V4YwMs?l`-2`*OflZKV`0e>Q7o~}B)7k_ZldjWc+tygs)qwFz2z-nWe?I*76E~yn z-NA3m67N3%JDx5}qzOp>zuImrU^2Y5U{y>&BN|+*meKa?*#AGu@_$k7w$Z>4>ZYr} zf0>tSdy-~A@62*O3}87Bm*k{2$Hu95|1h%(HFFz3rzvK$H$Wtey)>E0NAiBI+Zsv% z3&2QB&}I_N1UoDkhU+>L&7L{FG6i|z_r18LqQyS;1X7Z%I7t`BlGtnWe(7zMBDW4*WdlZh=)Z)i8hezayZ^%(UAxf zm2hDx5x??`>31fUHZ(USp^5gD0vUZEd5F<3H!~}0C)R({ZK3>UYE*mdxtWI#4=C8R zs{7S9*tlLTLHEPlu!cxiLKolT)yF_B9R}#b0OxwIbWDcqLL%mO)bTauUx%r9ZR%gO z&-M!o40eHtf1h^la!S7VeNS7iGmZF6*N4h&J+HPknWk*97?&F*e*|q}8$O4^# zU={D+qYL9{)sYS9hfEU;&4Zyv$b6Nn1Q2%{w<$+A)R013ieyTF4%(=g{WTKuF0d(i!JfIFjxc!k@|;?$a8>Ai4T%T;g!0>F8b*?D@7wN~C@!cT z;D%^Wll>7yAV8mdRRR;nkq*dW}`J@(2N?JW^&; zJWBrzNw%mnR!GXpZT8N^`S3+<7^yp#eV|j64&>tIcd@8RrCWC9J+q#r za*E%1{nvCGEo$wIt=iL{Z}GA;5Az@*7K@nzNZnJ_D66*Xr2Q|xjd6v+7W;bZD#d!`VUAKMq)W7gh%d&DeqlP*^A6peZ%;y$Gz&43`R zM(-tm`_*vU`{EwYlkb{7={D}Pzp9psNxNMK4^Z_1TwCppj3iSAtZ4SLz8%f(!czO* zH^+B5Dx;nB>BKf{E&l4QoW$0e+prX*OJIAQHVaaFd5CE`Z<>RDPNQJ>Qpi*Cp@5xKHjj7Fdh+p zaQ^l?koK5bi$}38N+IrP^VNg>#G?NW;#?={*RS+ zQCF?bBTyYMemZj^bCFSH3S7C?}D`)yZy*j+~a8(-L9USYd z{uKxo`&YoS-u8=ptS1off7Ue0k5+B$H3>cPRkq%AZ^PB%s9&**Lg1F&UcF&{@a7a` zvmNHO?gOw+!*FExC$P(3T~8Nivc5`0sul^Worfrpz`gQC~N)Cr98#A+uE=TXY*}*0viGA#~kMTCh)7eMidQNe?iVa z7{D(!Lc=%%+|3{^C#xU3%tq758`?UegaiFxC&yb_;#!=F1L>Qo3J9vBJ9#VU6O!>g z}rS_ABH(p|P`5Q*bJ?XzQks~>iN5{kf#I0$Fg1^K%-8Sq;L>+XWqWB6>%V7M9d&f z_5jA-p`Pu)DpNgJ!2YrmftKEn4$LtwJ-Gf`NKx%OVP2Ba*}WIh7>gIJr;;>o7`qPbX0Jw zn@YTqdGn8Q=7p7gk23Ks$ZohD;xVBGmEkpw1s6IT3_3M`Y&tn~Ci!}4gV|M-W#a18qh(u~b@1`TAL|N3g44u#=_%X!c$-zI4=%@#_~lAt*n`T%p#c+S znVegH&uB+|e8s$-kxK(BEB!$r`e`Q)_y=MsewERqrR52Ay_=w=FPkT)-`q2h&|qG| z=&Ygco0xboSsQvs$H7{!;Njfb>l-E>^e8zk)1w~MDXTVl_`MKkCzX26nsvr8UBL-# z$l)~-Xv%H~5iReKNdH@E1Sg{o@uTX7BtA&C2;nkByZ4LqYs7#m=YHBrglUWyx zwh-^m?ixPx2-nk>pL&daiYR~nj0Jn2f;{_8&;A4Ad3xd5+0?H+z2yU=q#tEjr!X-s z)Qn#nPoDNGtig1#2XSRS(vVFD#0={Eh4M9rZYZ)P(SoXWIWbSNuo*agR_=wIl#!$h zMrwBr+OVgof(ApCugqHb2CJ1WQ}N4dJN5n|J}ACz(fI(4Jn5=bx0$TZT1ec`a!N$( zcfu!X{><}MZCZSoroD#MV?|Gf#3W&($G|GG$PDW`^&?d^grQmb3z^mdLr2Q2%_VB=U*BSSHhcS0B zMkn9NNp`bznT{xogUpT5j%-x}!6f&cG})#ppB{UA4wc-$GBZ|`{GvkNjjX(h;`?Zu z9Sk~GHNQLEZHcnSUnv_FeB=B2c9?d%s%GTTZ7MRYm8JJi0=uK#gCEbo!tIP!IH(Nkj)Ev0b#iM2fqSvzulcMiti4h3KhkRb*e*GdL~k!|r}M=Y*^cx1 z4pZc~n8#@Zra|HV>FT=!l3f4xH7heKPt(fOhL)RC$5A=x)KODY+?s||HXJEwu2gv1 zw$yS_nvyG1Q%){&(s1M?ad4dE7Eo~^LwNe#*7<&a@B99vfDgj+Joo*X*L8h(%m`f5 z7mG=nFV%r2I*fdb*Yarnj+OBWRnnPz^w`kKIDFlHS8d(O1}n5>M;#rSGs_J~pSnb# zQrz=Xj&0L^QqYpL#9JSH*-lYS zom6aaF3_#kQudxl1|~s|_GI0xD=V#ie={OIuqW@^(tDfCdl%N#<@co|O~Ym3C6LPS zTms9cMyEu>>}ZRJ=2pwY6xE$haS7)cUvRiCuO_2h-PGX^$lfpC(fvto(4+I@7tTU83_OVWbtJbC;s|}{!TKEspii&&bQ$*k7 zv0bHmbdEIH-Pb5#)xR4%6smk#chSbJr!U{XiF#@pxh^d9(dS}yA9kFGcE@LK<> zE zJr{bfA33m%_5H}-dq-9WiOfAk)%l*httbCmERpbnfS&5&lF49{=+?${K&T6J*8f?K z03n5B_KM!c5O)ztf4de8-B}^n#=hk&POkg`R2kS2u~<9!^xA|YphmFJ_iagNyY|)p zXvo-Of$OJ|&5I}X#;bsTMk95oHtH3?y;oP8`wwWibHt%!cmR@TS5$g~X^46pQ2~}2 zRFd%m)DVamn1U&=qHy_08yX|?1AVcQ*Rc?5J>05xl{XFkh1fWt?vNOPXr@{#vHCV~ z;PvyMwX{Zv%GCS5LXiU8Te*VMT?8&UjS|guH>|HO`2(Cn>_S7%hu1!g95yzIjXv(> zdkR{iH3_EqkEL_C6Y!NRa1=ldA|Ht+cL}z+h9X~%SKn>e8ZLwrA}P(_5=d+XkwfV` zMjr_9AX--cs%{*D#;wNSYg&Vi?+u85T9kHU0Yyl1Tc!>JpbuKCr`bZsL1RZ^K8OkI z?-AU?_4j%9|B$eB!8FxC{v%@$K)sP(q=2we>@`0Bc;Rn>yfY(T;a8vKh6NWQjP7}l zmY)zjs>V?Tyto+ld8Oga1>qNu&q!ZWHp+ zy3VAM-%cAn1${GPT&@K((+aW?iYS}2@wpIMF4traUx!@}#yLeA7kaw{{24LiXXWu& z?fDOhu-;4-nfGv}ocdB_>*u^IiM~%Ih5p?92@8Mk(%t8r{y*_(~pI)I5Cf zV4?Jrh09Jh8Fls_>onaE8~#q%VjEhTkf}+|NQQhS9Nw_ZPVXzLBtsE?SI<~^EA=<- zu^-%7>h9fCr;?@e*kMBts(ep6kjpxEF8z=U`cUZASxT@#;668rcX*WGIctB=Xy-NRSalurn*lT4Be|sp6xQ~dcMDZulIom zr*D=#dSdoE|8nd0{9(YplpMsyNJni^08Rvl6l!hPr zj(O}M-!-L#hRiAP)3c5HI%)jDigQLOR@BRH(I0uIH=rJ=cC|2SB+uo2PK?h**LXR; zvR^(N5}SdZu3W6{;xKJVW~p7~Zd=ki?uj!h%L)@MOdGMJQfCNd6J-k<@gwr{n7td^ zobGOmrB-)M`FFd-2W*(D%c)b%TXSyBWAquRPtPA+Z0@irJD9@DYqlXUOf$=hN)# z|H{yJz_x{DpOI|SWS8UoZcCp<-JytU_#lxjA1VE)3bp5lL^0{M(dMh6Ln%+5ptg9M z?4P?-N+Z0@VqU$_l7F;m+MF=; zW~`{X*E!sSjThglwcdb#!KG2r`}q|lH3pRycrLae z9~vD%oBiH;+2%&*XaQl|vA3i0bA&-N&d=V;sk#gP%=er%A2G}GdxrnIJO3~8AN@@7 z@xk07)H9S~}hXhyt-R!UjrxW&S2nBN&`|=EW#-MUL-J&2Z)14yQ5I2Ue_nTa@ z-;NoyLH{(c#76@_uECa(_sur2Pbn+V+eN!CoGQ}_%N%N`*FI$XVV-hH?va7g{s(`_ z6KZx<&L-ssY}vKGNF?(UbzlS5eL z>8!>`H1x$~4DS0xHJ|BND!m*$_vabA^?GlY?Z- z<2|gba<_06c`U!7O8q2rJXpg9IX{zxe(C5p0BNiI{pz{%fMrH>yv2Zb{E#yL5MugL z@PP9Krqg7H2ywU8S-B_fOYrakQX4kvrQh}@X0K^N(((?fZTDbDW0h506ch8|AfppPAEt7}q7x>z6pSC%)!u z0n>lc@oFzEF#o-8(h-|;wA8o?z7El`)L%o$#SkV0l&6AL*QQ+_veHSW0~%D~@1*wS zQq7JpwolN<{?;1_l?SQfDIWuj3|=-23Pj0@cFp2bzGF9<`{{-gm#*QR>U#Sdy{`cv z%JC;jA395SswB&mo@+#;9%&wHQcS+=nrP$nwLFy8sHqn+wdl_@nG%t9C66B)JmUJw zAF(y2*1E5E*r%=FbUn{8H~+1DjzW!Fkb1`*4_0(3^fb*xoMD9dPJN=J)mC{T1kA^8;j@y|K#|VkzZww14~JGPBC*^(W1# z&=2jUQrBZ1(%hT3*WW=DUJOpOBcC|+F2!|6Y?w{1)2nzfZQPPxF*(D@hPY*b1T8Am z{ER>PCI5?d`r~%;)E^tRR+N@RhcBx1QA|S!=&hWpt8)!QQPDLr{LD{u18`?d4!h&_ zvp-i%7pA^-ZN1)H$aEo8;6#7)oQT<>;9i*+hmLcrntHtOtmO^u?Ba^gP&;buDEF-=~K<*}#SqH`pkkyX>AA}^Pi&(f&Om{WW z`&zfyTmWGVide>r-;dx^vc*EmNlERWf2Y?Vy2}I$weWzm2l@0Uv>A!L@jyGWIZ|atU1zC zzd*4H*hf#T`RcB*PPO=x1u`Ka(EfFUr*G7LXwo?B66oteXHQi2p{wP_&RJ`jL0bxZ z^m3ijJ)Y+5?({KpWZ5Pf@6iCl^Ll!|M<=^VN@M=06=EK9*9}#cR6Nk!IaRP2VZ0;k zbZ4SU1@?$^RaB76jRr044b&HLfzHfJEzeEQ?Ros9G*cy8-E!GOm=B=B(%J7y+Y)`S z12v@l5_v7`DBtl0qjRbJfz{>Hy?W22baVChTHmvjdDL~f@9e3~jcWBqWkvS>&G~eW zps(g#z?jnoAhvoo*oL({v*-^ExZsH@joFjOYfaS3=RztYhF%yU{NA!=S;ujW4@PW1 zkUzv7D;PdCZyhkUGlOiluiNE$SN9*fdF(uEwUVWfQeIqTP4ZMSi-OF^Hw&)Gx4DPQ zwk*20PkOuR8rAJPM)Kpaj`0@EmhXx5hmmW=nY(GjR(0JuN%C{1WABn6m)_`a-G0~H zPHn92C!b+lM!dKnZ#%wvLDu5EQ3gs|*^6~n|6K{;kH@%Ueu`MuyCqg@@l&!q;o>1P zn|D_&6CAGleQIiQcfjxep(!{mBMinAB{3N~IM*roLZ(HYzO7|jZdIxTVt zT|Wd!h7zx7XlEqhW>yD47I%uZJ}5fetr#a5`fyw>(b}yjLsus}CyZ2C-_18zD%xgJ~5Tj+`5WYSR5~Y|pC&!gS`B z+MlA1WSwaZxbECfP(~0C8mB~A7o0@}z9ALpYFZcLG}|v+xBKhc5ufsdf}BGIqoa#- ztFpeBM`v}@T0;fw;m~RC@2y+U6?Fz1d*>uYM13f>I;Q!C$6Ej?itbs?7@;VyV12{m!4UxmX6H0 zT-d#{+W;Snx8Ts0LZVBTMFlmfsGKIzk&z998Cab(bW}yn0q74x=VCaSdsE$WcWBkk z>(hZ;)Tv?A?#Ofe`*YSix`%aVXI`kjYzf)YgqVmi^LwOP?|gK-?Y_Da_2XX^3kvPA*V^!lfIQ*72gtz=x$=$(I_N)a&&bb(>;F4D&8 zcVRsntYRxp-hTRuNC#;?0EvE3Jj#`NWBhj2Vqg#lV$K)?mu&QH&EzPP`VIK=1)=TA zud9QUZ5*Xk$J0{bdRSgZ%M|hLF z54Vbu)DOHpa1d#%gFYdigf++40-)^As>W^6G7a0o5iy)ZMUy<%+60FnXhI}5RQ?7# z5(y#&VGypH##N4oE1{1N{weJ-7PSCQ?*KQqn&VH!(!@$j%nFuX4yd0j%%m-cfDiyw z5{#fIvYo&&wqt^B0|(%onaS6iJL19nh;NOB0e?Dkm*Ht#@DuiIC78SnSdL%l--Nb$ zFwQ^#F|8oVRUo4IQ!;izuxRv6Rwy>cwsU(}(LV>%{FIGncPay#BW0EcbaQ^G!u8%J zCMq(2$u3cA4rg;2OTV%zF;Ifr#wvjD7HkO`gpvy(NiDa_nIN&9~4oi zrK086?K)ceVK5zTzp5p7V83i^$zMiq+O7xAce7n4XoHYWti#w*!kxfPns<``fy6VT z0Co7Yo|U|kQ{t@x!a%UHSFh1pVDr0~$%onsRR0XUX`}#4Ajq0=$b~@17ESx8nWWp??ZI z=i5@>_Vh4mC>3O-7fGwoAF8Eo#}xlvv18Ss>2tKr$F-aGRH!U6eM4}72Z5iM*k1I` z-~FulR_;5}mUt_<=xmJS!*Od?LZ-h9%^_hwCv>K=U_kaGtjT}KbMa8=(4}e5WIPXI zYArUmBN~m|C#p)$2Cuzrr*QbJ=N7@kT~eF_yVM!3`9QrM80_P4Awf1uHs{bRYQ-fV%PDNv_rd(JkWx z1HhJM9DASaUDi!o z?jJiEaoX`!W~0UUWwduLSbd`W{-Hg32fH`DN=yxv z_s6@G?C&mSiEC4y_Tw#Qd3S;}4;^93%O{^Hnz`zCe0aF_J@hQ;3RJ8cF_041BD=+c zs^`&&^~%8~<2Cb;7wSfLDH)!-;zSr$>>JO$pV^A9nSUG~?wiY$Nf(_-8tmxNr@epN=CP|tHC7yF?ZK?H7T&DD65HA6B6>X(ihHu0_p zf6q!K1zVOl5ujv_r;V}ZaNxU#cvXIk-pjsubURx_yJ_0A9Q5z_QCQ;^_>1^-e}@ z_=krNP})%h#ioX&*wKqFT2a1Rj%H6KaWDwh(!%>m$actP_vezy>#$8hUf{47dp)rBjQ(l4^I@!SBBUEyRii_gks}7c;LXG3Fh<^jzYC`Ste1g_5hj9 zv6i=~0VtIKFat>- z_LeIsWlZ4H;-;1e1+7Q_KTTt`5M)cAIzZ7qwiOT_|HGbG4?`>Z;K1GZn1T_!u=!io zMu}w-l7AfU%l$8LLr!-a_z()X*2b0Jq{j-mJmkb+wG?%0%cAmxX!)B|DEV)2WdyIK zZiIhZbqRngZ*94?UPAqBu*lta?)z?m*yD?ARYdqROonxh<^LYr-1nORfb6R z_`j?Q(h5jGrYZs`s#=uxkcc9QjlaN{Cw|rXCH~DSC4U}rVk1_&UQtT!q~vQzx8{dL z`yM!bsNj&Dz3Tlx_b!w`4+3DEy0Ob*eb#aTNX9LK*rNo8+bKh}N%D_!`4M*2G(BjY zt8w+r%V6W^eyw%qJ=1zmXP;arJr?kFZTe?%H4;G~T`@bb@qRrm=;fyN zQ}uGzHQad!tK5qMvo{|b$rbeT{l^j8y$os;E4!v&cTFRPiYcYbsDf&8ETotE(cHl+Ql`E=` z8V~7_G^Qv>aM@?WiTUl(ySL@GXWHn#r9JhgHGZjC@)H~SBvzBPG}NbK`O0}B8L7?RV8yqx_3rsdHp%|PckYM) zA}%CLdz<^YfS`0Fy(RiSO57Tk(MCmr{fbYbM8-(}LJJWoV+8 z;E~6OgxWx#(IW=6@ax_BqF#*95yRzOllKHcu22~@D|X`1A#GK54=C=iJ}=q>>xc53 zo`k-}Q3}A|>&71vR%YtefKyCaM2f?uut17-2}fjf_u5%gF$*v8 z(MmZ2&}igB4I|yR!5M2;Ek@*X6zQid)hTU|4)h$LztIp{tOs=d3sT$vhg$I(2s4p0 zULmsUTw#p?ePQA$2K!GdEPED*gB)yrX*dEPxg><43%qzNK#!)d1vi+SKIRE(i_z`Q z+a9+kKqn8P&c9yEffR4Un2{4QRZCLfs@>NV0uA6>20!h|VxiDfGvFN?sXlNLWhMX?QUVax&0u)c#rOz)u?pp2^>O@pcMBxd6Nbc&!ILS1dJLU=WzE~sNhE3(4g+flItULTIlxbb-{@FS9!BPjnf{R2SV=lGfG6s%`3Dqj zp#y?gV5MW(Hfg>cc>+eB?0b+S;eJT0kR2?A5T*;9L(LFg-58vIPDh7m2=w1mkqDUl z9_;jEvKR<8r$a49o47M^>#~>v9H2@Hgm)QjLSOna3E+`CzdiPN1@_7*&Lq?*C9GtR zE?Wd$0h!-V>f|YC`Wvh(Rg+f9rHm4TOUTau@p^#dAP4kHvxseSU;jgo?3>%Ry$G%l zdPA+k=QE2S;)gD zWXf?~5@2O#OC0=}ib;`^MbK9R(g$F#da~y!*%WuV#6@r6;n1Hrzb7?R0L1!zlz^>+ zUX+8)v8}u+s|GWwX+oX3IAN?dZUq6G0X-}5`y3O-6DbQe>X%)xVOK0SIpAEtEVlJK zV;0XsU%Um|XRPQzASX((iYFz4gU&9-3xExZ7oB<@gcUAFNh{6+4WenQ!FlMe*tYyq z8AN~c<+gNsW^&&f%649Ca<7FuHHXXO%WX2J&_!NFkSsZ8D9FT->vl7J2>QgXQ<|Sv zb^0P(P>>AQ%;aNFl*HYjr!~A^TG@fm z((i$oUh)vK$M6`1OPfmkrxvV&QlYiGq763|6eL zRiLoPDXmDSyenA_BYVIGT41DetU#PBoa`{&ZTE}m8)RHTqYQ~5Yj58-B~lAfH zkjA3%L_5L-YCc8XLePw8go!WKSf>xbP@JTJoSmROEa=JdG?116lpA#nRD=m;46ni} z0<(!s)nt(S38PY>X&)ivY!;BH$Pw^BeFA4Ku~M$El{~RVvk>U~Z!6DaEJ$Rg0h=HV zpV)Szf$|-IPrXZvFMu{dY#Pw#eP-9H1kfPkE+zA#lc~c((#OcTh#WzB-;2?W#3+$uXxeuOF_+!wmx7^xJ@+INA__JE(_hj}6$(h5$9^v9&od7F5Msh| z0gafaj2bp#6@<{o4^zBtHx_;A@GiiM?m*d8znC2jo)FMVl-j7XaLtA0E`18(!}aSR zp%5(Q0A*G>Ljd2U=Pd&)O`(y}ci0gsAEZ47w>;`Y^} z9t{IIi9^IEUMLMmd**c^%LRJhWD*yqAgZN@uQ`C(VcvW?P9aItMT?oZ5GW9!q>0~G zvtY_fYJ{{zN<##ZTr=&Xs|%C(5!}Uz)3T>mf}AO@RZSKGVaO3(uzcrd)K(26ZEj8h zr_2_8)c!Y$ffFP{091?D5ccu9ZYp|k2&{-8GZ|<#tsf0Ll?7}nT(0|t>WrE%xA&i}0 zMNtruuuWFN(&_;K$P$Qg4V1S(B=*WRaLHq;Vkp#1JsgO}6e7Wk>`qD&fI(}5I7hVF z5bRSAaL(FDL$5jmR0k6dzsnEG1al?y@!n?#TYXZlPLzh5rexUZE?Gc;qC zgeLSysTH}a(w3g=OqQw&$ zTxC1aWD>OOcpX# zwSs$EhADY;(&SExSbp>t^zt|!`OSV+5Qh)BNff0bl_%9!HKj>%fY*F2`-m4cB6_>3 zH%J8F-r6~{@HWXn6R^g(uW=yAei@DsCqS0c4AEf-8Hzz;2EBk+E{bKI0DEHthB`o} zyYP}XLsOYTTNk!0#RGnG53{TWCv5bgzuJn&uROa5p2~7_fHZq&`@=cDlobhV^Kp|{ zk-7*-)%@kvz?g+g2&kj%39{flr4-%U-Z^5xhknG=eUz-H>({pk6B`CgTK delta 45196 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