diff options
Diffstat (limited to 'indra/newview')
29 files changed, 572 insertions, 224 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 28fed67cb2..1138410a07 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -12356,6 +12356,39 @@        <key>Value</key>        <integer>0</integer>      </map> +  <key>AmbientDisable</key> +  <map> +    <key>Comment</key> +    <string>If TRUE, ambient light has no effect</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map> +  <key>SunlightDisable</key> +  <map> +    <key>Comment</key> +    <string>If TRUE, sunlight has no effect</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map> +  <key>LocalLightDisable</key> +  <map> +    <key>Comment</key> +    <string>If TRUE, local lights have no effect</string> +    <key>Persist</key> +    <integer>1</integer> +    <key>Type</key> +    <string>Boolean</string> +    <key>Value</key> +    <integer>0</integer> +  </map>      <key>TextureDiscardLevel</key>      <map>        <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index b439fbbff6..4a12659d56 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -88,58 +88,49 @@ float getAmbientClamp();  vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 diffuse, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, float ambiance)  { -    //get light vector -    vec3 lv = lp.xyz-v; - -    vec4 proj_tc = proj_mat * lp; - -    //get distance -    float d = length(lv); -    float da = 1.0; -    vec3 col = vec3(0); -    if (proj_tc.z < 0 -     || proj_tc.z > 1 -     || proj_tc.x < 0 -     || proj_tc.x > 1 -     || proj_tc.y < 0 -     || proj_tc.y > 1) -    { -        return col; -    } +	//get light vector +	vec3 lv = lp.xyz-v; -    if (d > 0.0) -    { -        //normalize light vector -        lv = normalize(lv); -        vec3 norm = normalize(n); +la /= 20.0f; -        da = dot(norm, lv); -        da = clamp(da, 0.0, 1.0); -  -        //distance attenuation -        float dist = (la > 0) ? d/la : 1.0f; -        fa += 1.0f; -        float dist_atten = (fa > 0) ? clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0) : 0.0f; -        dist_atten *= dist_atten; -        dist_atten *= 2.2f; +	//get distance +	float d = length(lv); +	 +	float da = 1.0; + +	vec3 col = vec3(0); + +	if (d > 0.0 && la > 0.0 && fa > 0.0) +	{ +		//normalize light vector +		lv = normalize(lv); +	 +		//distance attenuation +		float dist = d/la; +		float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); +		dist_atten *= dist_atten; +        dist_atten *= 2.0f; + +		// spotlight coefficient. +		float spot = max(dot(-ln, lv), is_pointlight); +		da *= spot*spot; // GL_SPOT_EXPONENT=2 -        // spotlight coefficient. -        float spot = max(dot(-ln, lv), is_pointlight); -        da *= spot*spot; // GL_SPOT_EXPONENT=2 +		//angular attenuation +		da *= max(dot(n, lv), 0.0);		 -        // to match spotLight (but not multiSpotLight) *sigh* -        float lit = max(da * dist_atten,0.0); +		float lit = max(da * dist_atten,0.0); +ambiance = 0.0f;          float amb_da = ambiance;          if (lit > 0)          {              col = lit * light_col * diffuse;              amb_da += (da*0.5+0.5) * ambiance; -            amb_da += (da*da*0.5 + 0.5) * ambiance;          } +        amb_da += (da*da*0.5 + 0.5) * ambiance;          amb_da *= dist_atten;          amb_da = min(amb_da, 1.0f - lit); -        col.rgb += amb_da * 0.5 * light_col * diffuse; +        col.rgb += amb_da * light_col * diffuse;          // no spec for alpha shader...      } @@ -217,21 +208,27 @@ void main()      vec4 color = vec4(0.0); -    color.rgb = amblit;      color.a   = final_alpha;      float ambient = da;      ambient *= 0.5;      ambient *= ambient; -    ambient = min(getAmbientClamp(), 1.0 - ambient); + +    float ambient_clamp = getAmbientClamp() + 0.1; +    ambient = (1.0 - ambient) * ambient_clamp;      vec3 sun_contrib = min(final_da, shadow) * sunlit; +#if !defined(AMBIENT_KILL) +    color.rgb = amblit;      color.rgb *= ambient; +#endif  vec3 post_ambient = color.rgb; +#if !defined(SUNLIGHT_KILL)      color.rgb += sun_contrib; +#endif  vec3 post_sunlight = color.rgb; @@ -249,7 +246,7 @@ vec3 post_atmo = color.rgb;      // to linear!      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 * 0.5); +   #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)      LIGHT_LOOP(2) @@ -260,7 +257,9 @@ vec3 post_atmo = color.rgb;      LIGHT_LOOP(7)      // sum local light contrib in linear colorspace +#if !defined(LOCAL_LIGHT_KILL)      color.rgb += light.rgb; +#endif      // back to sRGB as we're going directly to the final RT post-deferred gamma correction      color.rgb = linear_to_srgb(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index 0880a73b26..1c0516923e 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -88,17 +88,19 @@ float getAmbientClamp();  vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spec, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, inout float glare, float ambiance)  { -    //get light vector -    vec3 lv = lp.xyz-v; -     -    //get distance -    float d = length(lv); -     -    float da = 1.0; +	vec3 col = vec3(0); + +la /= 20.0f; -    vec3 col = vec3(0,0,0); +	//get light vector +	vec3 lv = lp.xyz-v; +	 +	//get distance +	float d = length(lv); +	 +	float da = 1.0; -    vec4 proj_tc = proj_mat * lp; +    /*vec4 proj_tc = proj_mat * lp;      if (proj_tc.z < 0       || proj_tc.z > 1 @@ -108,76 +110,68 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe       || proj_tc.y > 1)      {          return col; -    } - -    if (d > 0.0) -    { -        //normalize light vector -        lv = normalize(lv); -     -        //distance attenuation -        float dist = (la > 0) ? d/la : 1.0f; -        fa += 1.0f; -        float dist_atten = ( fa > 0) ? clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0) : 1.0f; -        dist_atten *= dist_atten; -        dist_atten *= 2.2f; - -        if (dist_atten <= 0) -        { -            return col; -        } - -        // spotlight coefficient. -        float spot = max(dot(-ln, lv), is_pointlight); - -        //angular attenuation -        da = dot(n, lv); -        da = clamp(da, 0.0, 1.0); - -        da *= spot*spot; // GL_SPOT_EXPONENT=2 - -        float lit = max(da * dist_atten, 0.0); +    }*/ + +	if (d > 0.0 && la > 0.0 && fa > 0.0) +	{ +		//normalize light vector +		lv = normalize(lv); +	 +		//distance attenuation +		float dist = d/la; +		float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); +		dist_atten *= dist_atten; +        dist_atten *= 2.0f; + +		// spotlight coefficient. +		float spot = max(dot(-ln, lv), is_pointlight); +		da *= spot*spot; // GL_SPOT_EXPONENT=2 + +		//angular attenuation +		da *= max(dot(n, lv), 0.0);		 +		 +		float lit = max(da * dist_atten, 0.0);          float amb_da = ambiance; -        if (da > 0) -        { +        if (lit > 0) +        {                          col = light_col*lit*diffuse;              amb_da += (da*0.5 + 0.5) * ambiance; -            amb_da += (da*da*0.5+0.5) * ambiance;          } +        amb_da += (da*da*0.5+0.5) * ambiance;          amb_da *= dist_atten;          amb_da = min(amb_da, 1.0f - lit); -        col.rgb += amb_da * 0.25 * light_col * diffuse; - -        if (spec.a > 0.0) -        { -            //vec3 ref = dot(pos+lv, norm); -            vec3 h = normalize(lv+npos); -            float nh = dot(n, h); -            float nv = dot(n, npos); -            float vh = dot(npos, h); -            float sa = nh; -            float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; - -            float gtdenom = 2 * nh; -            float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); -                                 -            if (nh > 0.0) -            { -                float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); -                vec3 speccol = lit*scol*light_col.rgb*spec.rgb; +        col.rgb += amb_da * light_col * diffuse; + +		if (spec.a > 0.0) +		{ +			//vec3 ref = dot(pos+lv, norm); +			vec3 h = normalize(lv+npos); +			float nh = dot(n, h); +			float nv = dot(n, npos); +			float vh = dot(npos, h); +			float sa = nh; +			float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; + +			float gtdenom = 2 * nh; +			float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); +								 +			if (nh > 0.0) +			{ +				float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); +				vec3 speccol = lit*scol*light_col.rgb*spec.rgb;                  speccol = clamp(speccol, vec3(0), vec3(1)); -                col += speccol; +				col += speccol; -                float cur_glare = max(speccol.r, speccol.g); -                cur_glare = max(cur_glare, speccol.b); -                glare = max(glare, speccol.r); -                glare += max(cur_glare, 0.0); -            } -        } -    } +				float cur_glare = max(speccol.r, speccol.g); +				cur_glare = max(cur_glare, speccol.b); +				glare = max(glare, speccol.r); +				glare += max(cur_glare, 0.0); +			} +		} +	} -    return max(col, vec3(0.0,0.0,0.0));  +	return max(col, vec3(0.0,0.0,0.0));	  }  #else @@ -320,16 +314,22 @@ void main()      float ambient = da;      ambient *= 0.5;      ambient *= ambient; -    ambient = min(getAmbientClamp(), 1.0 - ambient); + +    float ambient_clamp = getAmbientClamp() + 0.1; +    ambient = (1.0 - ambient) * ambient_clamp;      vec3 sun_contrib = min(final_da, shadow) * sunlit; +#if !defined(AMBIENT_KILL)      color.rgb = amblit;      color.rgb *= ambient; +#endif  vec3 post_ambient = color.rgb; +#if !defined(SUNLIGHT_KILL)      color.rgb += sun_contrib; +#endif  vec3 post_sunlight = color.rgb; @@ -395,7 +395,7 @@ vec3 post_atmo = color.rgb;      vec3 light = vec3(0,0,0); - #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse_linear.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); + #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse_linear.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 );          LIGHT_LOOP(1)          LIGHT_LOOP(2) @@ -405,11 +405,12 @@ vec3 post_atmo = color.rgb;          LIGHT_LOOP(6)          LIGHT_LOOP(7) -      glare = min(glare, 1.0);      float al = max(diffuse_linear.a,glare)*vertex_color.a; +#if !defined(LOCAL_LIGHT_KILL)      color.rgb += light.rgb; +#endif      // (only) post-deferred needs inline gamma correction      color.rgb = linear_to_srgb(color.rgb); diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index 29298d7c07..367680556a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -61,6 +61,11 @@ vec3 getNorm(vec2 pos_screen);  void main()   { +	vec3 out_col = vec3(0,0,0); + +#if defined(LOCAL_LIGHT_KILL) +    discard; +#else  	vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res;  	vec3 pos = getPosition(frag.xy).xyz;  	if (pos.z < far_z) @@ -74,7 +79,6 @@ void main()  	vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb;  	float noise = texture2D(noiseMap, frag.xy/128.0).b; -	vec3 out_col = vec3(0,0,0);  	vec3 npos = normalize(-pos);  	// As of OSX 10.6.7 ATI Apple's crash when using a variable size loop @@ -130,7 +134,7 @@ void main()  		}  	}  	} -	 +#endif  	frag_color.rgb = out_col;  	frag_color.a = 0.0; diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index 2569e49743..c81d633880 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -72,10 +72,12 @@ uniform vec2 screen_res;  uniform mat4 inv_proj;  vec3 getNorm(vec2 pos_screen); +vec3 srgb_to_linear(vec3 c);  vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); +	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -95,6 +97,7 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); +	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -112,6 +115,7 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); +	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = tc-vec2(0.5); @@ -126,6 +130,11 @@ vec4 getPosition(vec2 pos_screen);  void main()   { +	vec3 col = vec3(0,0,0); + +#if defined(LOCAL_LIGHT_KILL) +    discard; +#else  	vec4 frag = vary_fragcoord;  	frag.xyz /= frag.w;  	frag.xyz = frag.xyz*0.5+0.5; @@ -167,7 +176,6 @@ void main()  	lv = normalize(lv);  	float da = dot(norm, lv); -	vec3 col = vec3(0,0,0);  	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb;  	vec3 dlit = vec3(0, 0, 0); @@ -263,7 +271,8 @@ void main()  			}  		}  	} -	 +#endif +  	frag_color.rgb = col;	  	frag_color.a = 0.0;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl index f8264d971c..73bc1141b0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl @@ -124,7 +124,7 @@ void main()      {          discard;      } -         +//col.rgb = vec3(0);              frag_color.rgb = col;         frag_color.a = 0.0;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index c81d0f97da..c7426788c4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -106,16 +106,23 @@ void main()          float ambient = da;          ambient *= 0.5;          ambient *= ambient; -        ambient = min(getAmbientClamp(), 1.0 - ambient); + +        ambient = (1.0 - ambient); +        float ambient_clamp = getAmbientClamp() + 0.1; +        ambient *= ambient_clamp;          vec3 sun_contrib = final_da * sunlit; +#if !defined(AMBIENT_KILL)          color.rgb = amblit;          color.rgb *= ambient; +#endif  vec3 post_ambient = color.rgb; +#if !defined(SUNLIGHT_KILL)          color.rgb += sun_contrib; +#endif  vec3 post_sunlight = color.rgb; @@ -153,7 +160,7 @@ vec3 post_diffuse = color.rgb;   vec3 post_spec = color.rgb;  #ifndef WATER_FOG -        color.rgb = mix(color.rgb, diffuse_srgb.rgb, diffuse_srgb.a); +        color.rgb += diffuse_srgb.rgb * diffuse_srgb.a;  #endif          if (envIntensity > 0.0) @@ -179,11 +186,10 @@ vec3 post_atmo = color.rgb;              bloom = fogged.a;          #endif +// srgb colorspace debuggables  //color.rgb = amblit; -//color.rgb = vec3(ambient);  //color.rgb = sunlit;  //color.rgb = post_ambient; -//color.rgb = vec3(final_da);  //color.rgb = sun_contrib;  //color.rgb = post_sunlight;  //color.rgb = diffuse_srgb.rgb; @@ -197,6 +203,11 @@ vec3 post_atmo = color.rgb;          color.rgb = srgb_to_linear(color.rgb);      } +// linear debuggables +//color.rgb = vec3(final_da); +//color.rgb = vec3(ambient); +//color.rgb = vec3(scol); +      frag_color.rgb = color.rgb;      frag_color.a = bloom;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index d09bc25334..55c740d100 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -71,10 +71,12 @@ uniform vec2 screen_res;  uniform mat4 inv_proj;  vec3 getNorm(vec2 pos_screen); +vec3 srgb_to_linear(vec3 c);  vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); +	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -94,6 +96,7 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); +	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -111,6 +114,7 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); +	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = tc-vec2(0.5); @@ -125,6 +129,11 @@ vec4 getPosition(vec2 pos_screen);  void main()   { +	vec3 col = vec3(0,0,0); + +#if defined(LOCAL_LIGHT_KILL) +    discard; +#else  	vec4 frag = vary_fragcoord;  	frag.xyz /= frag.w;  	frag.xyz = frag.xyz*0.5+0.5; @@ -138,12 +147,10 @@ void main()  	{  		discard;  	} -	  	vec3 norm = texture2DRect(normalMap, frag.xy).xyz;  	float envIntensity = norm.z;  	norm = getNorm(frag.xy); -	  	norm = normalize(norm);  	float l_dist = -dot(lv, proj_n); @@ -169,14 +176,9 @@ void main()  	lv = normalize(lv);  	float da = dot(norm, lv); -	vec3 col = vec3(0,0,0); -		  	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; -		  	vec4 spec = texture2DRect(specularRect, frag.xy); -	 -  	float noise = texture2D(noiseMap, frag.xy/128.0).b;  	vec3 dlit = vec3(0, 0, 0); @@ -212,7 +214,6 @@ void main()  		amb_da = min(amb_da, 1.0-lit);  		col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a*diff_tex.rgb;  	} -	  	if (spec.a > 0.0)  	{ @@ -239,7 +240,6 @@ void main()  		}  	}	 -  	if (envIntensity > 0.0)  	{  		vec3 ref = reflect(normalize(pos), norm); @@ -268,7 +268,8 @@ void main()  			}  		}  	} -	 +#endif +  	frag_color.rgb = col;	  	frag_color.a = 0.0;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl index 914e17beed..2235ab12a4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl @@ -129,8 +129,7 @@ void main()      vec4 refcol = refcol1 + refcol2 + refcol3;      float df1 = df.x + df.y + df.z; -    df1 *= 0.333; -    refcol *= df1; +	refcol *= df1 * 0.333;      vec3 wavef = (wave1 + wave2 * 0.4 + wave3 * 0.6) * 0.5;      wavef.z *= max(-viewVec.z, 0.1); @@ -145,23 +144,35 @@ void main()      vec4 baseCol = texture2D(refTex, refvec4);      refcol = mix(baseCol*df2, refcol, dweight); - -    //figure out distortion vector (ripply)    -    vec2 distort2 = distort+wavef.xy*(refScale * 0.01)/max(dmod*df1, 1.0); -         -    vec4 fb = texture2D(screenTex, distort2); -  -    //mix with reflection -    // Note we actually want to use just df1, but multiplying by 0.999999 gets around an nvidia compiler bug -    color.rgb = mix(fb.rgb, refcol.rgb, df1 + 0.6); -    color.rgb *= 2.0f; -    color.rgb = scaleSoftClip(color.rgb); - -    vec4 pos = vary_position; +    refcol.rgb = srgb_to_linear(refcol.rgb); + +    //get specular component +	float spec = clamp(dot(lightDir, (reflect(viewVec,wavef))),0.0,1.0); +		 +	//harden specular +	spec = pow(spec, 128.0); + +	//figure out distortion vector (ripply)    +	vec2 distort2 = distort+wavef.xy*refScale/max(dmod*df1, 1.0); +		 +	vec4 fb = texture2D(screenTex, distort2); +	 +	//mix with reflection +	// Note we actually want to use just df1, but multiplying by 0.999999 gets around an nvidia compiler bug +	color.rgb = mix(fb.rgb, refcol.rgb, df1 * 0.4 + 0.6); +	 +	vec4 pos = vary_position; +	 +	color.rgb += spec * specular; +	 +	//color.rgb = atmosTransport(color.rgb); +	color.rgb = scaleSoftClip(color.rgb); + +	color.a   = spec * sunAngle2; -    vec3 screenspacewavef = normalize((norm_mat*vec4(wavef, 1.0)).xyz); +	vec3 screenspacewavef = normalize((norm_mat*vec4(wavef, 1.0)).xyz); -    frag_data[0] = vec4(color.rgb, 0); // diffuse -    frag_data[1] = vec4(specular * 0.5, 0.5);     // speccolor, spec -    frag_data[2] = vec4(encode_normal(screenspacewavef.xyz), 0.05, 0);// normalxy, 0, 0 +	frag_data[0] = vec4(color.rgb, color); // diffuse +	frag_data[1] = vec4(0);		// speccolor, spec +	frag_data[2] = vec4(encode_normal(screenspacewavef.xyz*0.5+0.5), 0.05, 0);// normalxy, 0, 0  } diff --git a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl index 3b0c81fc71..ddbe3ebe10 100644 --- a/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/terrainWaterF.glsl @@ -59,7 +59,10 @@ void main()  	vec4 outColor = mix( mix(color3, color2, alpha2), mix(color1, color0, alpha1), alphaFinal );  	/// Add WL Components -	outColor.rgb = atmosLighting(outColor.rgb * vertex_color.rgb); +	outColor.rgb *= vertex_color.rgb; + +    // SL-11260... +	//outColor.rgb = atmosLighting(outColor.rgb);  	outColor = applyWaterFog(outColor);  	frag_color = outColor; diff --git a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl index 043815c824..f033c0e7c4 100644 --- a/indra/newview/app_settings/shaders/class1/environment/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/waterF.glsl @@ -121,7 +121,6 @@ void main()      vec4 refcol = refcol1 + refcol2 + refcol3;      float df1 = df.x + df.y + df.z; -    df1 *= 0.3333;      refcol *= df1;      vec3 wavef = (wave1 + wave2 * 0.4 + wave3 * 0.6) * 0.5; @@ -151,11 +150,11 @@ void main()      //mix with reflection      // Note we actually want to use just df1, but multiplying by 0.999999 gets around and nvidia compiler bug -    color.rgb = mix(fb.rgb, refcol.rgb, df1 + 0.6); +    color.rgb = mix(fb.rgb, refcol.rgb, df1 * 0.4 + 0.6);      color.rgb += spec * specular; -    color.rgb = atmosTransport(color.rgb); -    color.rgb = scaleSoftClip(color.rgb); +    //color.rgb = atmosTransport(color.rgb); +    color.rgb = scaleSoftClip(color.rgb * 0.5);      color.a = spec * sunAngle2;  #if defined(WATER_EDGE) diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl index 38230836eb..5e39d1629d 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightV.glsl @@ -28,11 +28,16 @@  // All lights, no specular highlights  vec3 atmosAmbient();  vec4 sumLights(vec3 pos, vec3 norm, vec4 color); +float getAmbientClamp();  vec4 calcLighting(vec3 pos, vec3 norm, vec4 color)  {  	vec4 c = sumLights(pos, norm, color); -    c.rgb += atmosAmbient() * color.rgb * 0.5; + +#if !defined(AMBIENT_KILL) +    c.rgb += atmosAmbient() * color.rgb * 0.5 * getAmbientClamp(); +#endif +      return c;  } diff --git a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl index 761ac29ee2..0c3ea4231e 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/sumLightsV.glsl @@ -39,7 +39,15 @@ vec4 sumLights(vec3 pos, vec3 norm, vec4 color)  	col.rgb = light_diffuse[1].rgb * calcDirectionalLight(norm, light_position[1].xyz);  	col.rgb = scaleDownLight(col.rgb); + +#if defined(LOCAL_LIGHT_KILL) +    col.rgb = vec3(0); +#endif + +#if !defined(SUNLIGHT_KILL)  	col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, light_position[0].xyz)); +#endif +  	col.rgb = min(col.rgb*color.rgb, 1.0);  	return col;	  } diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index 68eb671e7c..55ffbdcc46 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -44,7 +44,7 @@ uniform float sun_moon_glow_factor;  float getAmbientClamp()  { -    return 0.45f; +    return 0.9;  }  void calcAtmosphericVars(vec3 inPositionEye, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten) { diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index 54ec534d14..bcce4c041a 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -72,20 +72,12 @@ uniform vec2 screen_res;  uniform mat4 inv_proj;  vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); -  vec3 getNorm(vec2 pos_screen); - -vec4 correctWithGamma(vec4 col) -{ -	return vec4(srgb_to_linear(col.rgb), col.a); -} -  vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  {      vec4 ret = texture2DLod(projectionMap, tc, lod); -    ret = correctWithGamma(ret); +    ret.rgb = srgb_to_linear(ret.rgb);      vec2 dist = vec2(0.5) - abs(tc-vec2(0.5));      float det = min(lod/(proj_lod*0.5), 1.0); @@ -104,7 +96,7 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  {      vec4 ret = texture2DLod(projectionMap, tc, lod); -    ret = correctWithGamma(ret); +    ret.rgb = srgb_to_linear(ret.rgb);      vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -122,7 +114,7 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  {      vec4 ret = texture2DLod(projectionMap, tc, lod); -    ret = correctWithGamma(ret); +    ret.rgb = srgb_to_linear(ret.rgb);      vec2 dist = tc-vec2(0.5); @@ -137,6 +129,12 @@ vec4 getPosition(vec2 pos_screen);  void main()   { + +    vec3 col = vec3(0,0,0); + +#if defined(LOCAL_LIGHT_KILL) +    discard; +#else      vec4 frag = vary_fragcoord;      frag.xyz /= frag.w;      frag.xyz = frag.xyz*0.5+0.5; @@ -191,8 +189,6 @@ void main()      lv = proj_origin-pos.xyz;      lv = normalize(lv);      float da = dot(norm, lv); - -    vec3 col = vec3(0,0,0);      vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; @@ -292,6 +288,7 @@ void main()              }          }      } +#endif      //not sure why, but this line prevents MATBUG-194      col = max(col, vec3(0.0)); diff --git a/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl index eb95890e08..dca2862b5a 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl @@ -88,6 +88,7 @@ vec3 halo22(float d)  /// Soft clips the light with a gamma correction  vec3 scaleSoftClip(vec3 light); +vec3 srgb_to_linear(vec3 c);  void main()  { @@ -194,10 +195,12 @@ void main()      color.rgb += halo_22; -    color *= 2.; +    color.rgb *= 2.; +    color.rgb = scaleSoftClip(color.rgb); +    color.rgb = srgb_to_linear(color.rgb);      /// Gamma correct for WL (soft clip effect). -    frag_data[0] = vec4(scaleSoftClip(color.rgb), 1.0); +    frag_data[0] = vec4(color.rgb, 1.0);      frag_data[1] = vec4(0.0,0.0,0.0,0.0);      frag_data[2] = vec4(0.5,0.5,0.0,1.0); //1.0 in norm.w masks off fog  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 1b2b835ad1..7f83e168bb 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -24,6 +24,7 @@   */  #extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_shader_texture_lod : enable  /*[EXTRA_CODE_HERE]*/ @@ -87,14 +88,11 @@ void main()      float da = dot(normalize(norm.xyz), light_dir.xyz);            da = clamp(da, -1.0, 1.0); -     -      float final_da = da;            final_da = clamp(final_da, 0.0, 1.0); -    vec4 diffuse_srgb   = texture2DRect(diffuseRect, tc); -    vec4 diffuse_linear = vec4(srgb_to_linear(diffuse_srgb.rgb), diffuse_srgb.a); -  +    vec4 diffuse_linear = texture2DRect(diffuseRect, tc); +    vec4 diffuse_srgb   = vec4(linear_to_srgb(diffuse_linear.rgb), diffuse_linear.a);      // clamping to alpha value kills underwater shadows...      //scol = max(scol_ambocc.r, diffuse_linear.a); @@ -116,20 +114,27 @@ void main()          float ambient = da;          ambient *= 0.5;          ambient *= ambient; -        ambient = min(getAmbientClamp(), 1.0 - ambient); + +        float ambient_clamp = getAmbientClamp() + 0.1; +        ambient = (1.0 - ambient); +        ambient *= ambient_clamp;          vec3 sun_contrib = min(scol, final_da) * sunlit; +#if !defined(AMBIENT_KILL)          color.rgb = amblit;          color.rgb *= ambient; +#endif  vec3 post_ambient = color.rgb; +#if !defined(SUNLIGHT_KILL)          color.rgb += sun_contrib; +#endif  vec3 post_sunlight = color.rgb; -        color.rgb *= diffuse_srgb.rgb; +        color.rgb *= diffuse_linear.rgb;  vec3 post_diffuse = color.rgb; @@ -155,7 +160,7 @@ vec3 post_diffuse = color.rgb;                  float scontrib = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);                  vec3 sp = sun_contrib*scontrib / 16.0;                  sp = clamp(sp, vec3(0), vec3(1)); -                bloom += dot (sp, sp) / 6.0; +                bloom += dot(sp, sp) / 6.0;                  color += sp * spec.rgb;              }          } @@ -163,7 +168,7 @@ vec3 post_diffuse = color.rgb;   vec3 post_spec = color.rgb;  #ifndef WATER_FOG -        color.rgb += diffuse_srgb.a * diffuse_srgb.rgb; +        color.rgb = mix(color.rgb, diffuse_srgb.rgb, diffuse_srgb.a);  #endif          if (envIntensity > 0.0) diff --git a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index 2ef7cffe9d..77f6e6f7ac 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -73,15 +73,11 @@ uniform mat4 inv_proj;  vec3 getNorm(vec2 pos_screen);  vec3 srgb_to_linear(vec3 c); -vec4 correctWithGamma(vec4 col) -{ -	return vec4(srgb_to_linear(col.rgb), col.a); -}  vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret = correctWithGamma(ret); +	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -101,7 +97,7 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret = correctWithGamma(ret); +	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); @@ -119,7 +115,7 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret = correctWithGamma(ret); +	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = tc-vec2(0.5); @@ -134,6 +130,11 @@ vec4 getPosition(vec2 pos_screen);  void main()   { +	vec3 col = vec3(0,0,0); + +#if defined(LOCAL_LIGHT_KILL) +    discard; +#else  	vec4 frag = vary_fragcoord;  	frag.xyz /= frag.w;  	frag.xyz = frag.xyz*0.5+0.5; @@ -174,8 +175,8 @@ void main()  	proj_tc.xyz /= proj_tc.w; -	float fa = falloff + 1.0; -	float dist_atten = min(1.0 - (dist - 1.0 * (1.0 - fa)) / fa, 1.0); +	float fa = falloff+1.0; +	float dist_atten = min(1.0-(dist-1.0*(1.0-fa))/fa, 1.0);  	dist_atten *= dist_atten;  	dist_atten *= 2.0; @@ -187,14 +188,9 @@ void main()  	lv = proj_origin-pos.xyz;  	lv = normalize(lv);  	float da = dot(norm, lv); -	      da = clamp(da, 0.0, 1.0); -	 -	vec3 col = vec3(0,0,0);  	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; -		  	vec4 spec = texture2DRect(specularRect, frag.xy); -  	vec3 dlit = vec3(0, 0, 0);  	float noise = texture2D(noiseMap, frag.xy/128.0).b; @@ -232,7 +228,6 @@ void main()  	    col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;  	} -	  	if (spec.a > 0.0)  	{ @@ -258,10 +253,6 @@ void main()  			col += speccol;  		}  	}	 -	 -	 -	 -	  	if (envIntensity > 0.0)  	{ @@ -291,6 +282,7 @@ void main()  			}  		}  	} +#endif  	//not sure why, but this line prevents MATBUG-194  	col = max(col, vec3(0.0)); diff --git a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl index 57f93a8b36..8795d69a3a 100644 --- a/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl +++ b/indra/newview/app_settings/shaders/class2/lighting/sumLightsV.glsl @@ -44,9 +44,16 @@ vec4 sumLights(vec3 pos, vec3 norm, vec4 color)  	col.rgb += light_diffuse[3].rgb*calcPointLightOrSpotLight(pos.xyz, norm, light_position[3], light_direction[3], light_attenuation[3].x, light_attenuation[3].z);  	col.rgb = scaleDownLight(col.rgb); +#if defined(LOCAL_LIGHT_KILL) +    col.rgb = vec3(0); +i#endif +  	// Add windlight lights  	col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, light_position[0].xyz)); +#if !defined(SUNLIGHT_KILL)  	col.rgb = min(col.rgb*color.rgb, 1.0); +#endif +  	return col;	  } diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl index 28d185b9af..02e10b7b50 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/skyF.glsl @@ -50,7 +50,6 @@ void main()  	vec4 color;  	color = vary_HazeColor;  	color *= 2.; -  	/// Gamma correct for WL (soft clip effect).  	frag_color.rgb = scaleSoftClip(color.rgb);  	frag_color.a = 1.0; diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl index a23a5d4076..5b1eb55e0c 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl @@ -88,7 +88,7 @@ void main()  	vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;  	vec4 light_atten; -    float dens_mul = density_multiplier * 0.45; +    float dens_mul = density_multiplier;  	// Sunlight attenuation effect (hue and brightness) due to atmosphere  	// this is used later for sunlight modulation at various altitudes diff --git a/indra/newview/app_settings/shaders/class3/lighting/lightV.glsl b/indra/newview/app_settings/shaders/class3/lighting/lightV.glsl index 48c883d98a..eca8515212 100644 --- a/indra/newview/app_settings/shaders/class3/lighting/lightV.glsl +++ b/indra/newview/app_settings/shaders/class3/lighting/lightV.glsl @@ -28,11 +28,16 @@  // All lights, no specular highlights  vec3 atmosAmbient();  vec4 sumLights(vec3 pos, vec3 norm, vec4 color); +float getAmbientClamp();  vec4 calcLighting(vec3 pos, vec3 norm, vec4 color)  {  	vec4 c = sumLights(pos, norm, color); -    c.rgb += atmosAmbient() * color.rgb; + +#if !defined(AMBIENT_KILL) +    c.rgb += atmosAmbient() * color.rgb * getAmbientClamp(); +#endif +      return c;   } diff --git a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl index 81da6688c2..38dd850296 100644 --- a/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl +++ b/indra/newview/app_settings/shaders/class3/lighting/sumLightsV.glsl @@ -51,8 +51,15 @@ vec4 sumLights(vec3 pos, vec3 norm, vec4 color)  	col.rgb += light_diffuse[1].rgb*calcDirectionalLight(norm, light_position[1].xyz);      col.rgb = scaleDownLight(col.rgb); +#if defined(LOCAL_LIGHT_KILL) +    col.rgb = vec3(0); +#endif +  	// Add windlight lights +#if !defined(SUNLIGHT_KILL)  	col.rgb += atmosAffectDirectionalLight(calcDirectionalLight(norm, light_position[0].xyz)); +#endif +  	col.rgb = min(col.rgb*color.rgb, 1.0);  	return col;	 diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp index b0ee8e7fcb..46411ac13d 100644 --- a/indra/newview/llmachineid.cpp +++ b/indra/newview/llmachineid.cpp @@ -263,6 +263,7 @@ S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len)      if (has_static_unique_id)      {          memcpy ( unique_id, &static_unique_id, len); +#if LL_LOG_MACHINE_ID          LL_INFOS_ONCE("AppInit") << "UniqueID: 0x";          // Code between here and LL_ENDL is not executed unless the LL_DEBUGS          // actually produces output @@ -276,6 +277,7 @@ S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len)          }          // Reset default output formatting to avoid nasty surprises!          LL_CONT << std::dec << std::setw(0) << std::setfill(' ') << LL_ENDL; +#endif          return 1;      }      return 0; diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp index 387644fa57..11d7eb1c35 100644 --- a/indra/newview/llsettingsvo.cpp +++ b/indra/newview/llsettingsvo.cpp @@ -682,8 +682,8 @@ void LLSettingsVOSky::applySpecial(void *ptarget)          LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky(); -        LLColor4 sunDiffuse = psky->getSunDiffuse(); -        LLColor4 moonDiffuse = psky->getMoonDiffuse(); +        LLColor4 sunDiffuse = psky->getSunlightColor(); +        LLColor4 moonDiffuse = psky->getMoonlightColor();          F32 max_color = llmax(sunDiffuse.mV[0], sunDiffuse.mV[1], sunDiffuse.mV[2]);          if (max_color > 1.f) diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index d791c927a4..2f9cc3acff 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -7389,6 +7389,8 @@ void handle_dump_attachments(void*)  // these are used in the gl menus to set control values, generically.  class LLToggleControl : public view_listener_t  { +protected: +  	bool handleEvent(const LLSD& userdata)  	{  		std::string control_name = userdata.asString(); @@ -7465,6 +7467,24 @@ class LLAdvancedClickRenderBenchmark: public view_listener_t  	}  }; +// these are used in the gl menus to set control values that require shader recompilation +class LLToggleShaderControl : public view_listener_t +{ +	bool handleEvent(const LLSD& userdata) +	{ +        std::string control_name = userdata.asString(); +		BOOL checked = gSavedSettings.getBOOL( control_name ); +		gSavedSettings.setBOOL( control_name, !checked ); +        LLPipeline::refreshCachedSettings(); +        //gPipeline.updateRenderDeferred(); +		//gPipeline.releaseGLBuffers(); +		//gPipeline.createGLBuffers(); +		//gPipeline.resetVertexBuffers(); +        LLViewerShaderMgr::instance()->setShaders(); +		return !checked; +	} +}; +  void menu_toggle_attached_lights(void* user_data)  {  	LLPipeline::sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights"); @@ -9268,6 +9288,7 @@ void initialize_menus()  	view_listener_t::addMenu(new LLShowAgentProfile(), "ShowAgentProfile");  	view_listener_t::addMenu(new LLToggleAgentProfile(), "ToggleAgentProfile");  	view_listener_t::addMenu(new LLToggleControl(), "ToggleControl"); +    view_listener_t::addMenu(new LLToggleShaderControl(), "ToggleShaderControl");  	view_listener_t::addMenu(new LLCheckControl(), "CheckControl");  	view_listener_t::addMenu(new LLGoToObject(), "GoToObject");  	commit.add("PayObject", boost::bind(&handle_give_money_dialog)); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index e0253c8a5c..ea43203f1c 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -927,7 +927,7 @@ BOOL LLViewerShaderMgr::loadBasicShaders()  	if (gGLManager.mIsMobileGF)  		sum_lights_class = 3;  #endif -	 +  	// Use the feature table to mask out the max light level to use.  Also make sure it's at least 1.  	S32 max_light_class = gSavedSettings.getS32("RenderShaderLightingMaxLevel");  	sum_lights_class = llclamp(sum_lights_class, 1, max_light_class); @@ -959,6 +959,25 @@ BOOL LLViewerShaderMgr::loadBasicShaders()  	attribs["MAX_JOINTS_PER_MESH_OBJECT"] =   		boost::lexical_cast<std::string>(LLSkinningUtil::getMaxJointCount()); +    BOOL ambient_kill = gSavedSettings.getBOOL("AmbientDisable"); +	BOOL sunlight_kill = gSavedSettings.getBOOL("SunlightDisable"); +    BOOL local_light_kill = gSavedSettings.getBOOL("LocalLightDisable"); + +    if (ambient_kill) +    { +        attribs["AMBIENT_KILL"] = "1"; +    } + +    if (sunlight_kill) +    { +        attribs["SUNLIGHT_KILL"] = "1"; +    } + +    if (local_light_kill) +    { +       attribs["LOCAL_LIGHT_KILL"] = "1"; +    } +  	// We no longer have to bind the shaders to global glhandles, they are automatically added to a map now.  	for (U32 i = 0; i < shaders.size(); i++)  	{ @@ -1095,6 +1114,7 @@ BOOL LLViewerShaderMgr::loadShadersWater()  		gWaterProgram.mFeatures.calculatesAtmospherics = true;  		gWaterProgram.mFeatures.hasGamma = true;  		gWaterProgram.mFeatures.hasTransport = true; +        gWaterProgram.mFeatures.hasSrgb = true;  		gWaterProgram.mShaderFiles.clear();  		gWaterProgram.mShaderFiles.push_back(make_pair("environment/waterV.glsl", GL_VERTEX_SHADER_ARB));  		gWaterProgram.mShaderFiles.push_back(make_pair("environment/waterF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1111,6 +1131,7 @@ BOOL LLViewerShaderMgr::loadShadersWater()  		gWaterEdgeProgram.mFeatures.calculatesAtmospherics = true;  		gWaterEdgeProgram.mFeatures.hasGamma = true;  		gWaterEdgeProgram.mFeatures.hasTransport = true; +        gWaterEdgeProgram.mFeatures.hasSrgb = true;  		gWaterEdgeProgram.mShaderFiles.clear();  		gWaterEdgeProgram.mShaderFiles.push_back(make_pair("environment/waterV.glsl", GL_VERTEX_SHADER_ARB));  		gWaterEdgeProgram.mShaderFiles.push_back(make_pair("environment/waterF.glsl", GL_FRAGMENT_SHADER_ARB)); @@ -1230,6 +1251,10 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  {      bool use_sun_shadow = mShaderLevel[SHADER_DEFERRED] > 1; +    BOOL ambient_kill = gSavedSettings.getBOOL("AmbientDisable"); +	BOOL sunlight_kill = gSavedSettings.getBOOL("SunlightDisable"); +    BOOL local_light_kill = gSavedSettings.getBOOL("LocalLightDisable"); +  	if (mShaderLevel[SHADER_DEFERRED] == 0)  	{  		gDeferredTreeProgram.unload(); @@ -1455,6 +1480,22 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		{  			gDeferredSkinnedAlphaProgram.addPermutation("HAS_SHADOW", "1");  		} + +        if (ambient_kill) +        { +            gDeferredSkinnedAlphaProgram.addPermutation("AMBIENT_KILL", "1"); +        } + +        if (sunlight_kill) +        { +            gDeferredSkinnedAlphaProgram.addPermutation("SUNLIGHT_KILL", "1"); +        } + +        if (local_light_kill) +        { +            gDeferredSkinnedAlphaProgram.addPermutation("LOCAL_LIGHT_KILL", "1"); +        } +  		success = gDeferredSkinnedAlphaProgram.createShader(NULL, NULL);  		llassert(success); @@ -1523,6 +1564,21 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  				gDeferredMaterialProgram[i].addPermutation("HAS_SPECULAR_MAP", "1");  			} +            if (ambient_kill) +            { +                gDeferredMaterialProgram[i].addPermutation("AMBIENT_KILL", "1"); +            } + +            if (sunlight_kill) +            { +                gDeferredMaterialProgram[i].addPermutation("SUNLIGHT_KILL", "1"); +            } + +            if (local_light_kill) +            { +                gDeferredMaterialProgram[i].addPermutation("LOCAL_LIGHT_KILL", "1"); +            } +              gDeferredMaterialProgram[i].addPermutation("DIFFUSE_ALPHA_MODE", llformat("%d", alpha_mode));              if (use_sun_shadow) @@ -1591,6 +1647,21 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()              }              gDeferredMaterialWaterProgram[i].addPermutation("WATER_FOG","1"); +            if (ambient_kill) +            { +                gDeferredMaterialWaterProgram[i].addPermutation("AMBIENT_KILL", "1"); +            } + +            if (sunlight_kill) +            { +                gDeferredMaterialWaterProgram[i].addPermutation("SUNLIGHT_KILL", "1"); +            } + +            if (local_light_kill) +            { +                gDeferredMaterialWaterProgram[i].addPermutation("LOCAL_LIGHT_KILL", "1"); +            } +              gDeferredMaterialWaterProgram[i].mFeatures.hasWaterFog = true;              gDeferredMaterialWaterProgram[i].mFeatures.hasSrgb = true;              gDeferredMaterialWaterProgram[i].mFeatures.encodesNormal = true; @@ -1679,6 +1750,23 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredLightProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; +        gDeferredLightProgram.clearPermutations(); + +        if (ambient_kill) +        { +            gDeferredLightProgram.addPermutation("AMBIENT_KILL", "1"); +        } + +        if (sunlight_kill) +        { +            gDeferredLightProgram.addPermutation("SUNLIGHT_KILL", "1"); +        } + +        if (local_light_kill) +        { +            gDeferredLightProgram.addPermutation("LOCAL_LIGHT_KILL", "1"); +        } +  		success = gDeferredLightProgram.createShader(NULL, NULL);          llassert(success);  	} @@ -1691,11 +1779,28 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  			gDeferredMultiLightProgram[i].mFeatures.isDeferred = true;  			gDeferredMultiLightProgram[i].mFeatures.hasShadows = true; +            gDeferredMultiLightProgram[i].clearPermutations();  			gDeferredMultiLightProgram[i].mShaderFiles.clear();  			gDeferredMultiLightProgram[i].mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));  			gDeferredMultiLightProgram[i].mShaderFiles.push_back(make_pair("deferred/multiPointLightF.glsl", GL_FRAGMENT_SHADER_ARB));  			gDeferredMultiLightProgram[i].mShaderLevel = mShaderLevel[SHADER_DEFERRED];  			gDeferredMultiLightProgram[i].addPermutation("LIGHT_COUNT", llformat("%d", i+1)); + +            if (ambient_kill) +            { +                gDeferredMultiLightProgram[i].addPermutation("AMBIENT_KILL", "1"); +            } + +            if (sunlight_kill) +            { +                gDeferredMultiLightProgram[i].addPermutation("SUNLIGHT_KILL", "1"); +            } + +            if (local_light_kill) +            { +                gDeferredMultiLightProgram[i].addPermutation("LOCAL_LIGHT_KILL", "1"); +            } +  			success = gDeferredMultiLightProgram[i].createShader(NULL, NULL);              llassert(success);  		} @@ -1709,10 +1814,26 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredSpotLightProgram.mFeatures.isDeferred = true;  		gDeferredSpotLightProgram.mFeatures.hasShadows = true; +        gDeferredSpotLightProgram.clearPermutations();  		gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/pointLightV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/spotLightF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredSpotLightProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; +        if (ambient_kill) +        { +            gDeferredSpotLightProgram.addPermutation("AMBIENT_KILL", "1"); +        } + +        if (sunlight_kill) +        { +            gDeferredSpotLightProgram.addPermutation("SUNLIGHT_KILL", "1"); +        } + +        if (local_light_kill) +        { +            gDeferredSpotLightProgram.addPermutation("LOCAL_LIGHT_KILL", "1"); +        } +  		success = gDeferredSpotLightProgram.createShader(NULL, NULL);          llassert(success);  	} @@ -1724,11 +1845,17 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredMultiSpotLightProgram.mFeatures.isDeferred = true;  		gDeferredMultiSpotLightProgram.mFeatures.hasShadows = true; +        gDeferredMultiSpotLightProgram.clearPermutations();  		gDeferredMultiSpotLightProgram.mShaderFiles.clear();  		gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiPointLightV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredMultiSpotLightProgram.mShaderFiles.push_back(make_pair("deferred/multiSpotLightF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredMultiSpotLightProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; +        if (local_light_kill) +        { +            gDeferredMultiSpotLightProgram.addPermutation("LOCAL_LIGHT_KILL", "1"); +        } +  		success = gDeferredMultiSpotLightProgram.createShader(NULL, NULL);          llassert(success);  	} @@ -1819,6 +1946,22 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()              gDeferredAlphaProgram.addPermutation("HAS_SHADOW", "1");          }          gDeferredAlphaProgram.addPermutation("USE_VERTEX_COLOR", "1"); + +        if (ambient_kill) +        { +            gDeferredAlphaProgram.addPermutation("AMBIENT_KILL", "1"); +        } + +        if (sunlight_kill) +        { +            gDeferredAlphaProgram.addPermutation("SUNLIGHT_KILL", "1"); +        } + +        if (local_light_kill) +        { +            gDeferredAlphaProgram.addPermutation("LOCAL_LIGHT_KILL", "1"); +        } +          gDeferredAlphaProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];          success = gDeferredAlphaProgram.createShader(NULL, NULL); @@ -1912,6 +2055,21 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		{  			gDeferredAlphaWaterProgram.addPermutation("HAS_SHADOW", "1");  		} + +        if (ambient_kill) +        { +            gDeferredAlphaWaterProgram.addPermutation("AMBIENT_KILL", "1"); +        } + +        if (sunlight_kill) +        { +            gDeferredAlphaWaterProgram.addPermutation("SUNLIGHT_KILL", "1"); +        } + +        if (local_light_kill) +        { +            gDeferredAlphaWaterProgram.addPermutation("LOCAL_LIGHT_KILL", "1"); +        }          gDeferredAlphaWaterProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];  		success = gDeferredAlphaWaterProgram.createShader(NULL, NULL); @@ -2127,11 +2285,27 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredSoftenProgram.mFeatures.isDeferred = true;  		gDeferredSoftenProgram.mFeatures.hasShadows = use_sun_shadow; +        gDeferredSoftenProgram.clearPermutations();  		gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredSoftenProgram.mShaderFiles.push_back(make_pair("deferred/softenLightF.glsl", GL_FRAGMENT_SHADER_ARB));  		gDeferredSoftenProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; +        if (ambient_kill) +        { +            gDeferredSoftenProgram.addPermutation("AMBIENT_KILL", "1"); +        } + +        if (sunlight_kill) +        { +            gDeferredSoftenProgram.addPermutation("SUNLIGHT_KILL", "1"); +        } + +        if (local_light_kill) +        { +            gDeferredSoftenProgram.addPermutation("LOCAL_LIGHT_KILL", "1"); +        } +  		if (gSavedSettings.getBOOL("RenderDeferredSSAO"))  		{ //if using SSAO, take screen space light map into account as if shadows are enabled  			gDeferredSoftenProgram.mShaderLevel = llmax(gDeferredSoftenProgram.mShaderLevel, 2); @@ -2148,6 +2322,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		gDeferredSoftenWaterProgram.mShaderFiles.push_back(make_pair("deferred/softenLightV.glsl", GL_VERTEX_SHADER_ARB));  		gDeferredSoftenWaterProgram.mShaderFiles.push_back(make_pair("deferred/softenLightF.glsl", GL_FRAGMENT_SHADER_ARB)); +        gDeferredSoftenWaterProgram.clearPermutations();  		gDeferredSoftenWaterProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];  		gDeferredSoftenWaterProgram.addPermutation("WATER_FOG", "1");  		gDeferredSoftenWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER; @@ -2160,6 +2335,21 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()          gDeferredSoftenWaterProgram.mFeatures.isDeferred = true;          gDeferredSoftenWaterProgram.mFeatures.hasShadows = use_sun_shadow; +        if (ambient_kill) +        { +            gDeferredSoftenWaterProgram.addPermutation("AMBIENT_KILL", "1"); +        } + +        if (sunlight_kill) +        { +            gDeferredSoftenWaterProgram.addPermutation("SUNLIGHT_KILL", "1"); +        } + +        if (local_light_kill) +        { +            gDeferredSoftenWaterProgram.addPermutation("LOCAL_LIGHT_KILL", "1"); +        } +  		if (gSavedSettings.getBOOL("RenderDeferredSSAO"))  		{ //if using SSAO, take screen space light map into account as if shadows are enabled  			gDeferredSoftenWaterProgram.mShaderLevel = llmax(gDeferredSoftenWaterProgram.mShaderLevel, 2); @@ -2395,6 +2585,21 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()  		{  			gDeferredAvatarAlphaProgram.addPermutation("HAS_SHADOW", "1");  		} + +        if (ambient_kill) +        { +            gDeferredAvatarAlphaProgram.addPermutation("AMBIENT_KILL", "1"); +        } + +        if (sunlight_kill) +        { +            gDeferredAvatarAlphaProgram.addPermutation("SUNLIGHT_KILL", "1"); +        } + +        if (local_light_kill) +        { +            gDeferredAvatarAlphaProgram.addPermutation("LOCAL_LIGHT_KILL", "1"); +        }  		gDeferredAvatarAlphaProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED];  		success = gDeferredAvatarAlphaProgram.createShader(NULL, NULL); @@ -3910,6 +4115,7 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()          gWLCloudProgram.mFeatures.calculatesAtmospherics = true;          gWLCloudProgram.mFeatures.hasTransport = true;          gWLCloudProgram.mFeatures.hasGamma = true; +        gWLCloudProgram.mFeatures.hasSrgb = true;          gWLCloudProgram.mShaderFiles.push_back(make_pair("windlight/cloudsV.glsl", GL_VERTEX_SHADER_ARB));          gWLCloudProgram.mShaderFiles.push_back(make_pair("windlight/cloudsF.glsl", GL_FRAGMENT_SHADER_ARB));          gWLCloudProgram.mShaderLevel = mShaderLevel[SHADER_WINDLIGHT]; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index cd0a50113b..f8ef4ee5d7 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -6219,18 +6219,8 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)          mSunDir.setVec(sun_dir);          mMoonDir.setVec(moon_dir); -        // calculates diffuse sunlight per-pixel downstream, just provide setting sunlight_color -        if (canUseWindLightShaders()) -        { -            mSunDiffuse.setVec(psky->getSunlightColor()); -        } -        else -        { -            // not using atmo shaders, use CPU-generated attenuated sunlight diffuse... -            mSunDiffuse.setVec(psky->getSunDiffuse()); -        } - -        mMoonDiffuse.setVec(psky->getMoonDiffuse()); +        mSunDiffuse.setVec(psky->getSunlightColor()); +        mMoonDiffuse.setVec(psky->getMoonlightColor());          F32 max_color = llmax(mSunDiffuse.mV[0], mSunDiffuse.mV[1], mSunDiffuse.mV[2]);          if (max_color > 1.f) @@ -6257,15 +6247,15 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)          LLVector4 light_dir = sun_up ? mSunDir : mMoonDir; -        mHWLightColors[0] = mSunDiffuse; +        mHWLightColors[0] = sun_up ? mSunDiffuse : mMoonDiffuse;          LLLightState* light = gGL.getLight(0);          light->setPosition(light_dir);          light->setSunPrimary(sun_up); -        light->setDiffuse(mSunDiffuse); +        light->setDiffuse(mHWLightColors[0]);          light->setDiffuseB(mMoonDiffuse); -        light->setAmbient(LLColor4::black); +        light->setAmbient(psky->getTotalAmbient());  		light->setSpecular(LLColor4::black);  		light->setConstantAttenuation(1.f);  		light->setLinearAttenuation(0.f); @@ -6339,7 +6329,7 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)  			{  				F32 size = light_radius*1.5f;  				light_state->setLinearAttenuation(size); -				light_state->setQuadraticAttenuation(light->getLightFalloff()*0.5f); +				light_state->setQuadraticAttenuation(light->getLightFalloff()*0.5f+1.f);  			}  			else  			{ diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 8aa2c8d931..d9b06347ca 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -2951,6 +2951,36 @@                   function="ToggleControl"                   parameter="TextureDisable" />              </menu_item_check> +          <menu_item_check +             label="Disable Ambient" +             name="Disable Ambient"> +            <menu_item_check.on_check +             function="CheckControl" +             parameter="AmbientDisable" /> +            <menu_item_check.on_click +             function="ToggleShaderControl" +             parameter="AmbientDisable" /> +          </menu_item_check> +          <menu_item_check +             label="Disable Sunlight" +             name="Disable Sunlight"> +            <menu_item_check.on_check +             function="CheckControl" +             parameter="SunlightDisable" /> +            <menu_item_check.on_click +             function="ToggleShaderControl" +             parameter="SunlightDisable" /> +          </menu_item_check> +          <menu_item_check +             label="Disable Local Lights" +             name="Disable Local Lights"> +            <menu_item_check.on_check +             function="CheckControl" +             parameter="LocalLightDisable" /> +            <menu_item_check.on_click +             function="ToggleShaderControl" +             parameter="LocalLightDisable" /> +          </menu_item_check>              <menu_item_check                label="Full Res Textures"               name="Rull Res Textures">  | 
