From 725d042640f5b0474b58e6a1af0a4063c7e5cfc2 Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Mon, 26 Sep 2022 17:17:34 -0500
Subject: SL-18190 WIP - Windlight to linear space proof of concept, better
 parity between release viewer and materials viewer when reflections disabled.
  Avoid run-away probe ambiance.

---
 .../shaders/class1/deferred/alphaF.glsl            |  19 +--
 .../shaders/class2/deferred/reflectionProbeF.glsl  |   6 +-
 .../shaders/class3/avatar/avatarV.glsl             | 134 ---------------------
 .../shaders/class3/deferred/materialF.glsl         |  32 ++---
 .../shaders/class3/deferred/reflectionProbeF.glsl  |  20 ++-
 .../shaders/class3/deferred/softenLightF.glsl      |  48 ++++----
 .../shaders/class3/windlight/advancedAtmoF.glsl    |  73 -----------
 .../shaders/class3/windlight/advancedAtmoV.glsl    |  43 -------
 .../shaders/class3/windlight/atmosphericsF.glsl    |  46 -------
 .../shaders/class3/windlight/atmosphericsV.glsl    |  51 --------
 .../shaders/class3/windlight/transportF.glsl       |  68 -----------
 indra/newview/lldrawpoolalpha.cpp                  |   2 +-
 indra/newview/llsettingsvo.cpp                     |   3 +-
 indra/newview/llviewershadermgr.cpp                |   4 +
 indra/newview/pipeline.cpp                         |  19 +--
 indra/newview/pipeline.h                           |   1 -
 16 files changed, 65 insertions(+), 504 deletions(-)
 delete mode 100644 indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/windlight/advancedAtmoF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/windlight/advancedAtmoV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/windlight/atmosphericsF.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/windlight/atmosphericsV.glsl
 delete mode 100644 indra/newview/app_settings/shaders/class3/windlight/transportF.glsl

(limited to 'indra/newview')

diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
index 69a0a41034..b72c9651c1 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl
@@ -88,6 +88,9 @@ float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
 
 float getAmbientClamp();
 
+void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv, 
+        vec3 pos, vec3 norm, float glossiness, float envIntensity);
+
 vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 diffuse, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, float ambiance)
 {
     // SL-14895 inverted attenuation work-around
@@ -242,11 +245,14 @@ void main()
 
     calcAtmosphericVars(pos.xyz, light_dir, 1.0, sunlit, amblit, additive, atten, false);
 
-    vec2 abnormal = encode_normal(norm.xyz);
+    vec3 ambenv;
+    vec3 glossenv;
+    vec3 legacyenv;
+    sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, 0.0, 0.0);
+    
 
     float da = dot(norm.xyz, light_dir.xyz);
           da = clamp(da, -1.0, 1.0);
-          da = pow(da, 1.0/1.3);
  
     float final_da = da;
           final_da = clamp(final_da, 0.0f, 1.0f);
@@ -262,22 +268,17 @@ void main()
 
     vec3 sun_contrib = min(final_da, shadow) * sunlit;
 
-    color.rgb = amblit;
+    color.rgb = max(amblit, ambenv);
     color.rgb *= ambient;
 
     color.rgb += sun_contrib;
 
-    color.rgb *= diffuse_srgb.rgb;
+    color.rgb *= diffuse_linear.rgb;
 
     color.rgb = atmosFragLighting(color.rgb, additive, atten);
 
     vec4 light = vec4(0,0,0,0);
     
-    color.rgb = scaleSoftClipFrag(color.rgb);
-
-    //convert to linear before applying local lights
-    color.rgb = srgb_to_linear(color.rgb);
-
    #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, diffuse_linear.rgb, pos.xyz, norm, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, light_attenuation[i].w);
 
     LIGHT_LOOP(1)
diff --git a/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl
index 15d6b5a05d..a7cac6c523 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl
@@ -25,7 +25,7 @@
 
 // Implementation for when reflection probes are disabled
 
-uniform float minimumReflectionAmbiance;
+uniform float reflection_probe_ambiance;
 
 uniform samplerCube environmentMap;
 
@@ -36,7 +36,7 @@ vec3 srgb_to_linear(vec3 c);
 void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
         vec3 pos, vec3 norm, float glossiness)
 {
-    ambenv = vec3(0,0,0);
+    ambenv = vec3(reflection_probe_ambiance * 0.25);
     
     vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
     vec3 env_vec = env_mat * refnormpersp;
@@ -46,7 +46,7 @@ void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
 void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv, 
         vec3 pos, vec3 norm, float glossiness, float envIntensity)
 {
-    ambenv = vec3(0,0,0);
+    ambenv = vec3(reflection_probe_ambiance * 0.25);
     
     vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
     vec3 env_vec = env_mat * refnormpersp;
diff --git a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl b/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
deleted file mode 100644
index df9704ec25..0000000000
--- a/indra/newview/app_settings/shaders/class3/avatar/avatarV.glsl
+++ /dev/null
@@ -1,134 +0,0 @@
-/** 
- * @file avatarV.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-uniform mat4 projection_matrix;
-
-ATTRIBUTE vec3 position;
-ATTRIBUTE vec3 normal;
-ATTRIBUTE vec2 texcoord0;
-ATTRIBUTE vec4 clothing; 
-
-VARYING vec4 vertex_color;
-VARYING vec2 vary_texcoord0;
-
-vec4 calcLighting(vec3 pos, vec3 norm, vec4 color);
-mat4 getSkinnedTransform();
-void calcAtmospherics(vec3 inPositionEye);
-
-uniform vec4 color;
-
-uniform vec4 gWindDir;		
-uniform vec4 gSinWaveParams; 
-uniform vec4 gGravity;		
-
-const vec4 gMinMaxConstants = vec4(1.0, 0.166666, 0.0083143, .00018542);	 // #minimax-generated coefficients
-const vec4 gPiConstants	= vec4(0.159154943, 6.28318530, 3.141592653, 1.5707963); //	# {1/2PI, 2PI, PI, PI/2}
-
-void main()
-{
-	vary_texcoord0 = texcoord0;
-		
-	vec4 pos;
-	mat4 trans = getSkinnedTransform();
-		
-	vec3 norm;
-	norm.x = dot(trans[0].xyz, normal);
-	norm.y = dot(trans[1].xyz, normal);
-	norm.z = dot(trans[2].xyz, normal);
-	norm = normalize(norm);
-		
-	//wind
-	vec4 windEffect;
-	windEffect = vec4(dot(norm, gWindDir.xyz));	
-	pos.x = dot(trans[2].xyz, position.xyz);
-	windEffect.xyz = pos.x * vec3(0.015, 0.015, 0.015)
-						+ windEffect.xyz;
-	windEffect.w = windEffect.w * 2.0 + 1.0;				// move wind offset value to [-1, 3]
-	windEffect.w = windEffect.w*gWindDir.w;					// modulate wind strength 
-	
-	windEffect.xyz = windEffect.xyz*gSinWaveParams.xyz
-						+vec3(gSinWaveParams.w);			// use sin wave params to scale and offset input
-
-		
-	//reduce to period of 2 PI
-	vec4 temp1, temp0, temp2, offsetPos;
-	temp1.xyz = windEffect.xyz * gPiConstants.x;			// change input as multiple of [0-2PI] to [0-1]
-	temp0.y = mod(temp1.x,1.0);	
-	windEffect.x = temp0.y * gPiConstants.y;				// scale from [0,1] to [0, 2PI]
-	temp1.z = temp1.z - gPiConstants.w;						// shift normal oscillation by PI/2
-	temp0.y = mod(temp1.z,1.0);
-	
-	windEffect.z = temp0.y * gPiConstants.y;				// scale from [0,1] to [0, 2PI]
-	windEffect.xyz = windEffect.xyz + vec3(-3.141592);		// offset to [-PI, PI]
-															
-
-	//calculate sinusoid
-	vec4 sinWave;
-	temp1 = windEffect*windEffect;
-	sinWave = -temp1 * gMinMaxConstants.w 
-				+ vec4(gMinMaxConstants.z);					// y = -(x^2)/7! + 1/5!
-	sinWave = sinWave * -temp1 + vec4(gMinMaxConstants.y);	// y = -(x^2) * (-(x^2)/7! + 1/5!) + 1/3!
-	sinWave = sinWave * -temp1 + vec4(gMinMaxConstants.x);	// y = -(x^2) * (-(x^2) * (-(x^2)/7! + 1/5!) + 1/3!) + 1
-	sinWave = sinWave * windEffect;							// y = x * (-(x^2) * (-(x^2) * (-(x^2)/7! + 1/5!) + 1/3!) + 1)
-	
-	// sinWave.x holds sin(norm . wind_direction) with primary frequency
-	// sinWave.y holds sin(norm . wind_direction) with secondary frequency
-	// sinWave.z hold cos(norm . wind_direction) with primary frequency
-	sinWave.xyz = sinWave.xyz * gWindDir.w 
-				+ vec3(windEffect.w);						// multiply by wind strength in gWindDir.w [-wind, wind]
-
-	// add normal facing bias offset [-wind,wind] -> [-wind - .25, wind + 1]
-	temp1 = vec4(dot(norm, gGravity.xyz));					// how much is this normal facing in direction of gGravity?
-	temp1 = min(temp1, vec4(0.2,0.0,0.0,0.0));				// clamp [-1, 1] to [-1, 0.2]
-	temp1 = temp1*vec4(1.5,0.0,0.0,0.0);					// scale from [-1,0.2] to [-1.5, 0.3]
-	sinWave.x = sinWave.x + temp1.x;						// add gGravity effect to sinwave (only primary frequency)
-	sinWave.xyz = sinWave.xyz * clothing.w;					// modulate by clothing coverage
-	
-	sinWave.xyz = max(sinWave.xyz, vec3(-1.0, -1.0, -1.0));	// clamp to underlying body shape
-	offsetPos = clothing * sinWave.x;						// multiply wind effect times clothing displacement
-	temp2 = gWindDir*sinWave.z + vec4(norm,0);				// calculate normal offset due to wind oscillation
-	offsetPos = vec4(1.0,1.0,1.0,0.0)*offsetPos+vec4(position.xyz, 1.0);	// add to offset vertex position, and zero out effect from w
-	norm += temp2.xyz*2.0;									// add sin wave effect on normals (exaggerated)
-	
-	//add "backlighting" effect
-	float colorAcc;
-	colorAcc = 1.0 - clothing.w;
-	norm.z -= colorAcc * 0.2;
-	
-	//renormalize normal (again)
-	norm = normalize(norm);
-
-	pos.x = dot(trans[0], offsetPos);
-	pos.y = dot(trans[1], offsetPos);
-	pos.z = dot(trans[2], offsetPos);
-	pos.w = 1.0;
-
-	calcAtmospherics(pos.xyz);
-	
-	vec4 col = calcLighting(pos.xyz, norm, color);			
-	vertex_color = col; 
-					
-	gl_Position = projection_matrix * pos;
-}
diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
index 27eb0b9888..7c0a11d442 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl
@@ -287,6 +287,9 @@ void main()
 #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
 
     //forward rendering, output lit linear color
+    diffcol.rgb = srgb_to_linear(diffcol.rgb);
+    spec.rgb = srgb_to_linear(spec.rgb);
+
     vec3 pos = vary_position;
 
     float shadow = 1.0f;
@@ -318,20 +321,23 @@ void main()
 
     vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
 
-    //we're in sRGB space, so gamma correct this dot product so 
-    // lighting from the sun stays sharp
-    float da = clamp(dot(normalize(norm.xyz), light_dir.xyz), 0.0, 1.0);
-    da = pow(da, 1.0 / 1.3);
-    vec3 sun_contrib = min(da, shadow) * sunlit;
-
     vec3 ambenv;
     vec3 glossenv;
     vec3 legacyenv;
     sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity);
-    amblit = max(ambenv, amblit);
-    color.rgb = amblit;
+    // use sky settings ambient or irradiance map sample, whichever is brighter
+    color = max(amblit, ambenv);
 
-    color += sun_contrib;
+    float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
+    ambient *= 0.5;
+    ambient *= ambient;
+    ambient = (1.0 - ambient);
+    color.rgb *= ambient;
+
+    float da          = clamp(dot(norm.xyz, sun_dir.xyz), 0.0, 1.0);
+    vec3 sun_contrib = min(da, shadow) * sunlit;
+    color.rgb += sun_contrib;
+    color.rgb *= diffuse.rgb;
 
     color *= diffcol.rgb;
 
@@ -359,18 +365,14 @@ void main()
     {  // add environmentmap
         applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity);
     }
-    color = scaleSoftClipFrag(color);
-
-    //convert to linear before adding local lights
-    color = srgb_to_linear(color);
 
     vec3 npos = normalize(-pos.xyz);
 
     vec3 light = vec3(0, 0, 0);
     
-    final_specular.rgb = srgb_to_linear(final_specular.rgb); // SL-14035
+    final_specular.rgb = final_specular.rgb; // SL-14035
 
-    color = mix(color.rgb, srgb_to_linear(diffcol.rgb), diffuse.a);
+    color = mix(color.rgb, diffcol.rgb, diffuse.a);
 
 #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w );
 
diff --git a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
index 73b852e008..de18251dc4 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl
@@ -31,8 +31,6 @@
 uniform samplerCubeArray   reflectionProbes;
 uniform samplerCubeArray   irradianceProbes;
 
-vec3 linear_to_srgb(vec3 col);
-
 layout (std140) uniform ReflectionProbes
 {
     // list of OBBs for user override probes
@@ -531,32 +529,28 @@ void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout
     vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
 
     ambenv = sampleProbeAmbient(pos, norm);
+    ambenv /= 1.725;
 
     if (glossiness > 0.0)
     {
         float lod = (1.0-glossiness)*reflection_lods;
         glossenv = sampleProbes(pos, normalize(refnormpersp), lod, 1.f);
-        glossenv = linear_to_srgb(glossenv);
     }
 
     if (envIntensity > 0.0)
     {
         legacyenv = sampleProbes(pos, normalize(refnormpersp), 0.0, 1.f);
-        legacyenv = linear_to_srgb(legacyenv);
     }
-
-    // legacy expects values in sRGB space for now
-    ambenv = linear_to_srgb(ambenv);
-
 }
 
 void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm)
 {
-    glossenv *= 0.35; // fudge darker
-    float fresnel = 1.0+dot(normalize(pos.xyz), norm.xyz);
-    float minf = spec.a * 0.1;
-    fresnel = fresnel * (1.0-minf) + minf;
-    glossenv *= spec.rgb*min(fresnel, 1.0);
+    glossenv *= 0.5; // fudge darker
+    float fresnel = clamp(1.0+dot(normalize(pos.xyz), norm.xyz), 0.3, 1.0);
+    fresnel *= fresnel;
+    fresnel *= spec.a;
+    glossenv *= spec.rgb*fresnel;
+    glossenv *= vec3(1.0) - color; // fake energy conservation
     color.rgb += glossenv;
 }
 
diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
index cfdbbdfe2c..9374922494 100644
--- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl
@@ -114,14 +114,12 @@ void main()
     vec4  pos          = getPositionWithDepth(tc, depth);
     vec4  norm         = texture2DRect(normalMap, tc);
     vec3  light_dir   = (sun_up_factor == 1) ? sun_dir : moon_dir;
-    float light_gamma = 1.0 / 1.3;
 
     vec4 diffuse     = texture2DRect(diffuseRect, tc);
     vec4 spec        = texture2DRect(specularRect, vary_fragcoord.xy); // NOTE: PBR linear Emissive
 
 #if defined(HAS_SUN_SHADOW) || defined(HAS_SSAO)
     vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;
-    scol_ambocc      = pow(scol_ambocc, vec2(light_gamma));
     float scol       = max(scol_ambocc.r, diffuse.a);
     float ambocc     = scol_ambocc.g;
 #else
@@ -159,13 +157,10 @@ void main()
         vec3  irradiance = vec3(0);
         vec3  radiance  = vec3(0);
         sampleReflectionProbes(irradiance, radiance, pos.xyz, norm.xyz, gloss);
-        irradiance       = max(srgb_to_linear(amblit),irradiance) * ambocc*4.0;
+        irradiance       = max(amblit*1.725,irradiance*ambocc);
 
         vec3 f0 = vec3(0.04);
         vec3 baseColor = diffuse.rgb;
-        
-        //baseColor.rgb = vec3(0,0,0);
-        //colorEmissive = srgb_to_linear(norm.xyz*0.5+0.5);
 
         vec3 diffuseColor = baseColor.rgb*(vec3(1.0)-f0);
         diffuseColor *= 1.0 - metallic;
@@ -179,34 +174,37 @@ void main()
         color.rgb += pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, norm.xyz, v, normalize(light_dir)) * sunlit*8.0 * scol;
         color.rgb += colorEmissive;
 
-        color  = linear_to_srgb(color);
+        //color = atmosFragLighting(color, additive, atten);
         color *= atten.r;
-        color += 2.0*additive;
-        color  = scaleSoftClipFrag(color);
-        color  = srgb_to_linear(color);
-
-
-        frag_color.rgb = color.rgb; //output linear since local lights will be added to this shader's results
+        color += additive;
+        
     }
     else
     {
+
+        // legacy shaders are still writng sRGB to gbuffer
+        diffuse.rgb = srgb_to_linear(diffuse.rgb);
+        spec.rgb = srgb_to_linear(spec.rgb);
+
         float envIntensity = norm.z;
         norm.xyz           = getNorm(tc);
 
         float da          = clamp(dot(norm.xyz, light_dir.xyz), 0.0, 1.0);
-        da                = pow(da, light_gamma);
-
-        //diffuse.rgb = linear_to_srgb(diffuse.rgb); // SL-14035
 
         sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity);
-        vec3 debug = legacyenv;
 
-        amblit = max(ambenv, amblit);
-        color.rgb = amblit*ambocc;
+        // use sky settings ambient or irradiance map sample, whichever is brighter
+        color = max(amblit, ambenv*ambocc);
+        color = ambenv;
+
+        float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
+        ambient *= 0.5;
+        ambient *= ambient;
+        ambient = (1.0 - ambient);
+        color.rgb *= ambient;
 
         vec3 sun_contrib = min(da, scol) * sunlit;
         color.rgb += sun_contrib;
-        color.rgb = min(color.rgb, vec3(1,1,1));
         color.rgb *= diffuse.rgb;
 
         vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
@@ -234,8 +232,9 @@ void main()
             {  // add environmentmap
                 applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity);
             }
-            color = mix(scaleSoftClipFrag(color), fullbrightScaleSoftClip(color), diffuse.a);
+            color = mix(color, fullbrightScaleSoftClip(color), diffuse.a);
         }
+    }
 
     #ifdef WATER_FOG
         vec4 fogged = applyWaterFogView(pos.xyz, vec4(color, bloom));
@@ -243,11 +242,6 @@ void main()
         bloom       = fogged.a;
     #endif
 
-        // convert to linear as fullscreen lights need to sum in linear colorspace
-        // and will be gamma (re)corrected downstream...
-        frag_color.rgb = srgb_to_linear(color.rgb);
-    }
-
-
+    frag_color.rgb = color.rgb; //output linear since local lights will be added to this shader's results
     frag_color.a = bloom;
 }
diff --git a/indra/newview/app_settings/shaders/class3/windlight/advancedAtmoF.glsl b/indra/newview/app_settings/shaders/class3/windlight/advancedAtmoF.glsl
deleted file mode 100644
index c6ea3ec9d4..0000000000
--- a/indra/newview/app_settings/shaders/class3/windlight/advancedAtmoF.glsl
+++ /dev/null
@@ -1,73 +0,0 @@
-/** 
- * @file class3\wl\advancedAtmoF.glsl
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-#ifdef DEFINE_GL_FRAGCOLOR
-out vec4 frag_color;
-#else
-#define frag_color gl_FragColor
-#endif
-
-in vec3 view_dir;
-
-uniform vec3 cameraPosLocal;
-uniform vec3 sun_dir;
-uniform float sun_size;
-
-uniform sampler2D transmittance_texture;
-uniform sampler3D scattering_texture;
-uniform sampler3D mie_scattering_texture;
-uniform sampler2D irradiance_texture;
-
-vec3 GetSolarLuminance();
-vec3 GetSkyLuminance(vec3 camPos, vec3 view_dir, float shadow_length, vec3 sun_dir, out vec3 transmittance);
-vec3 GetSkyLuminanceToPoint(vec3 camPos, vec3 pos, float shadow_length, vec3 sun_dir, out vec3 transmittance);
-vec3 GetSunAndSkyIlluminance(vec3 pos, vec3 norm, vec3 sun_dir, out vec3 sky_irradiance);
-
-void main()
-{
-    vec3 view_direction = normalize(view_dir);
-
-    vec3 camPos = cameraPosLocal;
-    vec3 transmittance;
-    vec3 sky_illum;
-    vec3 radiance = GetSkyLuminance(camPos, view_direction, 0.0f, sun_dir, transmittance);
-    vec3 radiance2 = GetSunAndSkyIlluminance(camPos, view_direction, sun_dir, sky_illum);
-
-    //radiance *= transmittance;
-
-    // If the view ray intersects the Sun, add the Sun radiance.
-    if (dot(view_direction, sun_dir) >= sun_size)
-    {
-        radiance = radiance + transmittance * GetSolarLuminance();
-    }
-
-    //vec3 color = vec3(1.0) - exp(-radiance);
-    //color = pow(color, vec3(1.0 / 2.2));
-
-    frag_color.rgb = radiance;
- 
-    frag_color.a = 1.0;
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/windlight/advancedAtmoV.glsl b/indra/newview/app_settings/shaders/class3/windlight/advancedAtmoV.glsl
deleted file mode 100644
index 65bb00b1f6..0000000000
--- a/indra/newview/app_settings/shaders/class3/windlight/advancedAtmoV.glsl
+++ /dev/null
@@ -1,43 +0,0 @@
-/** 
- * @file class3\wl\advancedAtmoV.glsl
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-uniform mat4 modelview_projection_matrix;
-
-ATTRIBUTE vec3 position;
-
-// Inputs
-uniform vec3 camPosLocal;
-
-out vec3 view_dir;
-
-void main()
-{
-	// World / view / projection
-	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
-
-	// this will be normalized in the frag shader...
-	view_dir = position.xyz - camPosLocal.xyz; 
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class3/windlight/atmosphericsF.glsl
deleted file mode 100644
index 2b70ba76dc..0000000000
--- a/indra/newview/app_settings/shaders/class3/windlight/atmosphericsF.glsl
+++ /dev/null
@@ -1,46 +0,0 @@
-/** 
- * @file class3\wl\atmosphericsF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-vec3 getAdditiveColor();
-vec3 getAtmosAttenuation();
-vec3 scaleSoftClipFrag(vec3 light);
-
-uniform int no_atmo;
-
-vec3 atmosFragLighting(vec3 light, vec3 additive, vec3 atten)
-{
-    if (no_atmo == 1)
-    {
-        return light;
-    }
-    light *= atten.r;
-    light += additive;
-    return light * 2.0;
-}
-
-vec3 atmosLighting(vec3 light)
-{
-    return atmosFragLighting(light, getAdditiveColor(), getAtmosAttenuation());
-}
diff --git a/indra/newview/app_settings/shaders/class3/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class3/windlight/atmosphericsV.glsl
deleted file mode 100644
index b76192d73f..0000000000
--- a/indra/newview/app_settings/shaders/class3/windlight/atmosphericsV.glsl
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * @file class3\wl\atmosphericsV.glsl
- *
- * $LicenseInfo:firstyear=2005&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2005, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
-
-// VARYING param funcs
-void setSunlitColor(vec3 v);
-void setAmblitColor(vec3 v);
-void setAdditiveColor(vec3 v);
-void setAtmosAttenuation(vec3 v);
-void setPositionEye(vec3 v);
-
-vec3 getAdditiveColor();
-
-void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);
-
-void calcAtmospherics(vec3 inPositionEye) {
-
-    vec3 P = inPositionEye;
-    setPositionEye(P);
-    vec3 tmpsunlit = vec3(1);
-    vec3 tmpamblit = vec3(1);
-    vec3 tmpaddlit = vec3(1);
-    vec3 tmpattenlit = vec3(1);
-    calcAtmosphericVars(inPositionEye, vec3(0), 1, tmpsunlit, tmpamblit, tmpaddlit, tmpattenlit, true);
-    setSunlitColor(tmpsunlit);
-    setAmblitColor(tmpamblit);
-    setAdditiveColor(tmpaddlit);
-    setAtmosAttenuation(tmpattenlit);
-}
-
diff --git a/indra/newview/app_settings/shaders/class3/windlight/transportF.glsl b/indra/newview/app_settings/shaders/class3/windlight/transportF.glsl
deleted file mode 100644
index 545a32a227..0000000000
--- a/indra/newview/app_settings/shaders/class3/windlight/transportF.glsl
+++ /dev/null
@@ -1,68 +0,0 @@
-/** 
- * @file class3\wl\transportF.glsl
- *
- * $LicenseInfo:firstyear=2007&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2007, Linden Research, Inc.
- * 
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- * 
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- * 
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
- * $/LicenseInfo$
- */
- 
-//////////////////////////////////////////////////////////
-// The fragment shader for the terrain atmospherics
-//////////////////////////////////////////////////////////
-
-vec3 getAdditiveColor();
-vec3 getAtmosAttenuation();
-
-uniform int no_atmo;
-
-vec3 atmosTransportFrag(vec3 light, vec3 additive, vec3 atten)
-{
-    if (no_atmo == 1)
-    {
-        return light;
-    }
-    // fullbright responds minimally to atmos scatter effects 
-    light *= min(15.0 * atten.r, 1.0);
-    light += (0.1 * additive);
-    return light * 2.0;
-}
-
-vec3 atmosTransport(vec3 light)
-{
-     return atmosTransportFrag(light, getAdditiveColor(), getAtmosAttenuation());
-}
-
-vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten)
-{
-    float brightness = dot(light.rgb, vec3(0.33333));
-    return vec3(1,0,1);
-    //return atmosTransportFrag(light * 0.5, additive * (brightness * 0.5 + 0.5), atten);
-}
-
-vec3 fullbrightAtmosTransport(vec3 light)
-{
-    return atmosTransportFrag(light, getAdditiveColor(), getAtmosAttenuation());
-}
-
-vec3 fullbrightShinyAtmosTransport(vec3 light)
-{
-    float brightness = dot(light.rgb, vec3(0.33333));
-    return atmosTransportFrag(light * 0.5, getAdditiveColor() * (brightness * brightness), getAtmosAttenuation());
-}
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index b4807e8d35..8d07c6f8dd 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -150,7 +150,7 @@ void LLDrawPoolAlpha::renderPostDeferred(S32 pass)
 
     fullbright_shader   = (LLPipeline::sImpostorRender) ? &gDeferredFullbrightAlphaMaskProgram :
         (LLPipeline::sUnderWaterRender) ? &gDeferredFullbrightWaterProgram : &gDeferredFullbrightAlphaMaskProgram;
-    prepare_alpha_shader(fullbright_shader, true, false);
+    prepare_alpha_shader(fullbright_shader, true, true);
 
     simple_shader   = (LLPipeline::sImpostorRender) ? &gDeferredAlphaImpostorProgram :
         (LLPipeline::sUnderWaterRender) ? &gDeferredAlphaWaterProgram : &gDeferredAlphaProgram;
diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp
index 93e0f33177..293c9d7721 100644
--- a/indra/newview/llsettingsvo.cpp
+++ b/indra/newview/llsettingsvo.cpp
@@ -709,9 +709,8 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)
 
     LLColor4 ambient(getTotalAmbient());
 
-    gPipeline.adjustAmbient(this, ambient);
-    
     shader->uniform4fv(LLShaderMgr::AMBIENT, LLVector4(ambient.mV));
+    shader->uniform1f(LLShaderMgr::REFLECTION_PROBE_AMBIANCE, getReflectionProbeAmbiance());
 
     shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, getIsSunUp() ? 1 : 0);
     shader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, getSunMoonGlowFactor());
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index d1e5c8bd28..55f0164a30 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -1913,6 +1913,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
             shader->mFeatures.hasGamma = true;
             shader->mFeatures.hasTransport = true;
             shader->mFeatures.hasShadows = use_sun_shadow;
+            shader->mFeatures.hasReflectionProbes = true;
 
             if (mShaderLevel[SHADER_DEFERRED] < 1)
             {
@@ -1989,6 +1990,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
             shader->mFeatures.isAlphaLighting = true;
             shader->mFeatures.encodesNormal = true;
             shader->mFeatures.hasShadows = use_sun_shadow;
+            shader->mFeatures.hasReflectionProbes = true;
 
             if (mShaderLevel[SHADER_DEFERRED] < 1)
             {
@@ -2060,6 +2062,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
             shader[i]->mFeatures.hasGamma = true;
             shader[i]->mFeatures.hasTransport = true;
             shader[i]->mFeatures.hasShadows = use_sun_shadow;
+            shader[i]->mFeatures.hasReflectionProbes = true;
 
             if (mShaderLevel[SHADER_DEFERRED] < 1)
             {
@@ -2646,6 +2649,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
         gDeferredAvatarAlphaProgram.mFeatures.hasGamma = true;
         gDeferredAvatarAlphaProgram.mFeatures.isDeferred = true;
 		gDeferredAvatarAlphaProgram.mFeatures.hasShadows = true;
+        gDeferredAvatarAlphaProgram.mFeatures.hasReflectionProbes = true;
 
 		gDeferredAvatarAlphaProgram.mShaderFiles.clear();
         gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaV.glsl", GL_VERTEX_SHADER));
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 26989a477a..325a370f43 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -6235,22 +6235,6 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
 	}
 }
 
-void LLPipeline::adjustAmbient(const LLSettingsSky* sky, LLColor4& ambient)
-{
-    //bump ambient based on reflection probe ambiance of probes are disabled 
-    // so sky settings that rely on probes for ambiance don't go completely dark
-    // on low end hardware
-    if (!LLPipeline::sReflectionProbesEnabled)
-    {
-        F32 ambiance = linearTosRGB(sky->getReflectionProbeAmbiance());
-
-        for (int i = 0; i < 3; ++i)
-        {
-            ambient.mV[i] = llmax(ambient.mV[i], ambiance);
-        }
-    }
-}
-
 void LLPipeline::setupHWLights(LLDrawPool* pool)
 {
     LL_PROFILE_ZONE_SCOPED_CATEGORY_DRAWPOOL;
@@ -6261,8 +6245,7 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
 
     // Ambient
     LLColor4 ambient = psky->getTotalAmbient();
-    adjustAmbient(psky.get(), ambient);
-    
+
 	gGL.setAmbientLightColor(ambient);
 
     bool sun_up  = environment.getIsSunUp();
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 58857e4176..0b6b7d91ae 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -332,7 +332,6 @@ public:
 	S32  getLightCount() const { return mLights.size(); }
 
 	void calcNearbyLights(LLCamera& camera);
-    void adjustAmbient(const LLSettingsSky* sky, LLColor4& ambient);
 	void setupHWLights(LLDrawPool* pool);
 	void setupAvatarLights(bool for_edit = false);
 	void enableLights(U32 mask);
-- 
cgit v1.2.3