diff options
Diffstat (limited to 'indra')
27 files changed, 1129 insertions, 884 deletions
| diff --git a/indra/edit-me-to-trigger-new-build.txt b/indra/edit-me-to-trigger-new-build.txt index fd40910d9e..c76e18f480 100644 --- a/indra/edit-me-to-trigger-new-build.txt +++ b/indra/edit-me-to-trigger-new-build.txt @@ -1,4 +1,4 @@ - +euclid 5/29/2020 diff --git a/indra/llcommon/llsdutil.cpp b/indra/llcommon/llsdutil.cpp index d44387cc55..3f3edb661f 100644 --- a/indra/llcommon/llsdutil.cpp +++ b/indra/llcommon/llsdutil.cpp @@ -506,7 +506,7 @@ struct Data      const char* name;  } typedata[] =  { -#define def(type) { LLSD::type, #type + 4 } +#define def(type) { LLSD::type, &#type[4] }      def(TypeUndefined),      def(TypeBoolean),      def(TypeInteger), diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 84f3796398..1434ce42ed 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -2701,6 +2701,7 @@ LLGLSPipelineBlendSkyBox::LLGLSPipelineBlendSkyBox(bool depth_test, bool depth_w  #if LL_WINDOWS  // Expose desired use of high-performance graphics processor to Optimus driver +// https://docs.nvidia.com/gameworks/content/technologies/desktop/optimus.htm  extern "C"   {       _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;  diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp index 384e5bf99f..74cfa60b27 100644 --- a/indra/llrender/llglslshader.cpp +++ b/indra/llrender/llglslshader.cpp @@ -37,6 +37,10 @@  #include "OpenGL/OpenGL.h"  #endif +// Print-print list of shader included source files that are linked together via glAttachObjectARB() +// i.e. On macOS / OSX the AMD GLSL linker will display an error if a varying is left in an undefined state. +#define DEBUG_SHADER_INCLUDES 0 +  // Lots of STL stuff in here, using namespace std to keep things more readable  using std::vector;  using std::pair; @@ -402,6 +406,10 @@ BOOL LLGLSLShader::createShader(std::vector<LLStaticHashedString> * attributes,      mDefines["OLD_SELECT"] = "1";  #endif +#if DEBUG_SHADER_INCLUDES +    fprintf(stderr, "--- %s ---\n", mName.c_str()); +#endif // DEBUG_SHADER_INCLUDES +      //compile new source      vector< pair<string,GLenum> >::iterator fileIter = mShaderFiles.begin();      for ( ; fileIter != mShaderFiles.end(); fileIter++ ) @@ -485,11 +493,36 @@ BOOL LLGLSLShader::createShader(std::vector<LLStaticHashedString> * attributes,      return success;  } -BOOL LLGLSLShader::attachVertexObject(std::string object_path) { +#if DEBUG_SHADER_INCLUDES +void dumpAttachObject( const char *func_name, GLhandleARB program_object, const std::string &object_path ) +{ +    GLcharARB* info_log; +    GLint      info_len_expect = 0; +    GLint      info_len_actual = 0; + +    glGetObjectParameterivARB(program_object, GL_OBJECT_INFO_LOG_LENGTH_ARB, &info_len_expect); +    fprintf(stderr, " * %-20s(), log size: %d, %s\n", func_name, info_len_expect, object_path.c_str()); + +    if (info_len_expect > 0) +    { +        fprintf(stderr, " ========== %s() ========== \n", func_name); +        info_log = new GLcharARB [ info_len_expect ]; +        glGetInfoLogARB(program_object, info_len_expect, &info_len_actual, info_log); +        fprintf(stderr, "%s\n",  info_log); +        delete [] info_log; +    } +} +#endif // DEBUG_SHADER_INCLUDES + +BOOL LLGLSLShader::attachVertexObject(std::string object_path) +{      if (LLShaderMgr::instance()->mVertexShaderObjects.count(object_path) > 0)      {          stop_glerror();          glAttachObjectARB(mProgramObject, LLShaderMgr::instance()->mVertexShaderObjects[object_path]); +#if DEBUG_SHADER_INCLUDES +        dumpAttachObject("attachVertexObject", mProgramObject, object_path); +#endif // DEBUG_SHADER_INCLUDES          stop_glerror();          return TRUE;      } @@ -506,6 +539,9 @@ BOOL LLGLSLShader::attachFragmentObject(std::string object_path)      {          stop_glerror();          glAttachObjectARB(mProgramObject, LLShaderMgr::instance()->mFragmentShaderObjects[object_path]); +#if DEBUG_SHADER_INCLUDES +        dumpAttachObject("attachFragmentObject", mProgramObject, object_path); +#endif // DEBUG_SHADER_INCLUDES          stop_glerror();          return TRUE;      } @@ -522,6 +558,10 @@ void LLGLSLShader::attachObject(GLhandleARB object)      {          stop_glerror();          glAttachObjectARB(mProgramObject, object); +#if DEBUG_SHADER_INCLUDES +        std::string object_path("???"); +        dumpAttachObject("attachObject", mProgramObject, object_path); +#endif // DEBUG_SHADER_INCLUDES          stop_glerror();      }      else diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index ff74380217..3b6a49735e 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -985,38 +985,56 @@ BOOL LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image)  		return FALSE;  	} -	if( !mHasExplicitFormat ) -	{ -		switch (mComponents) -		{ -			case 1: -			// Use luminance alpha (for fonts) -			mFormatInternal = GL_LUMINANCE8; -			mFormatPrimary = GL_LUMINANCE; -			mFormatType = GL_UNSIGNED_BYTE; -			break; -			case 2: -			// Use luminance alpha (for fonts) -			mFormatInternal = GL_LUMINANCE8_ALPHA8; -			mFormatPrimary = GL_LUMINANCE_ALPHA; -			mFormatType = GL_UNSIGNED_BYTE; -			break; -			case 3: -			mFormatInternal = GL_RGB8; -			mFormatPrimary = GL_RGB; -			mFormatType = GL_UNSIGNED_BYTE; -			break; -			case 4: -			mFormatInternal = GL_RGBA8; -			mFormatPrimary = GL_RGBA; -			mFormatType = GL_UNSIGNED_BYTE; -			break; -			default: -			LL_ERRS() << "Bad number of components for texture: " << (U32)getComponents() << LL_ENDL; -		} -	} +    if (!mHasExplicitFormat) +    { +        switch (mComponents) +        { +            case 1: +                // Use luminance alpha (for fonts) +                mFormatInternal = GL_LUMINANCE8; +                mFormatPrimary  = GL_LUMINANCE; +                mFormatType     = GL_UNSIGNED_BYTE; +                break; +            case 2: +                // Use luminance alpha (for fonts) +                mFormatInternal = GL_LUMINANCE8_ALPHA8; +                mFormatPrimary  = GL_LUMINANCE_ALPHA; +                mFormatType     = GL_UNSIGNED_BYTE; +                break; +            case 3: +#if USE_SRGB_DECODE +                if (gGLManager.mHasTexturesRGBDecode) +                { +                    mFormatInternal = GL_SRGB8; +                } +                else +#endif +                { +                    mFormatInternal = GL_RGB8; +                } +                mFormatPrimary = GL_RGB; +                mFormatType    = GL_UNSIGNED_BYTE; +                break; +            case 4: +#if USE_SRGB_DECODE +                if (gGLManager.mHasTexturesRGBDecode) +                { +                    mFormatInternal = GL_SRGB8_ALPHA8; +                } +                else +#endif +                { +                    mFormatInternal = GL_RGBA8; +                } +                mFormatPrimary = GL_RGBA; +                mFormatType    = GL_UNSIGNED_BYTE; +                break; +            default: +                LL_ERRS() << "Bad number of components for texture: " << (U32) getComponents() << LL_ENDL; +        } +    } -	mCurrentDiscardLevel = discard_level;	 +    mCurrentDiscardLevel = discard_level;	  	mDiscardLevelInAtlas = discard_level;  	mTexelsInAtlas = raw_image->getWidth() * raw_image->getHeight() ;  	mLastBindTime = sLastFrameTime; diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index ebc4659bcf..eb9da34ca8 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -849,26 +849,32 @@ void LLTexUnit::debugTextureUnit(void)  	}  } -void LLTexUnit::setTextureColorSpace(eTextureColorSpace space) { +void LLTexUnit::setTextureColorSpace(eTextureColorSpace space) +{      mTexColorSpace = space;  #if USE_SRGB_DECODE -    if (gGLManager.mHasTexturesRGBDecode) { - -        if (space == TCS_SRGB) { +    if (gGLManager.mHasTexturesRGBDecode) +    { +        if (space == TCS_SRGB) +        {              glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT);          } -        else { +        else +        {              glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);          } -        if (gDebugGL) { +        if (gDebugGL) +        {              assert_glerror();          }      } +    else  #endif -    glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT); - +    { +        glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT); +    }  }  LLLightState::LLLightState(S32 index) diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index 9fb4f7f2b0..e3c0255290 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -501,23 +501,23 @@ U32 LLRenderTarget::getNumTextures() const  	return mTex.size();  } -  void LLRenderTarget::bindTexture(U32 index, S32 channel, LLTexUnit::eTextureFilterOptions filter_options)  { -	gGL.getTexUnit(channel)->bindManual(mUsage, getTexture(index)); +    gGL.getTexUnit(channel)->bindManual(mUsage, getTexture(index));      bool isSRGB = false;      llassert(mInternalFormat.size() > index);      switch (mInternalFormat[index])      { -        case GL_SRGB_ALPHA:          case GL_SRGB: +        case GL_SRGB8: +        case GL_SRGB_ALPHA:          case GL_SRGB8_ALPHA8:              isSRGB = true; -        break; +            break;          default: -        break; +            break;      }      gGL.getTexUnit(channel)->setTextureFilteringOption(filter_options); diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 0b3936f8a5..de83efb8a3 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -676,6 +676,37 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,  	//		TrackMouseEvent( &track_mouse_event );   	//	} +    // SL-12971 dual GPU display +    DISPLAY_DEVICEA display_device; +    int             display_index = -1; +    DWORD           display_flags = 0; // EDD_GET_DEVICE_INTERFACE_NAME ? +    const size_t    display_bytes = sizeof(display_device); + +    do +    { +        if (display_index >= 0) +        { +            // CHAR DeviceName  [ 32] Adapter name +            // CHAR DeviceString[128] +            CHAR text[256]; + +            size_t name_len = strlen(display_device.DeviceName  ); +            size_t desc_len = strlen(display_device.DeviceString); + +            CHAR *name = name_len ? display_device.DeviceName   : "???"; +            CHAR *desc = desc_len ? display_device.DeviceString : "???"; + +            sprintf(text, "Display Device %d: %s, %s", display_index, name, desc); +            LL_INFOS("Window") << text << LL_ENDL; +        } + +        ::ZeroMemory(&display_device,display_bytes); +        display_device.cb = display_bytes; + +        display_index++; +    }  while( EnumDisplayDevicesA(NULL, display_index, &display_device, display_flags )); + +    LL_INFOS("Window") << "Total Display Devices: " << display_index << LL_ENDL;  	//-----------------------------------------------------------------------  	// Create GL drawing context diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl index caa4fe1f65..495daa2db6 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsV.glsl @@ -70,15 +70,18 @@ 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; +    // 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; diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl index bd0ad3bce8..2d40e63eff 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,28 @@ 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); +	}  	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/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/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/lighting/lightFullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl index 567811cd75..3eaaa41866 100644 --- a/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/lighting/lightFullbrightShinyF.glsl @@ -35,20 +35,30 @@ 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 = fullbrightShinyAtmosTransport(color.rgb); -	color.rgb = fullbrightScaleSoftClip(color.rgb); +		color.rgb = fullbrightScaleSoftClip(color.rgb); +	}  	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/atmosphericsVarsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl index a0699affbf..3b4d358cfa 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsF.glsl @@ -1,30 +1,37 @@ -/**  +/**   * @file class1\windlight\atmosphericVarsF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, Linden Research, Inc. - *  + *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public   * License as published by the Free Software Foundation;   * version 2.1 of the License only. - *  + *   * This library is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   * Lesser General Public License for more details. - *  + *   * You should have received a copy of the GNU Lesser General Public   * License along with this library; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  + *   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ -  -vec3 getPositionEye() -{ -	return vec3(0,0,0); -} +VARYING vec3 vary_AdditiveColor; +VARYING vec3 vary_AtmosAttenuation; + +vec3 getAmblitColor() { return vec3(0, 0, 0); } + +vec3 getAdditiveColor() { return vary_AdditiveColor; } + +vec3 getAtmosAttenuation() { return vec3(vary_AtmosAttenuation); } + +vec3 getSunlitColor() { return vec3(0, 0, 0); } + +vec3 getPositionEye() { return vec3(0, 0, 0); } diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl index bd1d150fc8..1fea2c3628 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsV.glsl @@ -1,36 +1,56 @@ -/**  +/**   * @file class1\windlight\atmosphericVarsV.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$   */ -  +VARYING vec3 vary_AdditiveColor; +VARYING vec3 vary_AtmosAttenuation; -vec3 getPositionEye() +vec3 additive_color; +vec3 atmos_attenuation; +vec3 sunlit_color; +vec3 amblit_color; +vec3 position_eye; + +vec3 getSunlitColor() { return sunlit_color; } +void setSunlitColor(vec3 v) { sunlit_color = v; } + +vec3 getAdditiveColor() { return additive_color; } +void setAdditiveColor(vec3 v)  { -	return vec3(0,0,0); +    additive_color     = v; +    vary_AdditiveColor = v;  } -void setPositionEye(vec3 v) +vec3 getAmblitColor() { return amblit_color; } +void setAmblitColor(vec3 v) { amblit_color = v; } + +vec3 getAtmosAttenuation() { return atmos_attenuation; } +void setAtmosAttenuation(vec3 v)  { -	 +    atmos_attenuation     = v; +    vary_AtmosAttenuation = v;  } + +vec3 getPositionEye() { return position_eye; } +void setPositionEye(vec3 v) { position_eye = v; } diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterF.glsl index 5dc086ab1e..f83434b7ec 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterF.glsl @@ -1,33 +1,38 @@ -/**  +/**   * @file class1\windlight\atmosphericVarsWaterF.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$   */ -   VARYING vec3 vary_PositionEye; +VARYING vec3 vary_AdditiveColor; +VARYING vec3 vary_AtmosAttenuation; + +vec3 getSunlitColor() { return vec3(0, 0, 0); } + +vec3 getAmblitColor() { return vec3(0, 0, 0); } + +vec3 getAdditiveColor() { return vary_AdditiveColor; } -vec3 getPositionEye() -{ -	return vary_PositionEye; -} +vec3 getAtmosAttenuation() { return vary_AtmosAttenuation; } +vec3 getPositionEye() { return vary_PositionEye; } diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterV.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterV.glsl index e59eca265a..65d1176777 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterV.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsVarsWaterV.glsl @@ -1,37 +1,51 @@ -/**  +/**   * @file class1\windlight\atmosphericVarsWaterV.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$   */ -  -  +  VARYING vec3 vary_PositionEye; +VARYING vec3 vary_AdditiveColor; +VARYING vec3 vary_AtmosAttenuation; -vec3 getPositionEye() -{ -	return vary_PositionEye; -} +vec3 atmos_attenuation; +vec3 sunlit_color; +vec3 amblit_color; + +vec3 getSunlitColor() { return sunlit_color; } +void setSunlitColor(vec3 v) { sunlit_color = v; } + +vec3 getAmblitColor() { return amblit_color; } +void setAmblitColor(vec3 v) { amblit_color = v; } -void setPositionEye(vec3 v) +vec3 getAdditiveColor() { return vary_AdditiveColor; } +void setAdditiveColor(vec3 v) { vary_AdditiveColor = v; } + +vec3 getAtmosAttenuation() { return atmos_attenuation; } +void setAtmosAttenuation(vec3 v)  { -	vary_PositionEye = v; +    atmos_attenuation     = v; +    vary_AtmosAttenuation = v;  } + +vec3 getPositionEye() { return vary_PositionEye; } +void setPositionEye(vec3 v) { vary_PositionEye = v; } 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/atmosphericsVarsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl index d758f85d71..07733bda18 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsVarsF.glsl @@ -1,5 +1,5 @@  /**  - * @file class2\wl\atmosphericVars.glsl + * @file class2\wl\atmosphericVarsF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code diff --git a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl index 2c1475d547..a4389f62dc 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/cloudsV.glsl @@ -36,6 +36,7 @@ ATTRIBUTE vec2 texcoord0;  VARYING vec4 vary_CloudColorSun;  VARYING vec4 vary_CloudColorAmbient;  VARYING float vary_CloudDensity; +  VARYING vec2 vary_texcoord0;  VARYING vec2 vary_texcoord1;  VARYING vec2 vary_texcoord2; @@ -66,13 +67,31 @@ 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); -	vary_texcoord0 = texcoord0; +	// 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 P = position.xyz - camPosLocal.xyz + vec3(0,50,0); @@ -175,19 +194,6 @@ void main()  	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; diff --git a/indra/newview/llcommandhandler.cpp b/indra/newview/llcommandhandler.cpp index 76d965b1f1..23e2271eae 100644 --- a/indra/newview/llcommandhandler.cpp +++ b/indra/newview/llcommandhandler.cpp @@ -222,7 +222,7 @@ struct symbol_info  #define ent(SYMBOL)										\  	{													\ -		#SYMBOL + 28, /* skip "LLCommandHandler::UNTRUSTED_" prefix */	\ +		&#SYMBOL[28], /* skip "LLCommandHandler::UNTRUSTED_" prefix */	\  		SYMBOL											\  	} diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp index c72a0706cd..5a4427a7b7 100644 --- a/indra/newview/llsettingsvo.cpp +++ b/indra/newview/llsettingsvo.cpp @@ -678,8 +678,17 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)  	{      shader->uniform4fv(LLViewerShaderMgr::LIGHTNORM, 1, light_direction.mV);         +    // Legacy? SETTING_CLOUD_SCROLL_RATE("cloud_scroll_rate")      LLVector4 vect_c_p_d1(mSettings[SETTING_CLOUD_POS_DENSITY1]); -    vect_c_p_d1 += LLVector4(LLEnvironment::instance().getCloudScrollDelta()); +    LLVector4 cloud_scroll( LLEnvironment::instance().getCloudScrollDelta() ); + +    // SL-13084 EEP added support for custom cloud textures -- flip them horizontally to match the preview of Clouds > Cloud Scroll +    // Keep in Sync! +    // * indra\newview\llsettingsvo.cpp +    // * indra\newview\app_settings\shaders\class2\windlight\cloudsV.glsl +    // * indra\newview\app_settings\shaders\class1\deferred\cloudsV.glsl +    cloud_scroll[0] = -cloud_scroll[0]; +    vect_c_p_d1 += cloud_scroll;      shader->uniform4fv(LLShaderMgr::CLOUD_POS_DENSITY1, 1, vect_c_p_d1.mV);      LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky(); diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 0f58933005..f7ded00318 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -55,7 +55,6 @@  #include "llviewerregion.h"  #include "llvoavatar.h"  #include "llvoavatarself.h" -#include "llviewerwindow.h"		// *TODO: remove, only used for width/height  #include "llworld.h"  #include "llfeaturemanager.h"  #include "llviewernetwork.h" @@ -582,21 +581,38 @@ void send_stats()  	// If the current revision is recent, ping the previous author before overriding  	LLSD &misc = body["stats"]["misc"]; -	// Screen size so the UI team can figure out how big the widgets -	// appear and use a "typical" size for end user tests. - -	S32 window_width = gViewerWindow->getWindowWidthRaw(); -	S32 window_height = gViewerWindow->getWindowHeightRaw(); -	S32 window_size = (window_width * window_height) / 1024; -	misc["string_1"] = llformat("%d", window_size); -	misc["string_2"] = llformat("Texture Time: %.2f, Total Time: %.2f", gTextureTimer.getElapsedTimeF32(), gFrameTimeSeconds.value()); - -	F32 unbaked_time = LLVOAvatar::sUnbakedTime * 1000.f / gFrameTimeSeconds; -	misc["int_1"] = LLSD::Integer(unbaked_time); // Steve: 1.22 -	F32 grey_time = LLVOAvatar::sGreyTime * 1000.f / gFrameTimeSeconds; -	misc["int_2"] = LLSD::Integer(grey_time); // Steve: 1.22 - -	LL_INFOS() << "Misc Stats: int_1: " << misc["int_1"] << " int_2: " << misc["int_2"] << LL_ENDL; +#ifdef LL_WINDOWS +    // Probe for Vulkan capability (Dave Houlton 05/2020) +    // +    // Check for presense of a Vulkan loader dll, as a proxy for a Vulkan-capable gpu. +    // False-positives and false-negatives are possible, but unlikely. We'll get a good +    // approximation of Vulkan capability within current user systems from this. More +    // detailed information on versions and extensions can come later. +    static bool vulkan_oneshot = false; +    static bool vulkan_detected = false; + +    if (!vulkan_oneshot) +    { +        HMODULE vulkan_loader = LoadLibraryExA("vulkan-1.dll", NULL, LOAD_LIBRARY_AS_DATAFILE); +        if (NULL != vulkan_loader) +        { +            vulkan_detected = true; +            FreeLibrary(vulkan_loader); +        } +        vulkan_oneshot = true; +    } + +    misc["string_1"] = vulkan_detected ? llformat("Vulkan driver is detected") : llformat("No Vulkan driver detected"); + +#else +    misc["string_1"] = llformat("Unused"); +#endif // LL_WINDOWS + +    misc["string_2"] = llformat("Unused"); +    misc["int_1"] = LLSD::Integer(0); +    misc["int_2"] = LLSD::Integer(0); + +    LL_INFOS() << "Misc Stats: int_1: " << misc["int_1"] << " int_2: " << misc["int_2"] << LL_ENDL;  	LL_INFOS() << "Misc Stats: string_1: " << misc["string_1"] << " string_2: " << misc["string_2"] << LL_ENDL;  	body["DisplayNamesEnabled"] = gSavedSettings.getBOOL("UseDisplayNames"); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 5dd3270b2e..09a8998fbb 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -313,6 +313,99 @@ RecordToChatConsole::RecordToChatConsole():  ////////////////////////////////////////////////////////////////////////////  // +// Print Utility +// + +// Convert a normalized float (-1.0 <= x <= +1.0) to a fixed 1.4 format string: +// +//    s#.#### +// +// Where: +//    s  sign character; space if x is positiv, minus if negative +//    #  decimal digits +// +// This is similar to printf("%+.4f") except positive numbers are NOT cluttered with a leading '+' sign. +// NOTE: This does NOT null terminate the output +void normalized_float_to_string(const float x, char *out_str) +{ +    static const unsigned char DECIMAL_BCD2[] = +    { +        0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, +        0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, +        0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, +        0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, +        0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, +        0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, +        0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, +        0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, +        0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, +        0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99 +    }; + +    int neg = (x < 0); +    int rem = neg +            ? (int)(x * -10000.) +            : (int)(x *  10000.); + +    int d10 = rem % 100; rem /= 100; +    int d32 = rem % 100; rem /= 100; + +    out_str[6] = '0' + ((DECIMAL_BCD2[ d10 ] >> 0) & 0xF); +    out_str[5] = '0' + ((DECIMAL_BCD2[ d10 ] >> 4) & 0xF); +    out_str[4] = '0' + ((DECIMAL_BCD2[ d32 ] >> 0) & 0xF); +    out_str[3] = '0' + ((DECIMAL_BCD2[ d32 ] >> 4) & 0xF); +    out_str[2] = '.'; +    out_str[1] = '0' + (rem & 1); +    out_str[0] = " -"[neg]; // Could always show '+' for positive but this clutters up the common case +} + +// normalized float +//    printf("%-.4f    %-.4f    %-.4f") +// Params: +//   float  &matrix_row[4] +//   int    matrix_cell_index +//   string out_buffer (size 32) +// Note: The buffer is assumed to be pre-filled with spaces +#define MATRIX_ROW_N32_TO_STR(matrix_row, i, out_buffer)          \ +    normalized_float_to_string(matrix_row[i+0], out_buffer +  0); \ +    normalized_float_to_string(matrix_row[i+1], out_buffer + 11); \ +    normalized_float_to_string(matrix_row[i+2], out_buffer + 22); \ +    out_buffer[31] = 0; + + +// regular float +//    sprintf(buffer, "%-8.2f  %-8.2f  %-8.2f", matrix_row[i+0], matrix_row[i+1], matrix_row[i+2]); +// Params: +//   float  &matrix_row[4] +//   int    matrix_cell_index +//   char   out_buffer[32] +// Note: The buffer is assumed to be pre-filled with spaces +#define MATRIX_ROW_F32_TO_STR(matrix_row, i, out_buffer) {                       \ +    static const char *format[3] = {                                             \ +        "%-8.2f"  ,  /* 0 */                                                     \ +        ">  99K  ",  /* 1 */                                                     \ +        "< -99K  "   /* 2 */                                                     \ +    };                                                                           \ +                                                                                 \ +    F32 temp_0 = matrix_row[i+0];                                                \ +    F32 temp_1 = matrix_row[i+1];                                                \ +    F32 temp_2 = matrix_row[i+2];                                                \ +                                                                                 \ +    U8 flag_0 = (((U8)(temp_0 < -99999.99)) << 1) | ((U8)(temp_0 > 99999.99));   \ +    U8 flag_1 = (((U8)(temp_1 < -99999.99)) << 1) | ((U8)(temp_1 > 99999.99));   \ +    U8 flag_2 = (((U8)(temp_2 < -99999.99)) << 1) | ((U8)(temp_2 > 99999.99));   \ +                                                                                 \ +    if (temp_0 < 0.f) out_buffer[ 0] = '-';                                      \ +    if (temp_1 < 0.f) out_buffer[11] = '-';                                      \ +    if (temp_2 < 0.f) out_buffer[22] = '-';                                      \ +                                                                                 \ +    sprintf(out_buffer+ 1,format[flag_0],fabsf(temp_0)); out_buffer[ 1+8] = ' '; \ +    sprintf(out_buffer+12,format[flag_1],fabsf(temp_1)); out_buffer[12+8] = ' '; \ +    sprintf(out_buffer+23,format[flag_2],fabsf(temp_2)); out_buffer[23+8] =  0 ; \ +} + +//////////////////////////////////////////////////////////////////////////// +//  // LLDebugText  // @@ -333,7 +426,11 @@ private:  	typedef std::vector<Line> line_list_t;  	line_list_t mLineList;  	LLColor4 mTextColor; -	 + +	LLColor4 mBackColor; +	LLRect mBackRectCamera1; +	LLRect mBackRectCamera2; +  	void addText(S32 x, S32 y, const std::string &text)   	{  		mLineList.push_back(Line(text, x, y)); @@ -369,11 +466,22 @@ public:  		mTextColor = LLColor4( 0.86f, 0.86f, 0.86f, 1.f );  		// Draw stuff growing up from right lower corner of screen -		S32 xpos = mWindow->getWorldViewWidthScaled() - 400; +		S32 x_right = mWindow->getWorldViewWidthScaled(); +		S32 xpos = x_right - 400;  		xpos = llmax(xpos, 0);  		S32 ypos = 64;  		const S32 y_inc = 20; +		// Camera matrix text is hard to see again a white background +		// Add a dark background underneath the matrices for readability (contrast) +		mBackRectCamera1.mLeft   = xpos; +		mBackRectCamera1.mRight  = x_right; +		mBackRectCamera1.mTop    = -1; +		mBackRectCamera1.mBottom = -1; +		mBackRectCamera2 = mBackRectCamera1; + +		mBackColor = LLUIColorTable::instance().getColor( "MenuDefaultBgColor" ); +  		clearText();  		if (gSavedSettings.getBOOL("DebugShowTime")) @@ -709,48 +817,45 @@ public:  		}  		if (gSavedSettings.getBOOL("DebugShowRenderMatrices"))  		{ -			addText(xpos, ypos, llformat("%.4f    .%4f    %.4f    %.4f", gGLProjection[12], gGLProjection[13], gGLProjection[14], gGLProjection[15])); -			ypos += y_inc; +			char camera_lines[8][32]; +			memset(camera_lines, ' ', sizeof(camera_lines)); -			addText(xpos, ypos, llformat("%.4f    .%4f    %.4f    %.4f", gGLProjection[8], gGLProjection[9], gGLProjection[10], gGLProjection[11])); -			ypos += y_inc; - -			addText(xpos, ypos, llformat("%.4f    .%4f    %.4f    %.4f", gGLProjection[4], gGLProjection[5], gGLProjection[6], gGLProjection[7])); -			ypos += y_inc; - -			addText(xpos, ypos, llformat("%.4f    .%4f    %.4f    %.4f", gGLProjection[0], gGLProjection[1], gGLProjection[2], gGLProjection[3])); -			ypos += y_inc; +			// Projection last column is always <0,0,-1.0001,0> +			// Projection last row is always <0,0,-0.2> +			mBackRectCamera1.mBottom = ypos - y_inc + 2; +			MATRIX_ROW_N32_TO_STR(gGLProjection, 12,camera_lines[7]); addText(xpos, ypos, std::string(camera_lines[7])); ypos += y_inc; +			MATRIX_ROW_N32_TO_STR(gGLProjection,  8,camera_lines[6]); addText(xpos, ypos, std::string(camera_lines[6])); ypos += y_inc; +			MATRIX_ROW_N32_TO_STR(gGLProjection,  4,camera_lines[5]); addText(xpos, ypos, std::string(camera_lines[5])); ypos += y_inc; mBackRectCamera1.mTop    = ypos + 2; +			MATRIX_ROW_N32_TO_STR(gGLProjection,  0,camera_lines[4]); addText(xpos, ypos, std::string(camera_lines[4])); ypos += y_inc; mBackRectCamera2.mBottom = ypos + 2;  			addText(xpos, ypos, "Projection Matrix");  			ypos += y_inc; - -			addText(xpos, ypos, llformat("%.4f    .%4f    %.4f    %.4f", gGLModelView[12], gGLModelView[13], gGLModelView[14], gGLModelView[15])); -			ypos += y_inc; - -			addText(xpos, ypos, llformat("%.4f    .%4f    %.4f    %.4f", gGLModelView[8], gGLModelView[9], gGLModelView[10], gGLModelView[11])); -			ypos += y_inc; - -			addText(xpos, ypos, llformat("%.4f    .%4f    %.4f    %.4f", gGLModelView[4], gGLModelView[5], gGLModelView[6], gGLModelView[7])); -			ypos += y_inc; - -			addText(xpos, ypos, llformat("%.4f    .%4f    %.4f    %.4f", gGLModelView[0], gGLModelView[1], gGLModelView[2], gGLModelView[3])); -			ypos += y_inc; +			// View last column is always <0,0,0,1> +			MATRIX_ROW_F32_TO_STR(gGLModelView, 12,camera_lines[3]); addText(xpos, ypos, std::string(camera_lines[3])); ypos += y_inc; +			MATRIX_ROW_N32_TO_STR(gGLModelView,  8,camera_lines[2]); addText(xpos, ypos, std::string(camera_lines[2])); ypos += y_inc; +			MATRIX_ROW_N32_TO_STR(gGLModelView,  4,camera_lines[1]); addText(xpos, ypos, std::string(camera_lines[1])); ypos += y_inc; mBackRectCamera2.mTop = ypos + 2; +			MATRIX_ROW_N32_TO_STR(gGLModelView,  0,camera_lines[0]); addText(xpos, ypos, std::string(camera_lines[0])); ypos += y_inc;  			addText(xpos, ypos, "View Matrix");  			ypos += y_inc;  		}  		// disable use of glReadPixels which messes up nVidia nSight graphics debugging -		if (gSavedSettings.getBOOL("DebugShowColor") && !LLRender::sNsightDebugSupport) -		{ -			U8 color[4]; -			LLCoordGL coord = gViewerWindow->getCurrentMouse(); -			glReadPixels(coord.mX, coord.mY, 1,1,GL_RGBA, GL_UNSIGNED_BYTE, color); -			addText(xpos, ypos, llformat("%d %d %d %d", color[0], color[1], color[2], color[3])); -			ypos += y_inc; -		} +        if (gSavedSettings.getBOOL("DebugShowColor") && !LLRender::sNsightDebugSupport) +        { +            U8 color[4]; +            LLCoordGL coord = gViewerWindow->getCurrentMouse(); + +            // Convert x,y to raw pixel coords +            S32 x_raw = llround(coord.mX * gViewerWindow->getWindowWidthRaw() / (F32) gViewerWindow->getWindowWidthScaled()); +            S32 y_raw = llround(coord.mY * gViewerWindow->getWindowHeightRaw() / (F32) gViewerWindow->getWindowHeightScaled()); +             +            glReadPixels(x_raw, y_raw, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, color); +            addText(xpos, ypos, llformat("Pixel <%1d, %1d> R:%1d G:%1d B:%1d A:%1d", x_raw, y_raw, color[0], color[1], color[2], color[3])); +            ypos += y_inc; +        } -		// only display these messages if we are actually rendering beacons at this moment +        // only display these messages if we are actually rendering beacons at this moment  		if (LLPipeline::getRenderBeacons() && LLFloaterReg::instanceVisible("beacons"))  		{  			if (LLPipeline::getRenderMOAPBeacons()) @@ -877,6 +982,18 @@ public:  	void draw()  	{  		LL_RECORD_BLOCK_TIME(FTM_DISPLAY_DEBUG_TEXT); + +		// Camera matrix text is hard to see again a white background +		// Add a dark background underneath the matrices for readability (contrast) +		if (mBackRectCamera1.mTop >= 0) +		{ +			mBackColor.setAlpha( 0.75f ); +			gl_rect_2d(mBackRectCamera1, mBackColor, true); + +			mBackColor.setAlpha( 0.66f ); +			gl_rect_2d(mBackRectCamera2, mBackColor, true); +		} +  		for (line_list_t::iterator iter = mLineList.begin();  			 iter != mLineList.end(); ++iter)  		{ @@ -885,7 +1002,6 @@ public:  											 LLFontGL::LEFT, LLFontGL::TOP,  											 LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE);  		} -		mLineList.clear();  	}  }; diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp index 663a75156f..bae615232e 100644 --- a/indra/newview/llxmlrpclistener.cpp +++ b/indra/newview/llxmlrpclistener.cpp @@ -101,7 +101,7 @@ public:      {          // from curl.h  // skip the "CURLE_" prefix for each of these strings -#define def(sym) (mMap[sym] = #sym + 6) +#define def(sym) (mMap[sym] = &#sym[6])          def(CURLE_OK);          def(CURLE_UNSUPPORTED_PROTOCOL);    /* 1 */          def(CURLE_FAILED_INIT);             /* 2 */ | 
