diff options
Diffstat (limited to 'indra/newview/app_settings')
22 files changed, 1353 insertions, 1456 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index e39f6ffd4e..52dc4744f2 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -812,17 +812,6 @@        <key>Value</key>        <integer>0</integer>      </map> -    <key>FramePerSecondLimit</key> -    <map> -      <key>Comment</key> -      <string>Controls upper limit of frames per second</string> -      <key>Persist</key> -      <integer>1</integer> -      <key>Type</key> -      <string>U32</string> -      <key>Value</key> -      <integer>120</integer> -    </map>      <key>BackgroundYieldTime</key>      <map>        <key>Comment</key> diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl index caa4fe1f65..b7036e02cf 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl @@ -1,24 +1,24 @@ -/**  +/**   * @file WLCloudsV.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$   */ @@ -33,26 +33,26 @@ ATTRIBUTE vec2 texcoord0;  ///////////////////////////////////////////////////////////////////////////////  // Output parameters -VARYING vec4 vary_CloudColorSun; -VARYING vec4 vary_CloudColorAmbient; +VARYING vec4  vary_CloudColorSun; +VARYING vec4  vary_CloudColorAmbient;  VARYING float vary_CloudDensity; -VARYING vec2 vary_texcoord0; -VARYING vec2 vary_texcoord1; -VARYING vec2 vary_texcoord2; -VARYING vec2 vary_texcoord3; +VARYING vec2  vary_texcoord0; +VARYING vec2  vary_texcoord1; +VARYING vec2  vary_texcoord2; +VARYING vec2  vary_texcoord3;  VARYING float altitude_blend_factor;  // Inputs  uniform vec3 camPosLocal; -uniform vec4 lightnorm; -uniform vec4 sunlight_color; -uniform vec4 moonlight_color; -uniform int sun_up_factor; -uniform vec4 ambient_color; -uniform vec4 blue_horizon; -uniform vec4 blue_density; +uniform vec4  lightnorm; +uniform vec4  sunlight_color; +uniform vec4  moonlight_color; +uniform int   sun_up_factor; +uniform vec4  ambient_color; +uniform vec4  blue_horizon; +uniform vec4  blue_density;  uniform float haze_horizon;  uniform float haze_density; @@ -60,7 +60,7 @@ uniform float cloud_shadow;  uniform float density_multiplier;  uniform float max_y; -uniform vec4 glow; +uniform vec4  glow;  uniform float sun_moon_glow_factor;  uniform vec4 cloud_color; @@ -70,133 +70,123 @@ uniform float cloud_scale;  // NOTE: Keep these in sync!  //       indra\newview\app_settings\shaders\class1\deferred\skyV.glsl  //       indra\newview\app_settings\shaders\class1\deferred\cloudsV.glsl +//       indra\newview\app-settings\shaders\class2\windlight\cloudsV.glsl  //       indra\newview\lllegacyatmospherics.cpp +//       indra\newview\llsettingsvo.cpp  void main()  { - -	// World / view / projection -	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); - -	// Texture coords -	vary_texcoord0 = texcoord0; -	vary_texcoord0.xy -= 0.5; -	vary_texcoord0.xy /= cloud_scale; -	vary_texcoord0.xy += 0.5; - -	vary_texcoord1 = vary_texcoord0; -	vary_texcoord1.x += lightnorm.x * 0.0125; -	vary_texcoord1.y += lightnorm.z * 0.0125; - -	vary_texcoord2 = vary_texcoord0 * 16.; -	vary_texcoord3 = vary_texcoord1 * 16.; - -	// Get relative position -	vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0); - -    altitude_blend_factor = clamp((P.y + 512.0) / max_y, 0.0, 1.0); - -	// Set altitude -	if (P.y > 0.) -	{ -		P *= (max_y / P.y); -	} -	else -	{ -		altitude_blend_factor = 0; // SL-11589 Fix clouds drooping below horizon -		P *= (-32000. / P.y); -	} - -	// Can normalize then -	vec3 Pn = normalize(P); -	float  Plen = length(P); - -	// Initialize temp variables -	vec4 temp1 = vec4(0.); -	vec4 temp2 = vec4(0.); -	vec4 blue_weight; -	vec4 haze_weight; -	//vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color; -	vec4 sunlight = sunlight_color; -	vec4 light_atten; - -    float dens_mul = density_multiplier; - -	// Sunlight attenuation effect (hue and brightness) due to atmosphere -	// this is used later for sunlight modulation at various altitudes -	light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y); - -	// Calculate relative weights -	temp1 = abs(blue_density) + vec4(abs(haze_density)); -	blue_weight = blue_density / temp1; -	haze_weight = haze_density / temp1; - -	// Compute sunlight from P & lightnorm (for long rays like sky) -	temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y ); -	temp2.y = 1. / temp2.y; -	sunlight *= exp( - light_atten * temp2.y); - -	// Distance -	temp2.z = Plen * dens_mul; - -	// Transparency (-> temp1) -	// ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati -	// compiler gets confused. -	temp1 = exp(-temp1 * temp2.z); - - -	// Compute haze glow -	temp2.x = dot(Pn, lightnorm.xyz); -	temp2.x = 1. - temp2.x; -		// temp2.x is 0 at the sun and increases away from sun -	temp2.x = max(temp2.x, .001);	 -		// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) -	temp2.x *= glow.x; -		// Higher glow.x gives dimmer glow (because next step is 1 / "angle") -	temp2.x = pow(temp2.x, glow.z); -		// glow.z should be negative, so we're doing a sort of (1 / "angle") function - -    temp2.x *= sun_moon_glow_factor; - -	// Add "minimum anti-solar illumination" -	temp2.x += .25; - -	// Increase ambient when there are more clouds -	vec4 tmpAmbient = ambient_color; -	tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5;  - -	// Dim sunlight by cloud shadow percentage -	sunlight *= (1. - cloud_shadow); - -	// Haze color below cloud -	vec4 additiveColorBelowCloud = (	  blue_horizon * blue_weight * (sunlight + tmpAmbient) -				+ (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient) -			 );	 - -	// CLOUDS -	temp2.y = max(0., lightnorm.y * 2.); -	temp2.y = 1. / temp2.y; -	sunlight *= exp( - light_atten * temp2.y); - -	// Cloud color out -	vary_CloudColorSun = (sunlight * temp2.x) * cloud_color; -	vary_CloudColorAmbient = tmpAmbient * cloud_color; -	 -	// Attenuate cloud color by atmosphere -	temp1 = sqrt(temp1);	//less atmos opacity (more transparency) below clouds -	vary_CloudColorSun *= temp1; -	vary_CloudColorAmbient *= temp1; -	vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - temp1); - -	// Make a nice cloud density based on the cloud_shadow value that was passed in. -	vary_CloudDensity = 2. * (cloud_shadow - 0.25); - - -	// Combine these to minimize register use -	vary_CloudColorAmbient += oHazeColorBelowCloud; - -	// needs this to compile on mac -	//vary_AtmosAttenuation = vec3(0.0,0.0,0.0); - -	// END CLOUDS +    // World / view / projection +    gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); + +    // Texture coords +    // SL-13084 EEP added support for custom cloud textures -- flip them horizontally to match the preview of Clouds > Cloud Scroll +    vary_texcoord0 = vec2(-texcoord0.x, texcoord0.y);  // See: LLSettingsVOSky::applySpecial + +    vary_texcoord0.xy -= 0.5; +    vary_texcoord0.xy /= cloud_scale; +    vary_texcoord0.xy += 0.5; + +    vary_texcoord1 = vary_texcoord0; +    vary_texcoord1.x += lightnorm.x * 0.0125; +    vary_texcoord1.y += lightnorm.z * 0.0125; + +    vary_texcoord2 = vary_texcoord0 * 16.; +    vary_texcoord3 = vary_texcoord1 * 16.; + +    // Get relative position +    vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0); + +    altitude_blend_factor = clamp((rel_pos.y + 512.0) / max_y, 0.0, 1.0); + +    // Set altitude +    if (rel_pos.y > 0) +    { +        rel_pos *= (max_y / rel_pos.y); +    } +    if (rel_pos.y < 0) +    { +        altitude_blend_factor = 0;  // SL-11589 Fix clouds drooping below horizon +        rel_pos *= (-32000. / rel_pos.y); +    } + +    // Can normalize then +    vec3  rel_pos_norm = normalize(rel_pos); +    float rel_pos_len  = length(rel_pos); + +    // Initialize temp variables +    vec4 sunlight = sunlight_color; +    vec4 light_atten; + +    // Sunlight attenuation effect (hue and brightness) due to atmosphere +    // this is used later for sunlight modulation at various altitudes +    light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y); + +    // Calculate relative weights +    vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density)); +    vec4 blue_weight   = blue_density / combined_haze; +    vec4 haze_weight   = haze_density / combined_haze; + +    // Compute sunlight from rel_pos & lightnorm (for long rays like sky) +    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); +    sunlight *= exp(-light_atten * off_axis); + +    // Distance +    float density_dist = rel_pos_len * density_multiplier; + +    // Transparency (-> combined_haze) +    // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati +    // compiler gets confused. +    combined_haze = exp(-combined_haze * density_dist); + +    // Compute haze glow +    float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz); +    // haze_glow is 0 at the sun and increases away from sun +    haze_glow = max(haze_glow, .001); +    // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) +    haze_glow *= glow.x; +    // Higher glow.x gives dimmer glow (because next step is 1 / "angle") +    haze_glow = pow(haze_glow, glow.z); +    // glow.z should be negative, so we're doing a sort of (1 / "angle") function + +    haze_glow *= sun_moon_glow_factor; + +    // Add "minimum anti-solar illumination" +    // For sun, add to glow.  For moon, remove glow entirely. SL-13768 +    haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25); + +    // Increase ambient when there are more clouds +    vec4 tmpAmbient = ambient_color; +    tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5; + +    // Dim sunlight by cloud shadow percentage +    sunlight *= (1. - cloud_shadow); + +    // Haze color below cloud +    vec4 additiveColorBelowCloud = +        (blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)); + +    // CLOUDS +    off_axis = 1.0 / max(1e-6, lightnorm.y * 2.); +    sunlight *= exp(-light_atten * off_axis); + +    // Cloud color out +    vary_CloudColorSun     = (sunlight * haze_glow) * cloud_color; +    vary_CloudColorAmbient = tmpAmbient * cloud_color; + +    // Attenuate cloud color by atmosphere +    combined_haze = sqrt(combined_haze);  // less atmos opacity (more transparency) below clouds +    vary_CloudColorSun *= combined_haze; +    vary_CloudColorAmbient *= combined_haze; +    vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - combined_haze); + +    // Make a nice cloud density based on the cloud_shadow value that was passed in. +    vary_CloudDensity = 2. * (cloud_shadow - 0.25); + +    // Combine these to minimize register use +    vary_CloudColorAmbient += oHazeColorBelowCloud; + +    // needs this to compile on mac +    // vary_AtmosAttenuation = vec3(0.0,0.0,0.0); + +    // END CLOUDS  } - diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl index bd0ad3bce8..6b36d00f97 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl @@ -42,6 +42,9 @@ VARYING vec4 vary_position;  uniform samplerCube environmentMap; +// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass() +uniform int no_atmo; +  vec3 fullbrightShinyAtmosTransport(vec3 light);  vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);  vec3 fullbrightScaleSoftClip(vec3 light); @@ -51,7 +54,9 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou  vec3 linear_to_srgb(vec3 c);  vec3 srgb_to_linear(vec3 c); - +// See: +//   class1\deferred\fullbrightShinyF.glsl +//   class1\lighting\lightFullbrightShinyF.glsl  void main()  {  #ifdef HAS_DIFFUSE_LOOKUP @@ -59,25 +64,39 @@ void main()  #else  	vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);  #endif -	 +  	color.rgb *= vertex_color.rgb; -	vec3 pos = vary_position.xyz/vary_position.w; -	vec3 sunlit; -	vec3 amblit; -	vec3 additive; -	vec3 atten; +	// SL-9632 HUDs are affected by Atmosphere +	if (no_atmo == 0) +	{ +		vec3 sunlit; +		vec3 amblit; +		vec3 additive; +		vec3 atten; +		vec3 pos = vary_position.xyz/vary_position.w; + +		calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false); -	calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false); -	 -	vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;	 -	float env_intensity = vertex_color.a; -	color.rgb = mix(color.rgb, envColor.rgb, env_intensity); +		vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb; +		float env_intensity = vertex_color.a;  	//color.rgb = srgb_to_linear(color.rgb); -	 -	color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten); -	color.rgb = fullbrightScaleSoftClip(color.rgb); +		color.rgb = mix(color.rgb, envColor.rgb, env_intensity); + +		color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten); +		color.rgb = fullbrightScaleSoftClip(color.rgb); +	} + +/* +	// NOTE: HUD objects will be full bright. Uncomment if you want "some" environment lighting effecting these HUD objects. +	else +	{ +		vec3  envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb; +		float env_intensity = vertex_color.a; +		color.rgb = mix(color.rgb, envColor.rgb, env_intensity); +	} +*/  	color.a = 1.0; diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index 0afd1a9672..80d19102b6 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -1,439 +1,443 @@ -/**
 -* @file materialF.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$
 -*/
 -
 -/*[EXTRA_CODE_HERE]*/
 -
 -//class1/deferred/materialF.glsl
 -
 -// This shader is used for both writing opaque/masked content to the gbuffer and writing blended content to the framebuffer during the alpha pass.
 -
 -#define DIFFUSE_ALPHA_MODE_NONE     0
 -#define DIFFUSE_ALPHA_MODE_BLEND    1
 -#define DIFFUSE_ALPHA_MODE_MASK     2
 -#define DIFFUSE_ALPHA_MODE_EMISSIVE 3
 -
 -uniform float emissive_brightness;  // fullbright flag, 1.0 == fullbright, 0.0 otherwise
 -uniform int sun_up_factor;
 -
 -#ifdef WATER_FOG
 -vec4 applyWaterFogView(vec3 pos, vec4 color);
 -#endif
 -
 -vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
 -vec3 scaleSoftClipFrag(vec3 l);
 -
 -vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
 -vec3 fullbrightScaleSoftClip(vec3 light);
 -
 -void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);
 -
 -vec3 srgb_to_linear(vec3 cs);
 -vec3 linear_to_srgb(vec3 cs);
 -
 -#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
 -
 -#ifdef DEFINE_GL_FRAGCOLOR
 -out vec4 frag_color;
 -#else
 -#define frag_color gl_FragColor
 -#endif
 -
 -#ifdef HAS_SUN_SHADOW
 -float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
 -#endif
 -
 -uniform samplerCube environmentMap;
 -uniform sampler2D     lightFunc;
 -
 -// Inputs
 -uniform vec4 morphFactor;
 -uniform vec3 camPosLocal;
 -uniform mat3 env_mat;
 -
 -uniform vec3 sun_dir;
 -uniform vec3 moon_dir;
 -VARYING vec2 vary_fragcoord;
 -
 -VARYING vec3 vary_position;
 -
 -uniform mat4 proj_mat;
 -uniform mat4 inv_proj;
 -uniform vec2 screen_res;
 -
 -uniform vec4 light_position[8];
 -uniform vec3 light_direction[8];
 -uniform vec4 light_attenuation[8];
 -uniform vec3 light_diffuse[8];
 -
 -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)
 -{
 -    vec3 col = vec3(0);
 -
 -    //get light vector
 -    vec3 lv = lp.xyz - v;
 -
 -    //get distance
 -    float dist = length(lv);
 -    float da = 1.0;
 -
 -    dist /= la;
 -
 -    if (dist > 0.0 && la > 0.0)
 -    {
 -        //normalize light vector
 -        lv = normalize(lv);
 -
 -        //distance attenuation
 -        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;
 -
 -        if (dist_atten <= 0.0)
 -        {
 -            return col;
 -        }
 -
 -        // spotlight coefficient.
 -        float spot = max(dot(-ln, lv), is_pointlight);
 -        da *= spot*spot; // GL_SPOT_EXPONENT=2
 -
 -        //angular attenuation
 -        da *= dot(n, lv);
 -
 -        float lit = 0.0f;
 -
 -        float amb_da = ambiance;
 -        if (da >= 0)
 -        {
 -            lit = max(da * dist_atten, 0.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 *= dist_atten;
 -        amb_da = min(amb_da, 1.0f - lit);
 -
 -        // SL-10969 need to see why these are blown out
 -        //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;
 -
 -                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));
 -}
 -
 -#else
 -#ifdef DEFINE_GL_FRAGCOLOR
 -out vec4 frag_data[3];
 -#else
 -#define frag_data gl_FragData
 -#endif
 -#endif
 -
 -uniform sampler2D diffuseMap;  //always in sRGB space
 -
 -#ifdef HAS_NORMAL_MAP
 -uniform sampler2D bumpMap;
 -#endif
 -
 -#ifdef HAS_SPECULAR_MAP
 -uniform sampler2D specularMap;
 -
 -VARYING vec2 vary_texcoord2;
 -#endif
 -
 -uniform float env_intensity;
 -uniform vec4 specular_color;  // specular color RGB and specular exponent (glossiness) in alpha
 -
 -#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)
 -uniform float minimum_alpha;
 -#endif
 -
 -#ifdef HAS_NORMAL_MAP
 -VARYING vec3 vary_mat0;
 -VARYING vec3 vary_mat1;
 -VARYING vec3 vary_mat2;
 -VARYING vec2 vary_texcoord1;
 -#else
 -VARYING vec3 vary_normal;
 -#endif
 -
 -VARYING vec4 vertex_color;
 -VARYING vec2 vary_texcoord0;
 -
 -vec2 encode_normal(vec3 n);
 -
 -void main()
 -{
 -    vec2 pos_screen = vary_texcoord0.xy;
 -
 -    vec4 diffcol = texture2D(diffuseMap, vary_texcoord0.xy);
 -	diffcol.rgb *= vertex_color.rgb;
 -
 -#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)
 -
 -    // Comparing floats cast from 8-bit values, produces acne right at the 8-bit transition points
 -    float bias = 0.001953125; // 1/512, or half an 8-bit quantization
 -    if (diffcol.a < minimum_alpha-bias)
 -    {
 -        discard;
 -    }
 -#endif
 -
 -#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
 -	vec3 gamma_diff = diffcol.rgb;
 -	diffcol.rgb = srgb_to_linear(diffcol.rgb);
 -#endif
 -
 -#ifdef HAS_SPECULAR_MAP
 -    vec4 spec = texture2D(specularMap, vary_texcoord2.xy);
 -    spec.rgb *= specular_color.rgb;
 -#else
 -    vec4 spec = vec4(specular_color.rgb, 1.0);
 -#endif
 -
 -#ifdef HAS_NORMAL_MAP
 -	vec4 norm = texture2D(bumpMap, vary_texcoord1.xy);
 -
 -	norm.xyz = norm.xyz * 2 - 1;
 -
 -	vec3 tnorm = vec3(dot(norm.xyz,vary_mat0),
 -			  dot(norm.xyz,vary_mat1),
 -			  dot(norm.xyz,vary_mat2));
 -#else
 -	vec4 norm = vec4(0,0,0,1.0);
 -	vec3 tnorm = vary_normal;
 -#endif
 -
 -    norm.xyz = normalize(tnorm.xyz);
 -
 -    vec2 abnormal = encode_normal(norm.xyz);
 -
 -    vec4 final_color = diffcol;
 -
 -#if (DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE)
 -	final_color.a = emissive_brightness;
 -#else
 -	final_color.a = max(final_color.a, emissive_brightness);
 -#endif
 -
 -    vec4 final_specular = spec;
 -    
 -#ifdef HAS_SPECULAR_MAP
 -    vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity * spec.a, 0.0);
 -	final_specular.a = specular_color.a * norm.a;
 -#else
 -	vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity, 0.0);
 -	final_specular.a = specular_color.a;
 -#endif
 -
 -#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
 -
 -    //forward rendering, output just lit sRGBA
 -    vec3 pos = vary_position;
 -
 -    float shadow = 1.0f;
 -
 -#ifdef HAS_SUN_SHADOW
 -    shadow = sampleDirectionalShadow(pos.xyz, norm.xyz, pos_screen);
 -#endif
 -
 -    spec = final_specular;
 -    vec4 diffuse = final_color;
 -    float envIntensity = final_normal.z;
 -
 -    vec3 color = vec3(0,0,0);
 -
 -    vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;
 -
 -    float bloom = 0.0;
 -    vec3 sunlit;
 -    vec3 amblit;
 -    vec3 additive;
 -    vec3 atten;
 -
 -    calcAtmosphericVars(pos.xyz, light_dir, 1.0, sunlit, amblit, additive, atten, false);
 -    
 -        // This call breaks the Mac GLSL compiler/linker for unknown reasons (17Mar2020)
 -        // The call is either a no-op or a pure (pow) gamma adjustment, depending on GPU level
 -        // TODO: determine if we want to re-apply the gamma adjustment, and if so understand & fix Mac breakage
 -        //color = fullbrightScaleSoftClip(color);
 -
 -    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);
 -
 -    color = amblit;
 -
 -    //darken ambient for normals perpendicular to light vector so surfaces in shadow 
 -    // and facing away from light still have some definition to them.
 -    // do NOT gamma correct this dot product so ambient lighting stays soft
 -    float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
 -    ambient *= 0.5;
 -    ambient *= ambient;
 -    ambient = (1.0 - ambient);
 -
 -    vec3 sun_contrib = min(da, shadow) * sunlit;
 -    
 -    color *= ambient;
 -
 -    color += sun_contrib;
 -
 -    color *= gamma_diff.rgb;
 -
 -    float glare = 0.0;
 -
 -    if (spec.a > 0.0) // specular reflection
 -    {
 -#if 1 //EEP
 -
 -        vec3 npos = -normalize(pos.xyz);
 -
 -        //vec3 ref = dot(pos+lv, norm);
 -        vec3 h = normalize(light_dir.xyz + npos);
 -        float nh = dot(norm.xyz, h);
 -        float nv = dot(norm.xyz, 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 sp = sun_contrib*scol / 6.0f;
 -            sp = clamp(sp, vec3(0), vec3(1));
 -            bloom = dot(sp, sp) / 4.0;
 -            color += sp * spec.rgb;
 -        }
 -#else // PRODUCTION
 -        float sa = dot(refnormpersp, sun_dir.xyz);
 -		vec3 dumbshiny = sunlit*shadow*(texture2D(lightFunc, vec2(sa, spec.a)).r);
 -							
 -		// add the two types of shiny together
 -		vec3 spec_contrib = dumbshiny * spec.rgb;
 -		bloom = dot(spec_contrib, spec_contrib) / 6;
 -
 -		glare = max(spec_contrib.r, spec_contrib.g);
 -		glare = max(glare, spec_contrib.b);
 -
 -		color += spec_contrib;
 -#endif
 -    }
 -
 -    color = mix(color.rgb, diffcol.rgb, diffuse.a);
 -    
 -    if (envIntensity > 0.0)
 -    {
 -        //add environmentmap
 -        vec3 env_vec = env_mat * refnormpersp;
 -
 -        vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
 -
 -        color = mix(color, reflected_color, envIntensity);
 -
 -        float cur_glare = max(reflected_color.r, reflected_color.g);
 -        cur_glare = max(cur_glare, reflected_color.b);
 -        cur_glare *= envIntensity*4.0;
 -        glare += cur_glare;
 -    }
 -
 -    color = atmosFragLighting(color, additive, atten);
 -    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);
 -    
 -#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 );
 -
 -    LIGHT_LOOP(1)
 -        LIGHT_LOOP(2)
 -        LIGHT_LOOP(3)
 -        LIGHT_LOOP(4)
 -        LIGHT_LOOP(5)
 -        LIGHT_LOOP(6)
 -        LIGHT_LOOP(7)
 -
 -    color += light;
 -
 -    glare = min(glare, 1.0);
 -    float al = max(diffcol.a, glare)*vertex_color.a;
 -
 -    //convert to srgb as this color is being written post gamma correction
 -    color = linear_to_srgb(color);
 -
 -#ifdef WATER_FOG
 -    vec4 temp = applyWaterFogView(pos, vec4(color, al));
 -    color = temp.rgb;
 -    al = temp.a;
 -#endif
 -
 -    frag_color = vec4(color, al);
 -
 -#else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer 
 -
 -    // deferred path
 -    frag_data[0] = final_color; //gbuffer is sRGB
 -    frag_data[1] = final_specular; // XYZ = Specular color. W = Specular exponent.
 -    frag_data[2] = final_normal; // XY = Normal.  Z = Env. intensity.
 -#endif
 -}
 -
 +/** +* @file materialF.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$ +*/ + +/*[EXTRA_CODE_HERE]*/ + +//class1/deferred/materialF.glsl + +// This shader is used for both writing opaque/masked content to the gbuffer and writing blended content to the framebuffer during the alpha pass. + +#define DIFFUSE_ALPHA_MODE_NONE     0 +#define DIFFUSE_ALPHA_MODE_BLEND    1 +#define DIFFUSE_ALPHA_MODE_MASK     2 +#define DIFFUSE_ALPHA_MODE_EMISSIVE 3 + +uniform float emissive_brightness;  // fullbright flag, 1.0 == fullbright, 0.0 otherwise +uniform int sun_up_factor; + +#ifdef WATER_FOG +vec4 applyWaterFogView(vec3 pos, vec4 color); +#endif + +vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten); +vec3 scaleSoftClipFrag(vec3 l); + +vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten); +vec3 fullbrightScaleSoftClip(vec3 light); + +void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao); + +vec3 srgb_to_linear(vec3 cs); +vec3 linear_to_srgb(vec3 cs); + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +#ifdef HAS_SUN_SHADOW +float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen); +#endif + +uniform samplerCube environmentMap; +uniform sampler2D     lightFunc; + +// Inputs +uniform vec4 morphFactor; +uniform vec3 camPosLocal; +uniform mat3 env_mat; + +uniform vec3 sun_dir; +uniform vec3 moon_dir; +VARYING vec2 vary_fragcoord; + +VARYING vec3 vary_position; + +uniform mat4 proj_mat; +uniform mat4 inv_proj; +uniform vec2 screen_res; + +uniform vec4 light_position[8]; +uniform vec3 light_direction[8]; +uniform vec4 light_attenuation[8]; +uniform vec3 light_diffuse[8]; + +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) +{ +    vec3 col = vec3(0); + +    //get light vector +    vec3 lv = lp.xyz - v; + +    //get distance +    float dist = length(lv); +    float da = 1.0; + +    dist /= la; + +    if (dist > 0.0 && la > 0.0) +    { +        //normalize light vector +        lv = normalize(lv); + +        //distance attenuation +        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; + +        if (dist_atten <= 0.0) +        { +            return col; +        } + +        // spotlight coefficient. +        float spot = max(dot(-ln, lv), is_pointlight); +        da *= spot*spot; // GL_SPOT_EXPONENT=2 + +        //angular attenuation +        da *= dot(n, lv); + +        float lit = 0.0f; + +        float amb_da = ambiance; +        if (da >= 0) +        { +            lit = max(da * dist_atten, 0.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 *= dist_atten; +        amb_da = min(amb_da, 1.0f - lit); + +        // SL-10969 need to see why these are blown out +        //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; + +                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)); +} + +#else +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_data[3]; +#else +#define frag_data gl_FragData +#endif +#endif + +uniform sampler2D diffuseMap;  //always in sRGB space + +#ifdef HAS_NORMAL_MAP +uniform sampler2D bumpMap; +#endif + +#ifdef HAS_SPECULAR_MAP +uniform sampler2D specularMap; + +VARYING vec2 vary_texcoord2; +#endif + +uniform float env_intensity; +uniform vec4 specular_color;  // specular color RGB and specular exponent (glossiness) in alpha + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK) +uniform float minimum_alpha; +#endif + +#ifdef HAS_NORMAL_MAP +VARYING vec3 vary_mat0; +VARYING vec3 vary_mat1; +VARYING vec3 vary_mat2; +VARYING vec2 vary_texcoord1; +#else +VARYING vec3 vary_normal; +#endif + +VARYING vec4 vertex_color; +VARYING vec2 vary_texcoord0; + +vec2 encode_normal(vec3 n); + +void main() +{ +    vec2 pos_screen = vary_texcoord0.xy; + +    vec4 diffcol = texture2D(diffuseMap, vary_texcoord0.xy); +	diffcol.rgb *= vertex_color.rgb; + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK) + +    // Comparing floats cast from 8-bit values, produces acne right at the 8-bit transition points +    float bias = 0.001953125; // 1/512, or half an 8-bit quantization +    if (diffcol.a < minimum_alpha-bias) +    { +        discard; +    } +#endif + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) +	vec3 gamma_diff = diffcol.rgb; +	diffcol.rgb = srgb_to_linear(diffcol.rgb); +#endif + +#ifdef HAS_SPECULAR_MAP +    vec4 spec = texture2D(specularMap, vary_texcoord2.xy); +    spec.rgb *= specular_color.rgb; +#else +    vec4 spec = vec4(specular_color.rgb, 1.0); +#endif + +#ifdef HAS_NORMAL_MAP +	vec4 norm = texture2D(bumpMap, vary_texcoord1.xy); + +	norm.xyz = norm.xyz * 2 - 1; + +	vec3 tnorm = vec3(dot(norm.xyz,vary_mat0), +			  dot(norm.xyz,vary_mat1), +			  dot(norm.xyz,vary_mat2)); +#else +	vec4 norm = vec4(0,0,0,1.0); +	vec3 tnorm = vary_normal; +#endif + +    norm.xyz = normalize(tnorm.xyz); + +    vec2 abnormal = encode_normal(norm.xyz); + +    vec4 final_color = diffcol; + +#if (DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE) +	final_color.a = emissive_brightness; +#else +	final_color.a = max(final_color.a, emissive_brightness); +#endif + +    vec4 final_specular = spec; +     +#ifdef HAS_SPECULAR_MAP +    vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity * spec.a, 0.0); +	final_specular.a = specular_color.a * norm.a; +#else +	vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity, 0.0); +	final_specular.a = specular_color.a; +#endif + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) + +    //forward rendering, output just lit sRGBA +    vec3 pos = vary_position; + +    float shadow = 1.0f; + +#ifdef HAS_SUN_SHADOW +    shadow = sampleDirectionalShadow(pos.xyz, norm.xyz, pos_screen); +#endif + +    spec = final_specular; +    vec4 diffuse = final_color; +    float envIntensity = final_normal.z; + +    vec3 color = vec3(0,0,0); + +    vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir; + +    float bloom = 0.0; +    vec3 sunlit; +    vec3 amblit; +    vec3 additive; +    vec3 atten; + +    calcAtmosphericVars(pos.xyz, light_dir, 1.0, sunlit, amblit, additive, atten, false); +     +        // This call breaks the Mac GLSL compiler/linker for unknown reasons (17Mar2020) +        // The call is either a no-op or a pure (pow) gamma adjustment, depending on GPU level +        // TODO: determine if we want to re-apply the gamma adjustment, and if so understand & fix Mac breakage +        //color = fullbrightScaleSoftClip(color); + +    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); + +    color = amblit; + +    //darken ambient for normals perpendicular to light vector so surfaces in shadow  +    // and facing away from light still have some definition to them. +    // do NOT gamma correct this dot product so ambient lighting stays soft +    float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0); +    ambient *= 0.5; +    ambient *= ambient; +    ambient = (1.0 - ambient); + +    vec3 sun_contrib = min(da, shadow) * sunlit; +     +    color *= ambient; + +    color += sun_contrib; + +    color *= gamma_diff.rgb; + +    float glare = 0.0; + +    if (spec.a > 0.0)  // specular reflection +    { +        /*  // Reverting this specular calculation to previous 'dumbshiny' version - DJH 6/17/2020 +            // Preserving the refactored version as a comment for potential reconsideration, +            // overriding the general rule to avoid pollutiong the source with commented code. +            // +            //  If you're reading this in 2021+, feel free to obliterate. + +        vec3 npos = -normalize(pos.xyz); + +        //vec3 ref = dot(pos+lv, norm); +        vec3 h = normalize(light_dir.xyz + npos); +        float nh = dot(norm.xyz, h); +        float nv = dot(norm.xyz, 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 sp = sun_contrib*scol / 6.0f; +            sp = clamp(sp, vec3(0), vec3(1)); +            bloom = dot(sp, sp) / 4.0; +            color += sp * spec.rgb; +        } +        */ + +        float sa        = dot(refnormpersp, sun_dir.xyz); +        vec3  dumbshiny = sunlit * shadow * (texture2D(lightFunc, vec2(sa, spec.a)).r); + +        // add the two types of shiny together +        vec3 spec_contrib = dumbshiny * spec.rgb; +        bloom             = dot(spec_contrib, spec_contrib) / 6; + +        glare = max(spec_contrib.r, spec_contrib.g); +        glare = max(glare, spec_contrib.b); + +        color += spec_contrib; +    } + +    color = mix(color.rgb, diffcol.rgb, diffuse.a); + +    if (envIntensity > 0.0) +    { +        //add environmentmap +        vec3 env_vec = env_mat * refnormpersp; + +        vec3 reflected_color = textureCube(environmentMap, env_vec).rgb; + +        color = mix(color, reflected_color, envIntensity); + +        float cur_glare = max(reflected_color.r, reflected_color.g); +        cur_glare = max(cur_glare, reflected_color.b); +        cur_glare *= envIntensity*4.0; +        glare += cur_glare; +    } + +    color = atmosFragLighting(color, additive, atten); +    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); +     +#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 ); + +    LIGHT_LOOP(1) +        LIGHT_LOOP(2) +        LIGHT_LOOP(3) +        LIGHT_LOOP(4) +        LIGHT_LOOP(5) +        LIGHT_LOOP(6) +        LIGHT_LOOP(7) + +    color += light; + +    glare = min(glare, 1.0); +    float al = max(diffcol.a, glare)*vertex_color.a; + +    //convert to srgb as this color is being written post gamma correction +    color = linear_to_srgb(color); + +#ifdef WATER_FOG +    vec4 temp = applyWaterFogView(pos, vec4(color, al)); +    color = temp.rgb; +    al = temp.a; +#endif + +    frag_color = vec4(color, al); + +#else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer  + +    // deferred path +    frag_data[0] = final_color; //gbuffer is sRGB +    frag_data[1] = final_specular; // XYZ = Specular color. W = Specular exponent. +    frag_data[2] = final_normal; // XY = Normal.  Z = Env. intensity. +#endif +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl index 80f232948a..35068899ee 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/moonF.glsl @@ -1,9 +1,9 @@  /**  - * @file moonF.glsl + * @file class1\deferred\moonF.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2005, Linden Research, Inc. + * Copyright (C) 2005, 2020 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 @@ -36,34 +36,33 @@ out vec4 frag_data[3];  uniform vec4 color;  uniform vec4 sunlight_color;  uniform vec4 moonlight_color; -uniform vec3 lumWeights; +uniform vec3 moon_dir;  uniform float moon_brightness; -uniform float minLuminance;  uniform sampler2D diffuseMap; -uniform sampler2D altDiffuseMap; -uniform float blend_factor; // interp factor between moon A/B +  VARYING vec2 vary_texcoord0;  vec3 srgb_to_linear(vec3 c); -void main()  -{ -    vec4 moonA = texture2D(diffuseMap, vary_texcoord0.xy); -    vec4 moonB = texture2D(altDiffuseMap, vary_texcoord0.xy); -    vec4 c     = mix(moonA, moonB, blend_factor); -    c.rgb = srgb_to_linear(c.rgb); +/// Soft clips the light with a gamma correction +vec3 scaleSoftClip(vec3 light); -    // mix factor which blends when sunlight is brighter -    // and shows true moon color at night -    vec3 luma_weights = vec3(0.3, 0.5, 0.3); +void main()  +{ +    // Restore Pre-EEP alpha fade moon near horizon +    float fade = 1.0; +    if( moon_dir.z > 0 ) +        fade = clamp( moon_dir.z*moon_dir.z*4.0, 0.0, 1.0 ); -    vec4 light_color = max(sunlight_color, moonlight_color); -    float mix = 1.0 - dot(normalize(light_color.rgb), luma_weights); +    vec4 c      = texture2D(diffuseMap, vary_texcoord0.xy); +//       c.rgb  = srgb_to_linear(c.rgb); +         c.rgb *= moonlight_color.rgb; +         c.rgb *= moon_brightness; -    vec3 exp = vec3(1.0 - mix * moon_brightness) * 2.0  - 1.0; -    c.rgb = pow(c.rgb, exp); +         c.rgb *= fade; +         c.a   *= fade; -    //c.rgb *= moonlight_color.rgb; +         c.rgb  = scaleSoftClip(c.rgb);      frag_data[0] = vec4(c.rgb, c.a);      frag_data[1] = vec4(0.0); diff --git a/indra/newview/app_settings/shaders/class1/deferred/moonV.glsl b/indra/newview/app_settings/shaders/class1/deferred/moonV.glsl index e1bac4f248..c4922afd7d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/moonV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/moonV.glsl @@ -1,9 +1,9 @@  /**  - * @file moonV.glsl + * @file class1\deferred\moonV.glsl   *    * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. + * Copyright (C) 2007, 2020 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 @@ -32,18 +32,13 @@ ATTRIBUTE vec2 texcoord0;  VARYING vec2 vary_texcoord0; -void calcAtmospherics(vec3 eye_pos); -  void main()  {      //transform vertex -    vec3 offset = vec3(0, 0, 50); -    vec4 vert = vec4(position.xyz - offset, 1.0); +    vec4 vert = vec4(position.xyz, 1.0);      vec4 pos = (modelview_matrix * vert);      gl_Position = modelview_projection_matrix*vert; -    calcAtmospherics(pos.xyz); -          vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index 0d1cc81786..8c402fcb54 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -1,24 +1,24 @@ -/**  - * @file multiPointLightF.glsl +/** + * @file class1/deferred/multiPointLightF.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$   */ @@ -36,119 +36,112 @@ out vec4 frag_color;  uniform sampler2DRect depthMap;  uniform sampler2DRect diffuseRect;  uniform sampler2DRect specularRect; -uniform samplerCube environmentMap; -uniform sampler2D noiseMap; -uniform sampler2D lightFunc; +uniform samplerCube   environmentMap; +uniform sampler2D     noiseMap; +uniform sampler2D     lightFunc; - -uniform vec3 env_mat[3]; +uniform vec3  env_mat[3];  uniform float sun_wash; +uniform int   light_count; +uniform vec4  light[LIGHT_COUNT]; +uniform vec4  light_col[LIGHT_COUNT]; -uniform int light_count; - -uniform vec4 light[LIGHT_COUNT]; -uniform vec4 light_col[LIGHT_COUNT]; - -VARYING vec4 vary_fragcoord; -uniform vec2 screen_res; - +uniform vec2  screen_res;  uniform float far_z; +uniform mat4  inv_proj; -uniform mat4 inv_proj; +VARYING vec4 vary_fragcoord;  vec4 getPosition(vec2 pos_screen);  vec3 getNorm(vec2 pos_screen);  vec3 srgb_to_linear(vec3 c); -void main()  +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) -	{ -		discard; -	} -	 -	vec3 norm = getNorm(frag.xy); - -	vec4 spec = texture2DRect(specularRect, frag.xy); -	vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb; -    diff.rgb = srgb_to_linear(diff.rgb); -	 -	float noise = texture2D(noiseMap, frag.xy/128.0).b; -	vec3 npos = normalize(-pos); - -	// As of OSX 10.6.7 ATI Apple's crash when using a variable size loop -	for (int i = 0; i < LIGHT_COUNT; ++i) -	{ -		vec3 lv = light[i].xyz-pos; -		float dist = length(lv); -		dist /= light[i].w; -		if (dist <= 1.0) -		{ -		float da = dot(norm, lv); -			if (da > 0.0) -		{ -			lv = normalize(lv); -			da = dot(norm, lv); -			 -			float fa = light_col[i].a+1.0; -			float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); -			dist_atten *= dist_atten; -             -            // Tweak falloff slightly to match pre-EEP attenuation -			// NOTE: this magic number also shows up in a great many other places, search for dist_atten *= to audit -			dist_atten *= 2.0; -			 -			dist_atten *= noise; - -			float lit = da * dist_atten; -						 -			vec3 col = light_col[i].rgb*lit*diff; -			 -			//vec3 col = vec3(dist2, light_col[i].a, lit); -			 -			if (spec.a > 0.0) -			{ -				lit = min(da*6.0, 1.0) * dist_atten; -				//vec3 ref = dot(pos+lv, norm); -				vec3 h = normalize(lv+npos); -				float nh = dot(norm, h); -				float nv = dot(norm, 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); -					col += lit*scol*light_col[i].rgb*spec.rgb; -					//col += spec.rgb; -				} -			} -			 -			out_col += col; -		} -	} -	} +    discard;  // Bail immediately  #endif -	 -	frag_color.rgb = out_col; -	frag_color.a = 0.0; + +    vec3 out_col = vec3(0, 0, 0); +    vec2 frag    = (vary_fragcoord.xy * 0.5 + 0.5) * screen_res; +    vec3 pos     = getPosition(frag.xy).xyz; +    if (pos.z < far_z) +    { +        discard; +    } + +    vec3 norm = getNorm(frag.xy); + +    vec4 spec = texture2DRect(specularRect, frag.xy); +    spec.rgb  = srgb_to_linear(spec.rgb); +    vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb; +    diff.rgb  = srgb_to_linear(diff.rgb); + +    float noise = texture2D(noiseMap, frag.xy / 128.0).b; +    vec3  npos  = normalize(-pos); + +    // As of OSX 10.6.7 ATI Apple's crash when using a variable size loop +    for (int i = 0; i < LIGHT_COUNT; ++i) +    { +        vec3  lv   = light[i].xyz - pos; +        float dist = length(lv); +        dist /= light[i].w; +        if (dist <= 1.0) +        { +            float da = dot(norm, lv); +            if (da > 0.0) +            { +                lv = normalize(lv); +                da = dot(norm, lv); + +                float fa         = light_col[i].a + 1.0; +                float dist_atten = clamp(1.0 - (dist - 1.0 * (1.0 - fa)) / fa, 0.0, 1.0); +                dist_atten *= dist_atten; + +                // Tweak falloff slightly to match pre-EEP attenuation +                // NOTE: this magic number also shows up in a great many other places, search for dist_atten *= to audit +                dist_atten *= 2.0; + +                dist_atten *= noise; + +                float lit = da * dist_atten; + +                vec3 col = light_col[i].rgb * lit * diff; + +                if (spec.a > 0.0) +                { +                    lit        = min(da * 6.0, 1.0) * dist_atten; +                    vec3  h    = normalize(lv + npos); +                    float nh   = dot(norm, h); +                    float nv   = dot(norm, 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); +                        col += lit * scol * light_col[i].rgb * spec.rgb; +                    } +                } + +                out_col += col; +            } +        } +    } + +    frag_color.rgb = out_col; +    frag_color.a   = 0.0;  #ifdef IS_AMD_CARD -	// If it's AMD make sure the GLSL compiler sees the arrays referenced once by static index. Otherwise it seems to optimise the storage awawy which leads to unfun crashes and artifacts. -	vec4 dummy1 = light[0]; -	vec4 dummy2 = light_col[0]; -	vec4 dummy3 = light[LIGHT_COUNT-1]; -	vec4 dummy4 = light_col[LIGHT_COUNT-1]; +    // If it's AMD make sure the GLSL compiler sees the arrays referenced once by static index. Otherwise it seems to optimise the storage +    // awawy which leads to unfun crashes and artifacts. +    vec4 dummy1 = light[0]; +    vec4 dummy2 = light_col[0]; +    vec4 dummy3 = light[LIGHT_COUNT - 1]; +    vec4 dummy4 = light_col[LIGHT_COUNT - 1];  #endif  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl index ead754ec76..28a1faf24f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyV.glsl @@ -1,24 +1,24 @@ -/**  +/**   * @file WLSkyV.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$   */ @@ -37,13 +37,13 @@ VARYING vec4 vary_HazeColor;  // Inputs  uniform vec3 camPosLocal; -uniform vec4 lightnorm; -uniform vec4 sunlight_color; -uniform vec4 moonlight_color; -uniform int sun_up_factor; -uniform vec4 ambient_color; -uniform vec4 blue_horizon; -uniform vec4 blue_density; +uniform vec4  lightnorm; +uniform vec4  sunlight_color; +uniform vec4  moonlight_color; +uniform int   sun_up_factor; +uniform vec4  ambient_color; +uniform vec4  blue_horizon; +uniform vec4  blue_density;  uniform float haze_horizon;  uniform float haze_density; @@ -52,7 +52,7 @@ uniform float density_multiplier;  uniform float distance_multiplier;  uniform float max_y; -uniform vec4 glow; +uniform vec4  glow;  uniform float sun_moon_glow_factor;  uniform vec4 cloud_color; @@ -63,103 +63,91 @@ uniform vec4 cloud_color;  //       indra\newview\lllegacyatmospherics.cpp  void main()  { - -	// World / view / projection +    // World / view / projection      vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0); -	gl_Position = pos; -	 -	// Get relative position -	vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0); - -	// Set altitude -	if (P.y > 0.) -	{ -		P *= (max_y / P.y); -	} -	else -	{ -		P *= (-32000. / P.y); -	} - -	// Can normalize then -	vec3 Pn = normalize(P); - -	float Plen = length(P); - -	// Initialize temp variables -	vec4 temp1 = vec4(0.); -	vec4 temp2 = vec4(0.); -	vec4 blue_weight; -	vec4 haze_weight; -	vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color; -	vec4 light_atten; - -    float dens_mul = density_multiplier; - -	// Sunlight attenuation effect (hue and brightness) due to atmosphere -	// this is used later for sunlight modulation at various altitudes -	light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y); - -	// Calculate relative weights -	temp1 = abs(blue_density) + vec4(abs(haze_density)); -	blue_weight = blue_density / temp1; -	haze_weight = haze_density / temp1; - -	// Compute sunlight from P & lightnorm (for long rays like sky) -    temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y ); -    temp2.y = 1. / temp2.y; -    sunlight *= exp( - light_atten * temp2.y); - -	// Distance -	temp2.z = Plen * dens_mul; - -	// Transparency (-> temp1) -    // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati -    // compiler gets confused. -    temp1 = exp(-temp1 * temp2.z); +    gl_Position = pos; + +    // Get relative position +    vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0); + +    // Adj position vector to clamp altitude +    if (rel_pos.y > 0) +    { +        rel_pos *= (max_y / rel_pos.y); +    } +    if (rel_pos.y < 0) +    { +        rel_pos *= (-32000. / rel_pos.y); +    } + +    // Can normalize then +    vec3 rel_pos_norm = normalize(rel_pos); -	// Compute haze glow -	temp2.x = dot(Pn, lightnorm.xyz); -	temp2.x = 1. - temp2.x; -		// temp2.x is 0 at the sun and increases away from sun -	temp2.x = max(temp2.x, .001);	 -		// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) -	temp2.x *= glow.x; -		// Higher glow.x gives dimmer glow (because next step is 1 / "angle") -	temp2.x = pow(temp2.x, glow.z); -		// glow.z should be negative, so we're doing a sort of (1 / "angle") function +    float rel_pos_len = length(rel_pos); -	// Add "minimum anti-solar illumination" -	temp2.x += .25; +    // Initialize temp variables +    vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color; +    vec4 light_atten; -    vec4 color = (    blue_horizon * blue_weight * (sunlight + ambient_color) -                + (haze_horizon * haze_weight) * (sunlight * temp2.x + ambient_color) -             ); +    // Sunlight attenuation effect (hue and brightness) due to atmosphere +    // this is used later for sunlight modulation at various altitudes +    light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y); +    // Calculate relative weights +    vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density)); +    vec4 blue_weight   = blue_density / combined_haze; +    vec4 haze_weight   = haze_density / combined_haze; + +    // Compute sunlight from rel_pos & lightnorm (for long rays like sky) +    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); +    sunlight *= exp(-light_atten * off_axis); + +    // Distance +    float density_dist = rel_pos_len * density_multiplier; + +    // Transparency (-> combined_haze) +    // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati +    // compiler gets confused. +    combined_haze = exp(-combined_haze * density_dist); + +    // Compute haze glow +    float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz); +    // haze_glow is 0 at the sun and increases away from sun +    haze_glow = max(haze_glow, .001); +    // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) +    haze_glow *= glow.x; +    // Higher glow.x gives dimmer glow (because next step is 1 / "angle") +    haze_glow = pow(haze_glow, glow.z); +    // glow.z should be negative, so we're doing a sort of (1 / "angle") function + +    // Add "minimum anti-solar illumination" +    // For sun, add to glow.  For moon, remove glow entirely. SL-13768 +    haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25); + +    vec4 color = +        (blue_horizon * blue_weight * (sunlight + ambient_color) + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient_color));      // Final atmosphere additive -    color *= (1. - temp1); +    color *= (1. - combined_haze); -	// Increase ambient when there are more clouds -	vec4 tmpAmbient = ambient_color; -	tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5;  +    // Increase ambient when there are more clouds +    vec4 tmpAmbient = ambient_color; +    tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5; -	// Dim sunlight by cloud shadow percentage -	sunlight *= max(0.0, (1. - cloud_shadow)); +    // Dim sunlight by cloud shadow percentage +    sunlight *= max(0.0, (1. - cloud_shadow)); -	// Haze color below cloud -	vec4 additiveColorBelowCloud = (	  blue_horizon * blue_weight * (sunlight + tmpAmbient) -				+ (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient) -			 );	 +    // Haze color below cloud +    vec4 additiveColorBelowCloud = +        (blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)); -	// Attenuate cloud color by atmosphere -	temp1 = sqrt(temp1);	//less atmos opacity (more transparency) below clouds +    // Attenuate cloud color by atmosphere +    combined_haze = sqrt(combined_haze);  // less atmos opacity (more transparency) below clouds -	// At horizon, blend high altitude sky color towards the darker color below the clouds -	color += (additiveColorBelowCloud - color) * (1. - sqrt(temp1)); +    // At horizon, blend high altitude sky color towards the darker color below the clouds +    color += (additiveColorBelowCloud - color) * (1. - sqrt(combined_haze));      // Haze color above cloud -	vary_HazeColor = color;	 +    vary_HazeColor = color;  } - diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index a5804220bc..f80f1a985a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -124,41 +124,15 @@ void main()          if (spec.a > 0.0) // specular reflection          { +            float sa        = dot(refnormpersp, light_dir.xyz); +            vec3  dumbshiny = sunlit * (texture2D(lightFunc, vec2(sa, spec.a)).r); -#if 1 //EEP -            vec3 npos = -normalize(pos.xyz); - -            //vec3 ref = dot(pos+lv, norm); -            vec3 h = normalize(light_dir.xyz+npos); -            float nh = dot(norm.xyz, h); -            float nv = dot(norm.xyz, 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 scontrib = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); -                vec3 sp = sun_contrib*scontrib / 6.0; -                sp = clamp(sp, vec3(0), vec3(1)); -                bloom += dot(sp, sp) / 4.0; -                color += sp * spec.rgb; -            } -#else //PRODUCTION -            float sa = dot(refnormpersp, light_dir.xyz); -            vec3 dumbshiny = sunlit*(texture2D(lightFunc, vec2(sa, spec.a)).r); -                          // add the two types of shiny together              vec3 spec_contrib = dumbshiny * spec.rgb; -            bloom = dot(spec_contrib, spec_contrib) / 6; +            bloom             = dot(spec_contrib, spec_contrib) / 6;              color.rgb += spec_contrib; -#endif -          } -        +         color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a);          if (envIntensity > 0.0) diff --git a/indra/newview/app_settings/shaders/class1/environment/encodeNormF.glsl b/indra/newview/app_settings/shaders/class1/environment/encodeNormF.glsl index 50e781fa78..6cd2445522 100644 --- a/indra/newview/app_settings/shaders/class1/environment/encodeNormF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/encodeNormF.glsl @@ -23,6 +23,9 @@   * $/LicenseInfo$   */ +// Lambert Azimuthal Equal-Area projection +// See: https://aras-p.info/texts/CompactNormalStorage.html +// Also see: A_bit_more_deferred_-_CryEngine3.ppt  vec2 encode_normal(vec3 n)  {  	float f = sqrt(8 * n.z + 8); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl index f665394b46..0bb48061e0 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightAlphaMaskF.glsl @@ -31,6 +31,9 @@ out vec4 frag_color;  uniform float minimum_alpha; +// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; +uniform int no_atmo; +  vec3 atmosLighting(vec3 light);  vec3 scaleSoftClip(vec3 light); @@ -41,16 +44,19 @@ void default_lighting()  {  	vec4 color = diffuseLookup(vary_texcoord0.xy); -	color *= vertex_color; -  	if (color.a < minimum_alpha)  	{  		discard;  	} +	 +	color *= vertex_color; -	color.rgb = atmosLighting(color.rgb); - -	color.rgb = scaleSoftClip(color.rgb); +	// SL-9632 HUDs are affected by Atmosphere +	if (no_atmo == 0) +	{ +		color.rgb = atmosLighting(color.rgb); +		color.rgb = scaleSoftClip(color.rgb); +	}  	frag_color = color;  } diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl index 46390e4a0e..1855cfceeb 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightAlphaMaskF.glsl @@ -30,7 +30,10 @@ out vec4 frag_color;  #endif  uniform float minimum_alpha; -uniform float texture_gamma; +uniform float texture_gamma; // either 1.0 or 2.2; see: "::TEXTURE_GAMMA" + +// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass() +uniform int no_atmo;  vec3 fullbrightAtmosTransport(vec3 light);  vec3 fullbrightScaleSoftClip(vec3 light); @@ -50,9 +53,17 @@ void fullbright_lighting()  	color.rgb *= vertex_color.rgb;  	color.rgb = pow(color.rgb, vec3(texture_gamma)); -	color.rgb = fullbrightAtmosTransport(color.rgb); -	 -	color.rgb = fullbrightScaleSoftClip(color.rgb); + +	// SL-9632 HUDs are affected by Atmosphere +	if (no_atmo == 0) +	{ +		color.rgb = fullbrightAtmosTransport(color.rgb); +		color.rgb = fullbrightScaleSoftClip(color.rgb); +	} + +	//*TODO: Are we missing an inverse pow() here? +	// class1\lighting\lightFullbrightF.glsl has: +    //     color.rgb = pow(color.rgb, vec3(1.0/texture_gamma));  	frag_color = color;  } diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl index b967709c57..5fcdf3107c 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightF.glsl @@ -34,6 +34,9 @@ VARYING vec2 vary_texcoord0;  uniform float texture_gamma; +// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; +uniform int no_atmo; +  vec3 fullbrightAtmosTransport(vec3 light);  vec3 fullbrightScaleSoftClip(vec3 light); @@ -43,9 +46,12 @@ void fullbright_lighting()  	color.rgb = pow(color.rgb, vec3(texture_gamma)); -	color.rgb = fullbrightAtmosTransport(color.rgb); -	 -	color.rgb = fullbrightScaleSoftClip(color.rgb); +	// SL-9632 HUDs are affected by Atmosphere +	if (no_atmo == 0) +	{ +		color.rgb = fullbrightAtmosTransport(color.rgb); +		color.rgb = fullbrightScaleSoftClip(color.rgb); +	}  	color.rgb = pow(color.rgb, vec3(1.0/texture_gamma)); diff --git a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl index 567811cd75..6f7e777d23 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl @@ -35,20 +35,37 @@ VARYING vec3 vary_texcoord1;  uniform samplerCube environmentMap; +// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass() +uniform int no_atmo; +  vec3 fullbrightShinyAtmosTransport(vec3 light);  vec3 fullbrightScaleSoftClip(vec3 light); +// See: +//   class1\deferred\fullbrightShinyF.glsl +//   class1\lighting\lightFullbrightShinyF.glsl  void fullbright_shiny_lighting()  {  	vec4 color = diffuseLookup(vary_texcoord0.xy);  	color.rgb *= vertex_color.rgb; -	 -	vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;	 -	color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a*0.75); // MAGIC NUMBER SL-12574; ALM: Off, Quality > Low -	color.rgb = fullbrightShinyAtmosTransport(color.rgb); +	// SL-9632 HUDs are affected by Atmosphere +	if (no_atmo == 0) +	{ +		vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb; +		color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a*0.75); // MAGIC NUMBER SL-12574; ALM: Off, Quality > Low -	color.rgb = fullbrightScaleSoftClip(color.rgb); +		color.rgb = fullbrightShinyAtmosTransport(color.rgb); +		color.rgb = fullbrightScaleSoftClip(color.rgb); +	} +/* +	// NOTE: HUD objects will be full bright. Uncomment if you want "some" environment lighting effecting these HUD objects. +	else +	{ +		vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb; +		color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a*0.75); // MAGIC NUMBER SL-12574; ALM: Off, Quality > Low +	} +*/  	color.a = 1.0; diff --git a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl index a59bd9c0a6..9ef7704b70 100644 --- a/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl +++ b/indra/newview/app_settings/shaders/class1/objects/simpleV.glsl @@ -1,4 +1,4 @@ -/**  +/**   * @file simpleV.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$ @@ -28,6 +28,9 @@ uniform mat4 texture_matrix0;  uniform mat4 modelview_matrix;  uniform mat4 modelview_projection_matrix; +// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass() +uniform int no_atmo; +  ATTRIBUTE vec3 position;  void passTextureIndex();  ATTRIBUTE vec2 texcoord0; @@ -46,19 +49,23 @@ void main()  {  	//transform vertex  	vec4 vert = vec4(position.xyz,1.0); -	passTextureIndex(); -	vec4 pos = (modelview_matrix * vert);  	gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0); + +	passTextureIndex();  	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0, 0, 1)).xy; -	 -	 -	 -	vec3 norm = normalize(normal_matrix * normal); -	calcAtmospherics(pos.xyz); +	// SL-9632 HUDs are affected by Atmosphere +	if (no_atmo == 1) +	{ +		vertex_color = diffuse_color; +	} +	else +	{ +		vec4 pos = (modelview_matrix * vert); +		vec3 norm = normalize(normal_matrix * normal); -	vec4 color = calcLighting(pos.xyz, norm, diffuse_color); -	vertex_color = color; +		calcAtmospherics(pos.xyz); -	 +		vertex_color = calcLighting(pos.xyz, norm, diffuse_color); +	}  } diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index dcb02bd1c1..ea2690ba09 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -1,154 +1,134 @@ -/**  +/**   * @file class1\windlight\atmosphericsFuncs.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2019, 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 vec4 lightnorm; -uniform vec4 sunlight_color; -uniform vec4 moonlight_color; -uniform int sun_up_factor; -uniform vec4 ambient_color; -uniform vec4 blue_horizon; -uniform vec4 blue_density; +uniform vec4  lightnorm; +uniform vec4  sunlight_color; +uniform vec4  moonlight_color; +uniform int   sun_up_factor; +uniform vec4  ambient_color; +uniform vec4  blue_horizon; +uniform vec4  blue_density;  uniform float haze_horizon;  uniform float haze_density;  uniform float cloud_shadow;  uniform float density_multiplier;  uniform float distance_multiplier;  uniform float max_y; -uniform vec4 glow; +uniform vec4  glow;  uniform float scene_light_strength; -uniform mat3 ssao_effect_mat; -uniform int no_atmo; +uniform mat3  ssao_effect_mat; +uniform int   no_atmo;  uniform float sun_moon_glow_factor; -float getAmbientClamp() +float getAmbientClamp() { return 1.0f; } + +void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, +                         out vec3 atten, bool use_ao)  { -    return 1.0f; -} +    vec3 rel_pos = inPositionEye; +    //(TERRAIN) limit altitude +    if (abs(rel_pos.y) > max_y) rel_pos *= (max_y / rel_pos.y); -void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao) { +    vec3  rel_pos_norm = normalize(rel_pos); +    float rel_pos_len  = length(rel_pos); +    vec4  sunlight     = (sun_up_factor == 1) ? sunlight_color : moonlight_color; -    vec3 P = inPositionEye; -    -    //(TERRAIN) limit altitude -    if (P.y > max_y) P *= (max_y / P.y); -    if (P.y < -max_y) P *= (-max_y / P.y);  +    // sunlight attenuation effect (hue and brightness) due to atmosphere +    // this is used later for sunlight modulation at various altitudes +    vec4 light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y); +    // I had thought blue_density and haze_density should have equal weighting, +    // but attenuation due to haze_density tends to seem too strong -    vec3 tmpLightnorm = lightnorm.xyz; +    vec4 combined_haze = blue_density + vec4(haze_density); +    vec4 blue_weight   = blue_density / combined_haze; +    vec4 haze_weight   = vec4(haze_density) / combined_haze; -    vec3 Pn = normalize(P); -    float Plen = length(P); +    //(TERRAIN) compute sunlight from lightnorm y component. Factor is roughly cosecant(sun elevation) (for short rays like terrain) +    float above_horizon_factor = 1.0 / max(1e-6, lightnorm.y); +    sunlight *= exp(-light_atten * above_horizon_factor);  // for sun [horizon..overhead] this maps to an exp curve [0..1] + +    // main atmospheric scattering line integral +    float density_dist = rel_pos_len * density_multiplier; -    vec4 temp1 = vec4(0); -    vec3 temp2 = vec3(0); -    vec4 blue_weight; -    vec4 haze_weight; -    vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color; -    vec4 light_atten; +    // Transparency (-> combined_haze) +    // ATI Bugfix -- can't store combined_haze*density_dist*distance_multiplier in a variable because the ati +    // compiler gets confused. +    combined_haze = exp(-combined_haze * density_dist * distance_multiplier); -    float dens_mul = density_multiplier; -    float dist_mul = distance_multiplier; +    // final atmosphere attenuation factor +    atten = combined_haze.rgb; -    //sunlight attenuation effect (hue and brightness) due to atmosphere -    //this is used later for sunlight modulation at various altitudes -    light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y); -        //I had thought blue_density and haze_density should have equal weighting, -        //but attenuation due to haze_density tends to seem too strong +    // compute haze glow +    float haze_glow = dot(rel_pos_norm, lightnorm.xyz); -    temp1 = blue_density + vec4(haze_density); -    blue_weight = blue_density / temp1; -    haze_weight = vec4(haze_density) / temp1; +    // dampen sun additive contrib when not facing it... +    // SL-13539: This "if" clause causes an "additive" white artifact at roughly 77 degreees. +    //    if (length(light_dir) > 0.01) +    haze_glow *= max(0.0f, dot(light_dir, rel_pos_norm)); -    //(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain) -    temp2.y = max(0.0, tmpLightnorm.y); -    if (abs(temp2.y) > 0.000001f) -    { -        temp2.y = 1. / abs(temp2.y); -    } -    temp2.y = max(0.0000001f, temp2.y); -    sunlight *= exp(-light_atten * temp2.y); +    haze_glow = 1. - haze_glow; +    // haze_glow is 0 at the sun and increases away from sun +    haze_glow = max(haze_glow, .001);  // set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) +    haze_glow *= glow.x; +    // higher glow.x gives dimmer glow (because next step is 1 / "angle") +    haze_glow = pow(haze_glow, glow.z); +    // glow.z should be negative, so we're doing a sort of (1 / "angle") function -    // main atmospheric scattering line integral -    temp2.z = Plen * dens_mul; +    // add "minimum anti-solar illumination" +    haze_glow += .25; -    // Transparency (-> temp1) -    // ATI Bugfix -- can't store temp1*temp2.z*dist_mul in a variable because the ati -    // compiler gets confused. -    temp1 = exp(-temp1 * temp2.z * dist_mul); +    haze_glow *= sun_moon_glow_factor; -    //final atmosphere attenuation factor -    atten = temp1.rgb; -     -    //compute haze glow -    //(can use temp2.x as temp because we haven't used it yet) -    temp2.x = dot(Pn, tmpLightnorm.xyz); +    vec4 amb_color = ambient_color; -    // dampen sun additive contrib when not facing it... -    if (length(light_dir) > 0.01) -    { -        temp2.x *= max(0.0f, dot(light_dir, Pn)); -    } -    temp2.x = 1. - temp2.x; -        //temp2.x is 0 at the sun and increases away from sun -    temp2.x = max(temp2.x, .001);    //was glow.y -        //set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) -    temp2.x *= glow.x; -        //higher glow.x gives dimmer glow (because next step is 1 / "angle") -    temp2.x = pow(temp2.x, glow.z); -        //glow.z should be negative, so we're doing a sort of (1 / "angle") function - -    //add "minimum anti-solar illumination" -    temp2.x += .25; - -    temp2.x *= sun_moon_glow_factor; -  -    vec4 amb_color = ambient_color;  -     -    //increase ambient when there are more clouds +    // increase ambient when there are more clouds      vec4 tmpAmbient = amb_color + (vec4(1.) - amb_color) * cloud_shadow * 0.5; -     +      /*  decrease value and saturation (that in HSV, not HSL) for occluded areas       * // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html       * // The following line of code performs the equivalent of:       * float ambAlpha = tmpAmbient.a;       * float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis       * vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue); -     * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha); +     * tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, +     * ambAlpha);       */      if (use_ao)      {          tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a);      } -    //haze color -        additive = -        vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow) + tmpAmbient) -      + (haze_horizon * haze_weight) * (sunlight*(1.-cloud_shadow) * temp2.x -          + tmpAmbient)); +    // Similar/Shared Algorithms: +    //     indra\llinventory\llsettingssky.cpp                                        -- LLSettingsSky::calculateLightSettings() +    //     indra\newview\app_settings\shaders\class1\windlight\atmosphericsFuncs.glsl -- calcAtmosphericVars() +    // haze color +    vec3 cs = sunlight.rgb * (1. - cloud_shadow); +    additive = (blue_horizon.rgb * blue_weight.rgb) * (cs + tmpAmbient.rgb) + (haze_horizon * haze_weight.rgb) * (cs * haze_glow + tmpAmbient.rgb); -    //brightness of surface both sunlight and ambient +    // brightness of surface both sunlight and ambient      sunlit = sunlight.rgb * 0.5;      amblit = tmpAmbient.rgb * .25; -    additive *= vec3(1.0 - temp1); +    additive *= vec3(1.0 - combined_haze);  } diff --git a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl index 24f3992e32..2425a2ad04 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/moonF.glsl @@ -3,7 +3,7 @@   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2005, Linden Research, Inc. + * Copyright (C) 2005, 2020 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 @@ -36,28 +36,30 @@ out vec4 frag_color;  uniform vec4 color;  uniform vec4 sunlight_color;  uniform vec4 moonlight_color; -uniform vec3 lumWeights; +uniform vec3 moon_dir;  uniform float moon_brightness; -uniform float minLuminance;  uniform sampler2D diffuseMap; -uniform sampler2D altDiffuseMap; -uniform float blend_factor; // interp factor between moon A/B +  VARYING vec2 vary_texcoord0; +vec3 scaleSoftClip(vec3 light); +  void main()   { -    vec4 moonA = texture2D(diffuseMap, vary_texcoord0.xy); -    vec4 moonB = texture2D(altDiffuseMap, vary_texcoord0.xy); -    vec4 c     = mix(moonA, moonB, blend_factor); +    // Restore Pre-EEP alpha fade moon near horizon +    float fade = 1.0; +    if( moon_dir.z > 0 ) +        fade = clamp( moon_dir.z*moon_dir.z*4.0, 0.0, 1.0 ); + +    vec4 c     = texture2D(diffuseMap, vary_texcoord0.xy); +//       c.rgb = pow(c.rgb, vec3(0.7f)); // can't use "srgb_to_linear(color.rgb)" as that is a deferred only function +         c.rgb *= moonlight_color.rgb; +         c.rgb *= moon_brightness; -    // mix factor which blends when sunlight is brighter -    // and shows true moon color at night -    vec3 luma_weights = vec3(0.3, 0.5, 0.3); -    float mix = 1.0f - dot(normalize(sunlight_color.rgb), luma_weights); +         c.rgb *= fade; +         c.a   *= fade; -    vec3 exp = vec3(1.0 - mix * moon_brightness) * 2.0 - 1.0; -    c.rgb = pow(c.rgb, exp); -    //c.rgb *= moonlight_color.rgb; +         c.rgb  = scaleSoftClip(c.rgb);      frag_color = vec4(c.rgb, c.a);  } diff --git a/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl b/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl index 8cd4b2ef47..2fceb5f743 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/moonV.glsl @@ -3,7 +3,7 @@   *    * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. + * Copyright (C) 2007, 2020 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 @@ -30,20 +30,15 @@ uniform mat4 modelview_projection_matrix;  ATTRIBUTE vec3 position;  ATTRIBUTE vec2 texcoord0; -void calcAtmospherics(vec3 inPositionEye); -  VARYING vec2 vary_texcoord0;  void main()  {      //transform vertex -    vec3 offset = vec3(0, 0, 50); -    vec4 vert = vec4(position.xyz - offset, 1.0); +    vec4 vert = vec4(position.xyz, 1.0);      vec4 pos = (modelview_matrix * vert);      gl_Position = modelview_projection_matrix*vert;      vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; -     -    calcAtmospherics(pos.xyz);  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl index 1dce85a83b..1485c515a4 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/skyF.glsl @@ -1,24 +1,24 @@ -/**  +/**   * @file class2/deferred/skyF.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$   */ @@ -32,13 +32,13 @@ uniform mat4 modelview_projection_matrix;  // Inputs  uniform vec3 camPosLocal; -uniform vec4 lightnorm; -uniform vec4 sunlight_color; -uniform vec4 moonlight_color; -uniform int sun_up_factor; -uniform vec4 ambient_color; -uniform vec4 blue_horizon; -uniform vec4 blue_density; +uniform vec4  lightnorm; +uniform vec4  sunlight_color; +uniform vec4  moonlight_color; +uniform int   sun_up_factor; +uniform vec4  ambient_color; +uniform vec4  blue_horizon; +uniform vec4  blue_density;  uniform float haze_horizon;  uniform float haze_density; @@ -47,7 +47,7 @@ uniform float density_multiplier;  uniform float distance_multiplier;  uniform float max_y; -uniform vec4 glow; +uniform vec4  glow;  uniform float sun_moon_glow_factor;  uniform vec4 cloud_color; @@ -73,16 +73,16 @@ uniform float ice_level;  vec3 rainbow(float d)  { -   d = clamp(d, -1.0, 0.0); -   float rad = (droplet_radius - 5.0f) / 1024.0f; -   return pow(texture2D(rainbow_map, vec2(rad, d)).rgb, vec3(1.8)) * moisture_level; +    d         = clamp(d, -1.0, 0.0); +    float rad = (droplet_radius - 5.0f) / 1024.0f; +    return pow(texture2D(rainbow_map, vec2(rad, d)).rgb, vec3(1.8)) * moisture_level;  }  vec3 halo22(float d)  { -   d = clamp(d, 0.1, 1.0); -   float v = sqrt(clamp(1 - (d * d), 0, 1)); -   return texture2D(halo_map, vec2(0, v)).rgb * ice_level; +    d       = clamp(d, 0.1, 1.0); +    float v = sqrt(clamp(1 - (d * d), 0, 1)); +    return texture2D(halo_map, vec2(0, v)).rgb * ice_level;  }  /// Soft clips the light with a gamma correction @@ -90,115 +90,96 @@ vec3 scaleSoftClip(vec3 light);  void main()  { -      // World / view / projection -    // Get relative position -    vec3 P = pos.xyz - camPosLocal.xyz + vec3(0,50,0); +    // Get relative position (offset why?) +    vec3 rel_pos = pos.xyz - camPosLocal.xyz + vec3(0, 50, 0); -    // Set altitude -    if (P.y > 0.) +    // Adj position vector to clamp altitude +    if (rel_pos.y > 0.)      { -        P *= (max_y / P.y); +        rel_pos *= (max_y / rel_pos.y);      } -    else +    if (rel_pos.y < 0.)      { -        P *= (-32000. / P.y); +        rel_pos *= (-32000. / rel_pos.y);      } -    // Can normalize then -    vec3 Pn = normalize(P); -    float  Plen = length(P); +    // Normalized +    vec3  rel_pos_norm = normalize(rel_pos); +    float rel_pos_len  = length(rel_pos);      // Initialize temp variables -    vec4 temp1 = vec4(0.); -    vec4 temp2 = vec4(0.); -    vec4 blue_weight; -    vec4 haze_weight;      vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color; -    vec4 light_atten; - -    float dens_mul = density_multiplier;      // Sunlight attenuation effect (hue and brightness) due to atmosphere      // this is used later for sunlight modulation at various altitudes -    light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y); +    vec4 light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);      // Calculate relative weights -    temp1 = abs(blue_density) + vec4(abs(haze_density)); -    blue_weight = blue_density / temp1; -    haze_weight = haze_density / temp1; +    vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density)); +    vec4 blue_weight   = blue_density / combined_haze; +    vec4 haze_weight   = haze_density / combined_haze; -    // Compute sunlight from P & lightnorm (for long rays like sky) -    temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y ); -    temp2.y = 1. / temp2.y; -    sunlight *= exp( - light_atten * temp2.y); +    // Compute sunlight from rel_pos & lightnorm (for long rays like sky) +    float off_axis = 1.0 / max(1e-6, max(0, rel_pos_norm.y) + lightnorm.y); +    sunlight *= exp(-light_atten * off_axis);      // Distance -    temp2.z = Plen * dens_mul; +    float density_dist = rel_pos_len * density_multiplier; -    // Transparency (-> temp1) -    // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati +    // Transparency (-> combined_haze) +    // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati      // compiler gets confused. -    temp1 = exp(-temp1 * temp2.z); +    combined_haze = exp(-combined_haze * density_dist);      // Compute haze glow -    temp2.x = dot(Pn, lightnorm.xyz); -    temp2.x = 1. - temp2.x; -        // temp2.x is 0 at the sun and increases away from sun -    temp2.x = max(temp2.x, .001);    -        // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) -    temp2.x *= glow.x; -        // Higher glow.x gives dimmer glow (because next step is 1 / "angle") -    temp2.x = pow(temp2.x, glow.z); -        // glow.z should be negative, so we're doing a sort of (1 / "angle") function +    float haze_glow = dot(rel_pos_norm, lightnorm.xyz); +    haze_glow       = 1. - haze_glow; +    // haze_glow is 0 at the sun and increases away from sun +    haze_glow = max(haze_glow, .001); +    // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) +    haze_glow *= glow.x; +    // Higher glow.x gives dimmer glow (because next step is 1 / "angle") +    haze_glow = pow(haze_glow, glow.z); +    // glow.z should be negative, so we're doing a sort of (1 / "angle") function      // Add "minimum anti-solar illumination" -    temp2.x += .25; - -    temp2.x *= sun_moon_glow_factor; +    // For sun, add to glow.  For moon, remove glow entirely. SL-13768 +    haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (sun_moon_glow_factor * (haze_glow + 0.25));      // Haze color above cloud -    vec4 color = (    blue_horizon * blue_weight * (sunlight + ambient_color) -                + (haze_horizon * haze_weight) * (sunlight * temp2.x + ambient_color) -             );  +    vec4 color = blue_horizon * blue_weight * (sunlight + ambient_color)  +               + haze_horizon * haze_weight * (sunlight * haze_glow + ambient_color);      // Final atmosphere additive -    color *= (1. - temp1); +    color *= (1. - combined_haze);      // Increase ambient when there are more clouds -    vec4 tmpAmbient = ambient_color; -    tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5;  +    // TODO 9/20: DJH what does this do?  max(0,(1-ambient)) will change the color +    vec4 ambient = ambient_color + max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5;      // Dim sunlight by cloud shadow percentage      sunlight *= max(0.0, (1. - cloud_shadow));      // Haze color below cloud -    vec4 additiveColorBelowCloud = (blue_horizon * blue_weight * (sunlight + tmpAmbient) -                + (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient) -             );  +    vec4 add_below_cloud = blue_horizon * blue_weight * (sunlight + ambient)  +                         + haze_horizon * haze_weight * (sunlight * haze_glow + ambient); -     -          // Attenuate cloud color by atmosphere -    temp1 = sqrt(temp1);    //less atmos opacity (more transparency) below clouds +    combined_haze = sqrt(combined_haze);  // less atmos opacity (more transparency) below clouds      // At horizon, blend high altitude sky color towards the darker color below the clouds -    color += (additiveColorBelowCloud - color) * (1. - sqrt(temp1)); -     -    float optic_d = dot(Pn, lightnorm.xyz); - -    vec3 halo_22 = halo22(optic_d); +    color += (add_below_cloud - color) * (1. - sqrt(combined_haze)); +    float optic_d = dot(rel_pos_norm, lightnorm.xyz); +    vec3  halo_22 = halo22(optic_d);      color.rgb += rainbow(optic_d); -      color.rgb += halo_22; -      color.rgb *= 2.;      color.rgb = scaleSoftClip(color.rgb); -    /// Gamma correct for WL (soft clip effect). +    // Gamma correct for WL (soft clip effect).      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.0,0.0,0.0,1.0); //1.0 in norm.w masks off fog +    frag_data[1] = vec4(0.0, 0.0, 0.0, 0.0); +    frag_data[2] = vec4(0.0, 0.0, 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 b0dff0c628..f4db53e0b7 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -1,24 +1,24 @@ -/**  +/**   * @file class2/deferred/softenLightF.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$   */ @@ -39,7 +39,7 @@ uniform sampler2DRect specularRect;  uniform sampler2DRect normalMap;  uniform sampler2DRect lightMap;  uniform sampler2DRect depthMap; -uniform samplerCube environmentMap; +uniform samplerCube   environmentMap;  uniform sampler2D     lightFunc;  uniform float blur_size; @@ -50,7 +50,7 @@ uniform mat3 env_mat;  uniform vec3 sun_dir;  uniform vec3 moon_dir; -uniform int sun_up_factor; +uniform int  sun_up_factor;  VARYING vec2 vary_fragcoord;  uniform mat4 inv_proj; @@ -61,10 +61,10 @@ vec4 getPositionWithDepth(vec2 pos_screen, float depth);  void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);  float getAmbientClamp(); -vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten); -vec3 scaleSoftClipFrag(vec3 l); -vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten); -vec3 fullbrightScaleSoftClip(vec3 light); +vec3  atmosFragLighting(vec3 l, vec3 additive, vec3 atten); +vec3  scaleSoftClipFrag(vec3 l); +vec3  fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten); +vec3  fullbrightScaleSoftClip(vec3 light);  vec3 linear_to_srgb(vec3 c);  vec3 srgb_to_linear(vec3 c); @@ -73,128 +73,85 @@ vec3 srgb_to_linear(vec3 c);  vec4 applyWaterFogView(vec3 pos, vec4 color);  #endif -void main()  +void main()  { -    vec2 tc = vary_fragcoord.xy; -    float depth = texture2DRect(depthMap, tc.xy).r; -    vec4 pos = getPositionWithDepth(tc, depth); -    vec4 norm = texture2DRect(normalMap, tc); +    vec2  tc           = vary_fragcoord.xy; +    float depth        = texture2DRect(depthMap, tc.xy).r; +    vec4  pos          = getPositionWithDepth(tc, depth); +    vec4  norm         = texture2DRect(normalMap, tc);      float envIntensity = norm.z; -    norm.xyz = getNorm(tc); -     -    vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir; -    float da = clamp(dot(norm.xyz, light_dir.xyz), 0.0, 1.0); -    float light_gamma = 1.0/1.3; -    da = pow(da, light_gamma); -     +    norm.xyz           = getNorm(tc); + +    vec3  light_dir   = (sun_up_factor == 1) ? sun_dir : moon_dir; +    float da          = clamp(dot(norm.xyz, light_dir.xyz), 0.0, 1.0); +    float light_gamma = 1.0 / 1.3; +    da                = pow(da, light_gamma); +      vec4 diffuse = texture2DRect(diffuseRect, tc); -     -    vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); +    vec4 spec    = texture2DRect(specularRect, vary_fragcoord.xy);      vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg; -    scol_ambocc = pow(scol_ambocc, vec2(light_gamma)); +    scol_ambocc      = pow(scol_ambocc, vec2(light_gamma)); +    float scol       = max(scol_ambocc.r, diffuse.a); +    float ambocc     = scol_ambocc.g; -    float scol = max(scol_ambocc.r, diffuse.a);  +    vec3  color = vec3(0); +    float bloom = 0.0; -    float ambocc = scol_ambocc.g; +    vec3 sunlit; +    vec3 amblit; +    vec3 additive; +    vec3 atten; +    calcAtmosphericVars(pos.xyz, light_dir, ambocc, sunlit, amblit, additive, atten, true); -    vec3 color = vec3(0); -    float bloom = 0.0; +    color.rgb = amblit; + +    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 *= diffuse.rgb; + +    vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); + +    if (spec.a > 0.0)  // specular reflection      { -        vec3 sunlit; -        vec3 amblit; -        vec3 additive; -        vec3 atten; -     -        calcAtmosphericVars(pos.xyz, light_dir, ambocc, sunlit, amblit, additive, atten, true); - -        color.rgb = amblit; - -        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 *= diffuse.rgb; - -        vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); - -        if (spec.a > 0.0) // specular reflection -        { - -#if 1 //EEP -            vec3 npos = -normalize(pos.xyz); - -            //vec3 ref = dot(pos+lv, norm); -            vec3 h = normalize(light_dir.xyz+npos); -            float nh = dot(norm.xyz, h); -            float nv = dot(norm.xyz, 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 scontrib = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); -                vec3 sp = sun_contrib*scontrib / 6.0; -                sp = clamp(sp, vec3(0), vec3(1)); -                bloom += dot(sp, sp) / 4.0; -                color += sp * spec.rgb; -            } -#else //PRODUCTION -            float sa = dot(refnormpersp, light_dir.xyz); -            vec3 dumbshiny = sunlit*(texture2D(lightFunc, vec2(sa, spec.a)).r); -             -            // add the two types of shiny together -            vec3 spec_contrib = dumbshiny * spec.rgb; -            bloom = dot(spec_contrib, spec_contrib) / 6; -            color.rgb += spec_contrib; -#endif +        float sa        = dot(refnormpersp, light_dir.xyz); +        vec3  dumbshiny = sunlit * scol * (texture2D(lightFunc, vec2(sa, spec.a)).r); + +        // add the two types of shiny together +        vec3 spec_contrib = dumbshiny * spec.rgb; +        bloom             = dot(spec_contrib, spec_contrib) / 6; +        color.rgb += spec_contrib; +    } + +    color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a); -        } -        -       color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a); - -        if (envIntensity > 0.0) -        { //add environmentmap -            vec3 env_vec = env_mat * refnormpersp; -            vec3 reflected_color = textureCube(environmentMap, env_vec).rgb; -            color = mix(color.rgb, reflected_color, envIntensity); -        } -        -        if (norm.w < 0.5) -        { -            color = mix(atmosFragLighting(color, additive, atten), fullbrightAtmosTransportFrag(color, additive, atten), diffuse.a); -            color = mix(scaleSoftClipFrag(color), fullbrightScaleSoftClip(color), diffuse.a); -        } - -        #ifdef WATER_FOG -            vec4 fogged = applyWaterFogView(pos.xyz,vec4(color, bloom)); -            color = fogged.rgb; -            bloom = fogged.a; -        #endif +    if (envIntensity > 0.0) +    {  // add environmentmap +        vec3 env_vec         = env_mat * refnormpersp; +        vec3 reflected_color = textureCube(environmentMap, env_vec).rgb; +        color                = mix(color.rgb, reflected_color, envIntensity); +    } +    if (norm.w < 0.5) +    { +        color = mix(atmosFragLighting(color, additive, atten), fullbrightAtmosTransportFrag(color, additive, atten), diffuse.a); +        color = mix(scaleSoftClipFrag(color), fullbrightScaleSoftClip(color), diffuse.a);      } -// linear debuggables -//color.rgb = vec3(final_da); -//color.rgb = vec3(ambient); -//color.rgb = vec3(scol); -//color.rgb = diffuse_srgb.rgb; +#ifdef WATER_FOG +    vec4 fogged = applyWaterFogView(pos.xyz, vec4(color, bloom)); +    color       = fogged.rgb; +    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.a = bloom; +    frag_color.a   = bloom;  } - diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl index 2c1475d547..1f881eb44b 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl @@ -1,24 +1,24 @@ -/**  +/**   * @file class2\wl\cloudsV.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$   */ @@ -33,25 +33,26 @@ ATTRIBUTE vec2 texcoord0;  ///////////////////////////////////////////////////////////////////////////////  // Output parameters -VARYING vec4 vary_CloudColorSun; -VARYING vec4 vary_CloudColorAmbient; +VARYING vec4  vary_CloudColorSun; +VARYING vec4  vary_CloudColorAmbient;  VARYING float vary_CloudDensity; -VARYING vec2 vary_texcoord0; -VARYING vec2 vary_texcoord1; -VARYING vec2 vary_texcoord2; -VARYING vec2 vary_texcoord3; + +VARYING vec2  vary_texcoord0; +VARYING vec2  vary_texcoord1; +VARYING vec2  vary_texcoord2; +VARYING vec2  vary_texcoord3;  VARYING float altitude_blend_factor;  // Inputs  uniform vec3 camPosLocal; -uniform vec4 lightnorm; -uniform vec4 sunlight_color; -uniform vec4 moonlight_color; -uniform int sun_up_factor; -uniform vec4 ambient_color; -uniform vec4 blue_horizon; -uniform vec4 blue_density; +uniform vec4  lightnorm; +uniform vec4  sunlight_color; +uniform vec4  moonlight_color; +uniform int   sun_up_factor; +uniform vec4  ambient_color; +uniform vec4  blue_horizon; +uniform vec4  blue_density;  uniform float haze_horizon;  uniform float haze_density; @@ -59,141 +60,133 @@ uniform float cloud_shadow;  uniform float density_multiplier;  uniform float max_y; -uniform vec4 glow; +uniform vec4  glow;  uniform float sun_moon_glow_factor;  uniform vec4 cloud_color;  uniform float cloud_scale; +// NOTE: Keep these in sync! +//       indra\newview\app_settings\shaders\class1\deferred\skyV.glsl +//       indra\newview\app_settings\shaders\class1\deferred\cloudsV.glsl +//       indra\newview\app-settings\shaders\class2\windlight\cloudsV.glsl +//       indra\newview\lllegacyatmospherics.cpp +//       indra\newview\llsettingsvo.cpp  void main()  { +    // World / view / projection +    gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); + +    // Texture coords +    // SL-13084 EEP added support for custom cloud textures -- flip them horizontally to match the preview of Clouds > Cloud Scroll +    vary_texcoord0 = vec2(-texcoord0.x, texcoord0.y);  // See: LLSettingsVOSky::applySpecial -	// World / view / projection -	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); +    vary_texcoord0.xy -= 0.5; +    vary_texcoord0.xy /= cloud_scale; +    vary_texcoord0.xy += 0.5; -	vary_texcoord0 = texcoord0; +    vary_texcoord1 = vary_texcoord0; +    vary_texcoord1.x += lightnorm.x * 0.0125; +    vary_texcoord1.y += lightnorm.z * 0.0125; -	// Get relative position -	vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0); +    vary_texcoord2 = vary_texcoord0 * 16.; +    vary_texcoord3 = vary_texcoord1 * 16.; + +    // Get relative position +    vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0);      // fade clouds beyond a certain point so the bottom of the sky dome doesn't look silly at high altitude -    altitude_blend_factor = clamp((P.y + 512.0) / max_y, 0.0, 1.0); - -	// Set altitude -	if (P.y > 0.) -	{ -		P *= (max_y / P.y); -	} -	else -	{ -		P *= (-32000. / P.y); -	} - -	// Can normalize then -	vec3 Pn = normalize(P); -	float  Plen = length(P); - -	// Initialize temp variables -	vec4 temp1 = vec4(0.); -	vec4 temp2 = vec4(0.); -	vec4 blue_weight; -	vec4 haze_weight; -	//vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color; -	vec4 sunlight = sunlight_color; -	vec4 light_atten; - -    float dens_mul = density_multiplier; - -	// Sunlight attenuation effect (hue and brightness) due to atmosphere -	// this is used later for sunlight modulation at various altitudes -	light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y); - -	// Calculate relative weights -	temp1 = abs(blue_density) + vec4(abs(haze_density)); -	blue_weight = blue_density / temp1; -	haze_weight = haze_density / temp1; - -	// Compute sunlight from P & lightnorm (for long rays like sky) -	temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y ); -	temp2.y = 1. / temp2.y; -	sunlight *= exp( - light_atten * temp2.y); - -	// Distance -	temp2.z = Plen * dens_mul; - -	// Transparency (-> temp1) -	// ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati -	// compiler gets confused. -	temp1 = exp(-temp1 * temp2.z); - - -	// Compute haze glow -	temp2.x = dot(Pn, lightnorm.xyz); -	temp2.x = 1. - temp2.x; -		// temp2.x is 0 at the sun and increases away from sun -	temp2.x = max(temp2.x, .001);	 -		// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) -	temp2.x *= glow.x; -		// Higher glow.x gives dimmer glow (because next step is 1 / "angle") -	temp2.x = pow(temp2.x, glow.z); -		// glow.z should be negative, so we're doing a sort of (1 / "angle") function - -    temp2.x *= sun_moon_glow_factor; - -	// Add "minimum anti-solar illumination" -	temp2.x += .25; - -	// Increase ambient when there are more clouds -	vec4 tmpAmbient = ambient_color; -	tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5;  - -	// Dim sunlight by cloud shadow percentage -	sunlight *= (1. - cloud_shadow); - -	// Haze color below cloud -	vec4 additiveColorBelowCloud = (	  blue_horizon * blue_weight * (sunlight + tmpAmbient) -				+ (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient) -			 );	 - -	// CLOUDS -	temp2.y = max(0., lightnorm.y * 2.); -	temp2.y = 1. / temp2.y; -	sunlight *= exp( - light_atten * temp2.y); - -	// Cloud color out -	vary_CloudColorSun = (sunlight * temp2.x) * cloud_color; -	vary_CloudColorAmbient = tmpAmbient * cloud_color; -	 -	// Attenuate cloud color by atmosphere -	temp1 = sqrt(temp1);	//less atmos opacity (more transparency) below clouds -	vary_CloudColorSun *= temp1; -	vary_CloudColorAmbient *= temp1; -	vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - temp1); - -	// Make a nice cloud density based on the cloud_shadow value that was passed in. -	vary_CloudDensity = 2. * (cloud_shadow - 0.25); - - -	// Texture coords -	vary_texcoord0 = texcoord0; -	vary_texcoord0.xy -= 0.5; -	vary_texcoord0.xy /= cloud_scale; -	vary_texcoord0.xy += 0.5; - -	vary_texcoord1 = vary_texcoord0; -	vary_texcoord1.x += lightnorm.x * 0.0125; -	vary_texcoord1.y += lightnorm.z * 0.0125; - -	vary_texcoord2 = vary_texcoord0 * 16.; -	vary_texcoord3 = vary_texcoord1 * 16.; - -	// Combine these to minimize register use -	vary_CloudColorAmbient += oHazeColorBelowCloud; - -	// needs this to compile on mac -	//vary_AtmosAttenuation = vec3(0.0,0.0,0.0); - -	// END CLOUDS +    altitude_blend_factor = clamp((rel_pos.y + 512.0) / max_y, 0.0, 1.0); + +    // Adj position vector to clamp altitude +    if (rel_pos.y > 0.) +    { +        rel_pos *= (max_y / rel_pos.y); +    } +    if (rel_pos.y < 0.) +    { +        rel_pos *= (-32000. / rel_pos.y); +    } + +    // Can normalize then +    vec3  rel_pos_norm = normalize(rel_pos); +    float rel_pos_len  = length(rel_pos); + +    // Initialize temp variables +    vec4 sunlight = sunlight_color; +    vec4 light_atten; + +    // Sunlight attenuation effect (hue and brightness) due to atmosphere +    // this is used later for sunlight modulation at various altitudes +    light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y); + +    // Calculate relative weights +    vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density)); +    vec4 blue_weight   = blue_density / combined_haze; +    vec4 haze_weight   = haze_density / combined_haze; + +    // Compute sunlight from rel_pos & lightnorm (for long rays like sky) +    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); +    sunlight *= exp(-light_atten * off_axis); + +    // Distance +    float density_dist = rel_pos_len * density_multiplier; + +    // Transparency (-> combined_haze) +    // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati +    // compiler gets confused. +    combined_haze = exp(-combined_haze * density_dist); + +    // Compute haze glow +    float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz); +    // haze_glow is 0 at the sun and increases away from sun +    haze_glow = max(haze_glow, .001); +    // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) +    haze_glow *= glow.x; +    // Higher glow.x gives dimmer glow (because next step is 1 / "angle") +    haze_glow = pow(haze_glow, glow.z); +    // glow.z should be negative, so we're doing a sort of (1 / "angle") function + +    haze_glow *= sun_moon_glow_factor; + +    // Add "minimum anti-solar illumination" +    // For sun, add to glow.  For moon, remove glow entirely. SL-13768 +    haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25); + +    // Increase ambient when there are more clouds +    vec4 tmpAmbient = ambient_color; +    tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5; + +    // Dim sunlight by cloud shadow percentage +    sunlight *= (1. - cloud_shadow); + +    // Haze color below cloud +    vec4 additiveColorBelowCloud = +        (blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)); + +    // CLOUDS +    off_axis = 1.0 / max(1e-6, lightnorm.y * 2.); +    sunlight *= exp(-light_atten * off_axis); + +    // Cloud color out +    vary_CloudColorSun     = (sunlight * haze_glow) * cloud_color; +    vary_CloudColorAmbient = tmpAmbient * cloud_color; + +    // Attenuate cloud color by atmosphere +    combined_haze = sqrt(combined_haze);  // less atmos opacity (more transparency) below clouds +    vary_CloudColorSun *= combined_haze; +    vary_CloudColorAmbient *= combined_haze; +    vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - combined_haze); + +    // Make a nice cloud density based on the cloud_shadow value that was passed in. +    vary_CloudDensity = 2. * (cloud_shadow - 0.25); + +    // Combine these to minimize register use +    vary_CloudColorAmbient += oHazeColorBelowCloud; + +    // needs this to compile on mac +    // vary_AtmosAttenuation = vec3(0.0,0.0,0.0); + +    // END CLOUDS  } - diff --git a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl index 0d141342ce..a0a33b8642 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/skyV.glsl @@ -1,28 +1,28 @@ -/**  +/**   * @file class2\wl\skyV.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; @@ -37,13 +37,13 @@ VARYING vec4 vary_HazeColor;  // Inputs  uniform vec3 camPosLocal; -uniform vec4 lightnorm; -uniform vec4 sunlight_color; -uniform vec4 moonlight_color; -uniform int sun_up_factor; -uniform vec4 ambient_color; -uniform vec4 blue_horizon; -uniform vec4 blue_density; +uniform vec4  lightnorm; +uniform vec4  sunlight_color; +uniform vec4  moonlight_color; +uniform int   sun_up_factor; +uniform vec4  ambient_color; +uniform vec4  blue_horizon; +uniform vec4  blue_density;  uniform float haze_horizon;  uniform float haze_density; @@ -52,110 +52,98 @@ uniform float density_multiplier;  uniform float distance_multiplier;  uniform float max_y; -uniform vec4 glow; +uniform vec4  glow;  uniform float sun_moon_glow_factor;  uniform vec4 cloud_color;  void main()  { - -	// World / view / projection +    // World / view / projection      vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0); -	gl_Position = pos; -	 -	// Get relative position -	vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0); - -	// Set altitude -	if (P.y > 0.) -	{ -		P *= (max_y / P.y); -	} -	else -	{ -		P *= (-32000. / P.y); -	} - -	// Can normalize then -	vec3 Pn = normalize(P); - -	float Plen = length(P); - -	// Initialize temp variables -	vec4 temp1 = vec4(0.); -	vec4 temp2 = vec4(0.); -	vec4 blue_weight; -	vec4 haze_weight; -	vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color; -	vec4 light_atten; - -    float dens_mul = density_multiplier; - -	// Sunlight attenuation effect (hue and brightness) due to atmosphere -	// this is used later for sunlight modulation at various altitudes -	light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y); - -	// Calculate relative weights -	temp1 = abs(blue_density) + vec4(abs(haze_density)); -	blue_weight = blue_density / temp1; -	haze_weight = haze_density / temp1; - -	// Compute sunlight from P & lightnorm (for long rays like sky) -    temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y ); -    temp2.y = 1. / temp2.y; -    sunlight *= exp( - light_atten * temp2.y); - -	// Distance -	temp2.z = Plen * dens_mul; - -	// Transparency (-> temp1) -    // ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati -    // compiler gets confused. -    temp1 = exp(-temp1 * temp2.z); +    gl_Position = pos; + +    // Get relative position +    vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0); + +    // Adj position vector to clamp altitude +    if (rel_pos.y > 0.) +    { +        rel_pos *= (max_y / rel_pos.y); +    } +    if (rel_pos.y < 0.) +    { +        rel_pos *= (-32000. / rel_pos.y); +    } -	// Compute haze glow -	temp2.x = dot(Pn, lightnorm.xyz); -	temp2.x = 1. - temp2.x; -		// temp2.x is 0 at the sun and increases away from sun -	temp2.x = max(temp2.x, .001);	 -		// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) -	temp2.x *= glow.x; -		// Higher glow.x gives dimmer glow (because next step is 1 / "angle") -	temp2.x = pow(temp2.x, glow.z); -		// glow.z should be negative, so we're doing a sort of (1 / "angle") function +    // Can normalize then +    vec3 rel_pos_norm = normalize(rel_pos); -	// Add "minimum anti-solar illumination" -	temp2.x += .25; +    float rel_pos_len = length(rel_pos); -    vec4 color = (    blue_horizon * blue_weight * (sunlight + ambient_color) -                + (haze_horizon * haze_weight) * (sunlight * temp2.x + ambient_color) -             ); +    // Initialize temp variables +    vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color; +    vec4 light_atten; +    // Sunlight attenuation effect (hue and brightness) due to atmosphere +    // this is used later for sunlight modulation at various altitudes +    light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y); + +    // Calculate relative weights +    vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density)); +    vec4 blue_weight   = blue_density / combined_haze; +    vec4 haze_weight   = haze_density / combined_haze; + +    // Compute sunlight from rel_pos & lightnorm (for long rays like sky) +    float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y); +    sunlight *= exp(-light_atten * off_axis); + +    // Distance +    float density_dist = rel_pos_len * density_multiplier; + +    // Transparency (-> combined_haze) +    // ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati +    // compiler gets confused. +    combined_haze = exp(-combined_haze * density_dist); + +    // Compute haze glow +    float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz); +    // haze_glow is 0 at the sun and increases away from sun +    haze_glow = max(haze_glow, .001); +    // Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) +    haze_glow *= glow.x; +    // Higher glow.x gives dimmer glow (because next step is 1 / "angle") +    haze_glow = pow(haze_glow, glow.z); +    // glow.z should be negative, so we're doing a sort of (1 / "angle") function + +    // Add "minimum anti-solar illumination" +    // For sun, add to glow.  For moon, remove glow entirely. SL-13768 +    haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25); + +    vec4 color = +        (blue_horizon * blue_weight * (sunlight + ambient_color) + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient_color));      // Final atmosphere additive -    color *= (1. - temp1); +    color *= (1. - combined_haze); -	// Increase ambient when there are more clouds -	vec4 tmpAmbient = ambient_color; -	tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5;  +    // Increase ambient when there are more clouds +    vec4 tmpAmbient = ambient_color; +    tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5; -	// Dim sunlight by cloud shadow percentage -	sunlight *= max(0.0, (1. - cloud_shadow)); +    // Dim sunlight by cloud shadow percentage +    sunlight *= max(0.0, (1. - cloud_shadow)); -	// Haze color below cloud -	vec4 additiveColorBelowCloud = (	  blue_horizon * blue_weight * (sunlight + tmpAmbient) -				+ (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient) -			 );	 +    // Haze color below cloud +    vec4 additiveColorBelowCloud = +        (blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient)); -	// Attenuate cloud color by atmosphere -	temp1 = sqrt(temp1);	//less atmos opacity (more transparency) below clouds +    // Attenuate cloud color by atmosphere +    combined_haze = sqrt(combined_haze);  // less atmos opacity (more transparency) below clouds -	// At horizon, blend high altitude sky color towards the darker color below the clouds -	color += (additiveColorBelowCloud - color) * (1. - sqrt(temp1)); +    // At horizon, blend high altitude sky color towards the darker color below the clouds +    color += (additiveColorBelowCloud - color) * (1. - sqrt(combined_haze));      // Haze color above cloud -	vary_HazeColor = color;	 +    vary_HazeColor = color;  } - | 
