From 53f3755a4629206754a5695de233d88062a54d3d Mon Sep 17 00:00:00 2001
From: Graham Linden <graham@lindenlab.com>
Date: Thu, 7 Mar 2019 15:09:34 -0800
Subject: [PATCH] Fix tabs.

---
 indra/llrender/llglslshader.cpp               |  258 +-
 indra/llrender/llglslshader.h                 |  336 +--
 indra/llrender/llshadermgr.cpp                | 2304 ++++++++---------
 .../shaders/class1/deferred/materialF.glsl    |    9 +-
 .../shaders/class1/deferred/softenLightF.glsl |    2 +-
 .../shaders/class2/deferred/softenLightF.glsl |    4 +-
 indra/newview/pipeline.cpp                    |   16 +-
 indra/newview/pipeline.h                      | 1638 ++++++------
 8 files changed, 2282 insertions(+), 2285 deletions(-)

diff --git a/indra/llrender/llglslshader.cpp b/indra/llrender/llglslshader.cpp
index 9a4eeb59dfc..5659bd327bd 100644
--- a/indra/llrender/llglslshader.cpp
+++ b/indra/llrender/llglslshader.cpp
@@ -724,144 +724,144 @@ GLint LLGLSLShader::mapUniformTextureChannel(GLint location, GLenum type)
 
 BOOL LLGLSLShader::mapUniforms(const vector<LLStaticHashedString> * uniforms)
 {
-	BOOL res = TRUE;
-
-	mTotalUniformSize = 0;
-	mActiveTextureChannels = 0;
-	mUniform.clear();
-	mUniformMap.clear();
-	mUniformNameMap.clear();
-	mTexture.clear();
-	mValue.clear();
-	//initialize arrays
-	U32 numUniforms = (uniforms == NULL) ? 0 : uniforms->size();
-	mUniform.resize(numUniforms + LLShaderMgr::instance()->mReservedUniforms.size(), -1);
-	mTexture.resize(numUniforms + LLShaderMgr::instance()->mReservedUniforms.size(), -1);
-
-	bind();
-
-	//get the number of active uniforms
-	GLint activeCount;
-	glGetObjectParameterivARB(mProgramObject, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &activeCount);
-
-	//........................................................................................................................................
-	//........................................................................................
-
-	/*
-	EXPLANATION:
-	This is part of code is temporary because as the final result the mapUniform() should be rewrited.
-	But it's a huge a volume of work which is need to be a more carefully performed for avoid possible
-	regression's (i.e. it should be formalized a separate ticket in JIRA).
-
-	RESON:
-	The reason of this code is that SL engine is very sensitive to fact that "diffuseMap" should be appear
-	first as uniform parameter which is should get 0-"texture channel" index (see mapUniformTextureChannel() and mActiveTextureChannels)
-	it influence to which is texture matrix will be updated during rendering.
-
-	But, order of indexe's of uniform variables is not defined and GLSL compiler can change it as want
-	, even if the "diffuseMap" will be appear and use first in shader code.
-
-	As example where this situation appear see: "Deferred Material Shader 28/29/30/31"
-	And tickets: MAINT-4165, MAINT-4839, MAINT-3568, MAINT-6437
-	*/
-
-
-	S32 diffuseMap = glGetUniformLocationARB(mProgramObject, "diffuseMap");
-	S32 specularMap = glGetUniformLocationARB(mProgramObject, "specularMap");
-	S32 bumpMap = glGetUniformLocationARB(mProgramObject, "bumpMap");
+    BOOL res = TRUE;
+
+    mTotalUniformSize = 0;
+    mActiveTextureChannels = 0;
+    mUniform.clear();
+    mUniformMap.clear();
+    mUniformNameMap.clear();
+    mTexture.clear();
+    mValue.clear();
+    //initialize arrays
+    U32 numUniforms = (uniforms == NULL) ? 0 : uniforms->size();
+    mUniform.resize(numUniforms + LLShaderMgr::instance()->mReservedUniforms.size(), -1);
+    mTexture.resize(numUniforms + LLShaderMgr::instance()->mReservedUniforms.size(), -1);
+
+    bind();
+
+    //get the number of active uniforms
+    GLint activeCount;
+    glGetObjectParameterivARB(mProgramObject, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &activeCount);
+
+    //........................................................................................................................................
+    //........................................................................................
+
+    /*
+    EXPLANATION:
+    This is part of code is temporary because as the final result the mapUniform() should be rewrited.
+    But it's a huge a volume of work which is need to be a more carefully performed for avoid possible
+    regression's (i.e. it should be formalized a separate ticket in JIRA).
+
+    RESON:
+    The reason of this code is that SL engine is very sensitive to fact that "diffuseMap" should be appear
+    first as uniform parameter which is should get 0-"texture channel" index (see mapUniformTextureChannel() and mActiveTextureChannels)
+    it influence to which is texture matrix will be updated during rendering.
+
+    But, order of indexe's of uniform variables is not defined and GLSL compiler can change it as want
+    , even if the "diffuseMap" will be appear and use first in shader code.
+
+    As example where this situation appear see: "Deferred Material Shader 28/29/30/31"
+    And tickets: MAINT-4165, MAINT-4839, MAINT-3568, MAINT-6437
+    */
+
+
+    S32 diffuseMap = glGetUniformLocationARB(mProgramObject, "diffuseMap");
+    S32 specularMap = glGetUniformLocationARB(mProgramObject, "specularMap");
+    S32 bumpMap = glGetUniformLocationARB(mProgramObject, "bumpMap");
     S32 altDiffuseMap = glGetUniformLocationARB(mProgramObject, "altDiffuseMap");
-	S32 environmentMap = glGetUniformLocationARB(mProgramObject, "environmentMap");
+    S32 environmentMap = glGetUniformLocationARB(mProgramObject, "environmentMap");
 
-	std::set<S32> skip_index;
+    std::set<S32> skip_index;
 
-	if (-1 != diffuseMap && (-1 != specularMap || -1 != bumpMap || -1 != environmentMap || -1 != altDiffuseMap))
-	{
-		GLenum type;
-		GLsizei length;
-		GLint size = -1;
-		char name[1024];
+    if (-1 != diffuseMap && (-1 != specularMap || -1 != bumpMap || -1 != environmentMap || -1 != altDiffuseMap))
+    {
+        GLenum type;
+        GLsizei length;
+        GLint size = -1;
+        char name[1024];
 
-		diffuseMap = altDiffuseMap = specularMap = bumpMap = environmentMap = -1;
+        diffuseMap = altDiffuseMap = specularMap = bumpMap = environmentMap = -1;
 
-		for (S32 i = 0; i < activeCount; i++)
-		{
-			name[0] = '\0';
+        for (S32 i = 0; i < activeCount; i++)
+        {
+            name[0] = '\0';
 
-			glGetActiveUniformARB(mProgramObject, i, 1024, &length, &size, &type, (GLcharARB *)name);
+            glGetActiveUniformARB(mProgramObject, i, 1024, &length, &size, &type, (GLcharARB *)name);
 
-			if (-1 == diffuseMap && std::string(name) == "diffuseMap")
-			{
-				diffuseMap = i;
-				continue;
-			}
+            if (-1 == diffuseMap && std::string(name) == "diffuseMap")
+            {
+                diffuseMap = i;
+                continue;
+            }
 
-			if (-1 == specularMap && std::string(name) == "specularMap")
-			{
-				specularMap = i;
-				continue;
-			}
+            if (-1 == specularMap && std::string(name) == "specularMap")
+            {
+                specularMap = i;
+                continue;
+            }
 
-			if (-1 == bumpMap && std::string(name) == "bumpMap")
-			{
-				bumpMap = i;
-				continue;
-			}
+            if (-1 == bumpMap && std::string(name) == "bumpMap")
+            {
+                bumpMap = i;
+                continue;
+            }
 
-			if (-1 == environmentMap && std::string(name) == "environmentMap")
-			{
-				environmentMap = i;
-				continue;
-			}
+            if (-1 == environmentMap && std::string(name) == "environmentMap")
+            {
+                environmentMap = i;
+                continue;
+            }
 
             if (-1 == altDiffuseMap && std::string(name) == "altDiffuseMap")
-			{
-				altDiffuseMap = i;
-				continue;
-			}
-		}
+            {
+                altDiffuseMap = i;
+                continue;
+            }
+        }
 
-		bool specularDiff = specularMap < diffuseMap && -1 != specularMap;
-		bool bumpLessDiff = bumpMap < diffuseMap && -1 != bumpMap;
-		bool envLessDiff = environmentMap < diffuseMap && -1 != environmentMap;
+        bool specularDiff = specularMap < diffuseMap && -1 != specularMap;
+        bool bumpLessDiff = bumpMap < diffuseMap && -1 != bumpMap;
+        bool envLessDiff = environmentMap < diffuseMap && -1 != environmentMap;
 
-		if (specularDiff || bumpLessDiff || envLessDiff)
-		{
-			mapUniform(diffuseMap, uniforms);
-			skip_index.insert(diffuseMap);
+        if (specularDiff || bumpLessDiff || envLessDiff)
+        {
+            mapUniform(diffuseMap, uniforms);
+            skip_index.insert(diffuseMap);
 
-			if (-1 != specularMap) {
-				mapUniform(specularMap, uniforms);
-				skip_index.insert(specularMap);
-			}
+            if (-1 != specularMap) {
+                mapUniform(specularMap, uniforms);
+                skip_index.insert(specularMap);
+            }
 
-			if (-1 != bumpMap) {
-				mapUniform(bumpMap, uniforms);
-				skip_index.insert(bumpMap);
-			}
+            if (-1 != bumpMap) {
+                mapUniform(bumpMap, uniforms);
+                skip_index.insert(bumpMap);
+            }
 
-			if (-1 != environmentMap) {
-				mapUniform(environmentMap, uniforms);
-				skip_index.insert(environmentMap);
-			}
-		}
-	}
+            if (-1 != environmentMap) {
+                mapUniform(environmentMap, uniforms);
+                skip_index.insert(environmentMap);
+            }
+        }
+    }
 
-	//........................................................................................
+    //........................................................................................
 
-	for (S32 i = 0; i < activeCount; i++)
-	{
-		//........................................................................................
-		if (skip_index.end() != skip_index.find(i)) continue;
-		//........................................................................................
+    for (S32 i = 0; i < activeCount; i++)
+    {
+        //........................................................................................
+        if (skip_index.end() != skip_index.find(i)) continue;
+        //........................................................................................
 
-		mapUniform(i, uniforms);
-	}
-	//........................................................................................................................................
+        mapUniform(i, uniforms);
+    }
+    //........................................................................................................................................
 
-	unbind();
+    unbind();
 
-	LL_DEBUGS("ShaderUniform") << "Total Uniform Size: " << mTotalUniformSize << LL_ENDL;
-	return res;
+    LL_DEBUGS("ShaderUniform") << "Total Uniform Size: " << mTotalUniformSize << LL_ENDL;
+    return res;
 }
 
 
@@ -1286,19 +1286,19 @@ void LLGLSLShader::uniformMatrix3fv(U32 index, U32 count, GLboolean transpose, c
 
 void LLGLSLShader::uniformMatrix3x4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v)
 {
-	if (mProgramObject)
-	{	
-		if (mUniform.size() <= index)
-		{
-			LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
-			return;
-		}
-
-		if (mUniform[index] >= 0)
-		{
-			glUniformMatrix3x4fv(mUniform[index], count, transpose, v);
-		}
-	}
+    if (mProgramObject)
+    {   
+        if (mUniform.size() <= index)
+        {
+            LL_SHADER_UNIFORM_ERRS() << "Uniform index out of bounds." << LL_ENDL;
+            return;
+        }
+
+        if (mUniform[index] >= 0)
+        {
+            glUniformMatrix3x4fv(mUniform[index], count, transpose, v);
+        }
+    }
 }
 
 void LLGLSLShader::uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v)
diff --git a/indra/llrender/llglslshader.h b/indra/llrender/llglslshader.h
index e5110fe1c44..9c3effadbe1 100644
--- a/indra/llrender/llglslshader.h
+++ b/indra/llrender/llglslshader.h
@@ -34,201 +34,201 @@
 class LLShaderFeatures
 {
 public:
-	bool atmosphericHelpers;
-	bool calculatesLighting;
-	bool calculatesAtmospherics;
-	bool hasLighting; // implies no transport (it's possible to have neither though)
-	bool isAlphaLighting; // indicates lighting shaders need not be linked in (lighting performed directly in alpha shader to match deferred lighting functions)
-	bool isShiny;
-	bool isFullbright; // implies no lighting
-	bool isSpecular;
-	bool hasWaterFog; // implies no gamma
-	bool hasTransport; // implies no lighting (it's possible to have neither though)
-	bool hasSkinning;	
-	bool hasObjectSkinning;
-	bool hasAtmospherics;
-	bool hasGamma;
+    bool atmosphericHelpers;
+    bool calculatesLighting;
+    bool calculatesAtmospherics;
+    bool hasLighting; // implies no transport (it's possible to have neither though)
+    bool isAlphaLighting; // indicates lighting shaders need not be linked in (lighting performed directly in alpha shader to match deferred lighting functions)
+    bool isShiny;
+    bool isFullbright; // implies no lighting
+    bool isSpecular;
+    bool hasWaterFog; // implies no gamma
+    bool hasTransport; // implies no lighting (it's possible to have neither though)
+    bool hasSkinning;   
+    bool hasObjectSkinning;
+    bool hasAtmospherics;
+    bool hasGamma;
     bool hasShadows;
     bool hasAmbientOcclusion;
-	bool hasSrgb;
+    bool hasSrgb;
     bool encodesNormal;
     bool isDeferred;
     bool hasIndirect;
-	S32 mIndexedTextureChannels;
-	bool disableTextureIndex;
-	bool hasAlphaMask;
-	bool attachNothing;
-
-	// char numLights;
-	
-	LLShaderFeatures();
+    S32 mIndexedTextureChannels;
+    bool disableTextureIndex;
+    bool hasAlphaMask;
+    bool attachNothing;
+
+    // char numLights;
+    
+    LLShaderFeatures();
 };
 
 class LLGLSLShader
 {
 public:
 
-	enum 
-	{
-		SG_DEFAULT = 0,
-		SG_SKY,
-		SG_WATER
-	};
-	
-	static std::set<LLGLSLShader*> sInstances;
-	static bool sProfileEnabled;
-
-	LLGLSLShader();
-	~LLGLSLShader();
-
-	static GLhandleARB sCurBoundShader;
-	static LLGLSLShader* sCurBoundShaderPtr;
-	static S32 sIndexedTextureChannels;
-	static bool sNoFixedFunction;
-
-	static void initProfile();
-	static void finishProfile(bool emit_report = true);
-
-	static void startProfile();
-	static void stopProfile(U32 count, U32 mode);
-
-	void unload();
-	void clearStats();
-	void dumpStats();
-	void placeProfileQuery();
-	void readProfileQuery(U32 count, U32 mode);
-
-	BOOL createShader(std::vector<LLStaticHashedString> * attributes,
-						std::vector<LLStaticHashedString> * uniforms,
-						U32 varying_count = 0,
-						const char** varyings = NULL);
-	BOOL attachObject(std::string object);
-	void attachObject(GLhandleARB object);
-	void attachObjects(GLhandleARB* objects = NULL, S32 count = 0);
-	BOOL mapAttributes(const std::vector<LLStaticHashedString> * attributes);
-	BOOL mapUniforms(const std::vector<LLStaticHashedString> *);
-	void mapUniform(GLint index, const std::vector<LLStaticHashedString> *);
-	void uniform1i(U32 index, GLint i);
-	void uniform1f(U32 index, GLfloat v);
-	void uniform2f(U32 index, GLfloat x, GLfloat y);
-	void uniform3f(U32 index, GLfloat x, GLfloat y, GLfloat z);
-	void uniform4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-	void uniform1iv(U32 index, U32 count, const GLint* i);
-	void uniform1fv(U32 index, U32 count, const GLfloat* v);
-	void uniform2fv(U32 index, U32 count, const GLfloat* v);
-	void uniform3fv(U32 index, U32 count, const GLfloat* v);
-	void uniform4fv(U32 index, U32 count, const GLfloat* v);
-	void uniform2i(const LLStaticHashedString& uniform, GLint i, GLint j);
-	void uniformMatrix2fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
-	void uniformMatrix3fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
-	void uniformMatrix3x4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
-	void uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
-	void uniform1i(const LLStaticHashedString& uniform, GLint i);
-	void uniform1f(const LLStaticHashedString& uniform, GLfloat v);
-	void uniform2f(const LLStaticHashedString& uniform, GLfloat x, GLfloat y);
-	void uniform3f(const LLStaticHashedString& uniform, GLfloat x, GLfloat y, GLfloat z);
-	void uniform1fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);
-	void uniform2fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);
-	void uniform3fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);
-	void uniform4fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);
-	void uniformMatrix4fv(const LLStaticHashedString& uniform, U32 count, GLboolean transpose, const GLfloat *v);
-
-	void setMinimumAlpha(F32 minimum);
-
-	void vertexAttrib4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
-	void vertexAttrib4fv(U32 index, GLfloat* v);
-	
-	//GLint getUniformLocation(const std::string& uniform);
-	GLint getUniformLocation(const LLStaticHashedString& uniform);	
-	GLint getUniformLocation(U32 index);
-
-	GLint getAttribLocation(U32 attrib);
-	GLint mapUniformTextureChannel(GLint location, GLenum type);
-	
+    enum 
+    {
+        SG_DEFAULT = 0,
+        SG_SKY,
+        SG_WATER
+    };
+    
+    static std::set<LLGLSLShader*> sInstances;
+    static bool sProfileEnabled;
+
+    LLGLSLShader();
+    ~LLGLSLShader();
+
+    static GLhandleARB sCurBoundShader;
+    static LLGLSLShader* sCurBoundShaderPtr;
+    static S32 sIndexedTextureChannels;
+    static bool sNoFixedFunction;
+
+    static void initProfile();
+    static void finishProfile(bool emit_report = true);
+
+    static void startProfile();
+    static void stopProfile(U32 count, U32 mode);
+
+    void unload();
+    void clearStats();
+    void dumpStats();
+    void placeProfileQuery();
+    void readProfileQuery(U32 count, U32 mode);
+
+    BOOL createShader(std::vector<LLStaticHashedString> * attributes,
+                        std::vector<LLStaticHashedString> * uniforms,
+                        U32 varying_count = 0,
+                        const char** varyings = NULL);
+    BOOL attachObject(std::string object);
+    void attachObject(GLhandleARB object);
+    void attachObjects(GLhandleARB* objects = NULL, S32 count = 0);
+    BOOL mapAttributes(const std::vector<LLStaticHashedString> * attributes);
+    BOOL mapUniforms(const std::vector<LLStaticHashedString> *);
+    void mapUniform(GLint index, const std::vector<LLStaticHashedString> *);
+    void uniform1i(U32 index, GLint i);
+    void uniform1f(U32 index, GLfloat v);
+    void uniform2f(U32 index, GLfloat x, GLfloat y);
+    void uniform3f(U32 index, GLfloat x, GLfloat y, GLfloat z);
+    void uniform4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+    void uniform1iv(U32 index, U32 count, const GLint* i);
+    void uniform1fv(U32 index, U32 count, const GLfloat* v);
+    void uniform2fv(U32 index, U32 count, const GLfloat* v);
+    void uniform3fv(U32 index, U32 count, const GLfloat* v);
+    void uniform4fv(U32 index, U32 count, const GLfloat* v);
+    void uniform2i(const LLStaticHashedString& uniform, GLint i, GLint j);
+    void uniformMatrix2fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
+    void uniformMatrix3fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
+    void uniformMatrix3x4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
+    void uniformMatrix4fv(U32 index, U32 count, GLboolean transpose, const GLfloat *v);
+    void uniform1i(const LLStaticHashedString& uniform, GLint i);
+    void uniform1f(const LLStaticHashedString& uniform, GLfloat v);
+    void uniform2f(const LLStaticHashedString& uniform, GLfloat x, GLfloat y);
+    void uniform3f(const LLStaticHashedString& uniform, GLfloat x, GLfloat y, GLfloat z);
+    void uniform1fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);
+    void uniform2fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);
+    void uniform3fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);
+    void uniform4fv(const LLStaticHashedString& uniform, U32 count, const GLfloat* v);
+    void uniformMatrix4fv(const LLStaticHashedString& uniform, U32 count, GLboolean transpose, const GLfloat *v);
+
+    void setMinimumAlpha(F32 minimum);
+
+    void vertexAttrib4f(U32 index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+    void vertexAttrib4fv(U32 index, GLfloat* v);
+    
+    //GLint getUniformLocation(const std::string& uniform);
+    GLint getUniformLocation(const LLStaticHashedString& uniform);  
+    GLint getUniformLocation(U32 index);
+
+    GLint getAttribLocation(U32 attrib);
+    GLint mapUniformTextureChannel(GLint location, GLenum type);
+    
     void clearPermutations();
-	void addPermutation(std::string name, std::string value);
-	void removePermutation(std::string name);
-	
-	//enable/disable texture channel for specified uniform
-	//if given texture uniform is active in the shader, 
-	//the corresponding channel will be active upon return
-	//returns channel texture is enabled in from [0-MAX)
-	S32 enableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
-	S32 disableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
-	
-	// bindTexture returns the texture unit we've bound the texture to.
-	// You can reuse the return value to unbind a texture when required.
-	S32 bindTexture(const std::string& uniform, LLTexture *texture, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
-	S32 bindTexture(S32 uniform, LLTexture *texture, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
-	S32 unbindTexture(const std::string& uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
-	S32 unbindTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
-	
+    void addPermutation(std::string name, std::string value);
+    void removePermutation(std::string name);
+    
+    //enable/disable texture channel for specified uniform
+    //if given texture uniform is active in the shader, 
+    //the corresponding channel will be active upon return
+    //returns channel texture is enabled in from [0-MAX)
+    S32 enableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
+    S32 disableTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
+    
+    // bindTexture returns the texture unit we've bound the texture to.
+    // You can reuse the return value to unbind a texture when required.
+    S32 bindTexture(const std::string& uniform, LLTexture *texture, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
+    S32 bindTexture(S32 uniform, LLTexture *texture, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
+    S32 unbindTexture(const std::string& uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
+    S32 unbindTexture(S32 uniform, LLTexUnit::eTextureType mode = LLTexUnit::TT_TEXTURE);
+    
     BOOL link(BOOL suppress_errors = FALSE);
-	void bind();
-	void unbind();
+    void bind();
+    void unbind();
 
-	// Unbinds any previously bound shader by explicitly binding no shader.
-	static void bindNoShader(void);
+    // Unbinds any previously bound shader by explicitly binding no shader.
+    static void bindNoShader(void);
 
-	U32 mMatHash[LLRender::NUM_MATRIX_MODES];
-	U32 mLightHash;
+    U32 mMatHash[LLRender::NUM_MATRIX_MODES];
+    U32 mLightHash;
 
-	GLhandleARB mProgramObject;
+    GLhandleARB mProgramObject;
 #if LL_RELEASE_WITH_DEBUG_INFO
-	struct attr_name
-	{
-		GLint loc;
-		const char *name;
-		void operator = (GLint _loc) { loc = _loc; }
-		operator GLint () { return loc; }
-	};
-	std::vector<attr_name> mAttribute; //lookup table of attribute enum to attribute channel
+    struct attr_name
+    {
+        GLint loc;
+        const char *name;
+        void operator = (GLint _loc) { loc = _loc; }
+        operator GLint () { return loc; }
+    };
+    std::vector<attr_name> mAttribute; //lookup table of attribute enum to attribute channel
 #else
-	std::vector<GLint> mAttribute; //lookup table of attribute enum to attribute channel
+    std::vector<GLint> mAttribute; //lookup table of attribute enum to attribute channel
 #endif
-	U32 mAttributeMask;  //mask of which reserved attributes are set (lines up with LLVertexBuffer::getTypeMask())
-	std::vector<GLint> mUniform;   //lookup table of uniform enum to uniform location
-	LLStaticStringTable<GLint> mUniformMap; //lookup map of uniform name to uniform location
-	std::map<GLint, std::string> mUniformNameMap; //lookup map of uniform location to uniform name
-	std::map<GLint, LLVector4> mValue; //lookup map of uniform location to last known value
-	std::vector<GLint> mTexture;
-	S32 mTotalUniformSize;
-	S32 mActiveTextureChannels;
-	S32 mShaderLevel;
-	S32 mShaderGroup;
-	BOOL mUniformsDirty;
-	LLShaderFeatures mFeatures;
-	std::vector< std::pair< std::string, GLenum > > mShaderFiles;
-	std::string mName;
-	boost::unordered_map<std::string, std::string> mDefines;
-
-	//statistcis for profiling shader performance
-	U32 mTimerQuery;
-	U32 mSamplesQuery;
-	U64 mTimeElapsed;
-	static U64 sTotalTimeElapsed;
-	U32 mTrianglesDrawn;
-	static U32 sTotalTrianglesDrawn;
-	U64 mSamplesDrawn;
-	static U64 sTotalSamplesDrawn;
-	U32 mDrawCalls;
-	static U32 sTotalDrawCalls;
-
-	bool mTextureStateFetched;
-	std::vector<U32> mTextureMagFilter;
-	std::vector<U32> mTextureMinFilter;
+    U32 mAttributeMask;  //mask of which reserved attributes are set (lines up with LLVertexBuffer::getTypeMask())
+    std::vector<GLint> mUniform;   //lookup table of uniform enum to uniform location
+    LLStaticStringTable<GLint> mUniformMap; //lookup map of uniform name to uniform location
+    std::map<GLint, std::string> mUniformNameMap; //lookup map of uniform location to uniform name
+    std::map<GLint, LLVector4> mValue; //lookup map of uniform location to last known value
+    std::vector<GLint> mTexture;
+    S32 mTotalUniformSize;
+    S32 mActiveTextureChannels;
+    S32 mShaderLevel;
+    S32 mShaderGroup;
+    BOOL mUniformsDirty;
+    LLShaderFeatures mFeatures;
+    std::vector< std::pair< std::string, GLenum > > mShaderFiles;
+    std::string mName;
+    boost::unordered_map<std::string, std::string> mDefines;
+
+    //statistcis for profiling shader performance
+    U32 mTimerQuery;
+    U32 mSamplesQuery;
+    U64 mTimeElapsed;
+    static U64 sTotalTimeElapsed;
+    U32 mTrianglesDrawn;
+    static U32 sTotalTrianglesDrawn;
+    U64 mSamplesDrawn;
+    static U64 sTotalSamplesDrawn;
+    U32 mDrawCalls;
+    static U32 sTotalDrawCalls;
+
+    bool mTextureStateFetched;
+    std::vector<U32> mTextureMagFilter;
+    std::vector<U32> mTextureMinFilter;
 
     GLhandleARB mExtraLinkObject = 0;
 
 private:
-	void unloadInternal();
+    void unloadInternal();
 };
 
 //UI shader (declared here so llui_libtest will link properly)
-extern LLGLSLShader			gUIProgram;
+extern LLGLSLShader         gUIProgram;
 //output vec4(color.rgb,color.a*tex0[tc0].a)
-extern LLGLSLShader			gSolidColorProgram;
+extern LLGLSLShader         gSolidColorProgram;
 //Alpha mask shader (declared here so llappearance can access properly)
-extern LLGLSLShader			gAlphaMaskProgram;
+extern LLGLSLShader         gAlphaMaskProgram;
 
 #endif
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index ec8f05e4caf..5b96667f9ff 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -53,489 +53,489 @@ LLShaderMgr::~LLShaderMgr()
 // static
 LLShaderMgr * LLShaderMgr::instance()
 {
-	if(NULL == sInstance)
-	{
-		LL_ERRS("Shaders") << "LLShaderMgr should already have been instantiated by the application!" << LL_ENDL;
-	}
+    if(NULL == sInstance)
+    {
+        LL_ERRS("Shaders") << "LLShaderMgr should already have been instantiated by the application!" << LL_ENDL;
+    }
 
-	return sInstance;
+    return sInstance;
 }
 
 BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
 {
-	llassert_always(shader != NULL);
-	LLShaderFeatures *features = & shader->mFeatures;
-
-	if (features->attachNothing)
-	{
-		return TRUE;
-	}
-	//////////////////////////////////////
-	// Attach Vertex Shader Features First
-	//////////////////////////////////////
-	
-	// NOTE order of shader object attaching is VERY IMPORTANT!!!
-	if (features->calculatesAtmospherics)
-	{
-		if (features->hasWaterFog)
-		{
-			if (!shader->attachObject("windlight/atmosphericsVarsWaterV.glsl"))
-			{
-				return FALSE;
-			}
-		}
-		else if (!shader->attachObject("windlight/atmosphericsVarsV.glsl"))
-		{
-			return FALSE;
-		}
-	}
-
-	if (features->calculatesLighting || features->calculatesAtmospherics)
-	{
-		if (!shader->attachObject("windlight/atmosphericsHelpersV.glsl"))
-		{
-			return FALSE;
-		}
-	}
-		
-	if (features->calculatesLighting)
-	{
-		if (features->isSpecular)
-		{
-			if (!shader->attachObject("lighting/lightFuncSpecularV.glsl"))
-			{
-				return FALSE;
-			}
-		
-			if (!features->isAlphaLighting)
-			{
-				if (!shader->attachObject("lighting/sumLightsSpecularV.glsl"))
-				{
-					return FALSE;
-				}
-			}
-			
-			if (!shader->attachObject("lighting/lightSpecularV.glsl"))
-			{
-				return FALSE;
-			}
-		}
-		else 
-		{
-			if (!shader->attachObject("lighting/lightFuncV.glsl"))
-			{
-				return FALSE;
-			}
-			
-			if (!features->isAlphaLighting)
-			{
-				if (!shader->attachObject("lighting/sumLightsV.glsl"))
-				{
-					return FALSE;
-				}
-			}
-			
-			if (!shader->attachObject("lighting/lightV.glsl"))
-			{
-				return FALSE;
-			}
-		}
-	}
-	
-	// NOTE order of shader object attaching is VERY IMPORTANT!!!
-	if (features->calculatesAtmospherics)
-	{
-		if (!shader->attachObject("windlight/atmosphericsV.glsl"))
-		{
-			return FALSE;
-		}
-	}
-
-	if (features->hasSkinning)
-	{
-		if (!shader->attachObject("avatar/avatarSkinV.glsl"))
-		{
-			return FALSE;
-		}
-	}
-
-	if (features->hasObjectSkinning)
-	{
-		if (!shader->attachObject("avatar/objectSkinV.glsl"))
-		{
-			return FALSE;
-		}
-	}
-	
-	///////////////////////////////////////
-	// Attach Fragment Shader Features Next
-	///////////////////////////////////////
+    llassert_always(shader != NULL);
+    LLShaderFeatures *features = & shader->mFeatures;
+
+    if (features->attachNothing)
+    {
+        return TRUE;
+    }
+    //////////////////////////////////////
+    // Attach Vertex Shader Features First
+    //////////////////////////////////////
+    
+    // NOTE order of shader object attaching is VERY IMPORTANT!!!
+    if (features->calculatesAtmospherics)
+    {
+        if (features->hasWaterFog)
+        {
+            if (!shader->attachObject("windlight/atmosphericsVarsWaterV.glsl"))
+            {
+                return FALSE;
+            }
+        }
+        else if (!shader->attachObject("windlight/atmosphericsVarsV.glsl"))
+        {
+            return FALSE;
+        }
+    }
+
+    if (features->calculatesLighting || features->calculatesAtmospherics)
+    {
+        if (!shader->attachObject("windlight/atmosphericsHelpersV.glsl"))
+        {
+            return FALSE;
+        }
+    }
+        
+    if (features->calculatesLighting)
+    {
+        if (features->isSpecular)
+        {
+            if (!shader->attachObject("lighting/lightFuncSpecularV.glsl"))
+            {
+                return FALSE;
+            }
+        
+            if (!features->isAlphaLighting)
+            {
+                if (!shader->attachObject("lighting/sumLightsSpecularV.glsl"))
+                {
+                    return FALSE;
+                }
+            }
+            
+            if (!shader->attachObject("lighting/lightSpecularV.glsl"))
+            {
+                return FALSE;
+            }
+        }
+        else 
+        {
+            if (!shader->attachObject("lighting/lightFuncV.glsl"))
+            {
+                return FALSE;
+            }
+            
+            if (!features->isAlphaLighting)
+            {
+                if (!shader->attachObject("lighting/sumLightsV.glsl"))
+                {
+                    return FALSE;
+                }
+            }
+            
+            if (!shader->attachObject("lighting/lightV.glsl"))
+            {
+                return FALSE;
+            }
+        }
+    }
+    
+    // NOTE order of shader object attaching is VERY IMPORTANT!!!
+    if (features->calculatesAtmospherics)
+    {
+        if (!shader->attachObject("windlight/atmosphericsV.glsl"))
+        {
+            return FALSE;
+        }
+    }
+
+    if (features->hasSkinning)
+    {
+        if (!shader->attachObject("avatar/avatarSkinV.glsl"))
+        {
+            return FALSE;
+        }
+    }
+
+    if (features->hasObjectSkinning)
+    {
+        if (!shader->attachObject("avatar/objectSkinV.glsl"))
+        {
+            return FALSE;
+        }
+    }
+    
+    ///////////////////////////////////////
+    // Attach Fragment Shader Features Next
+    ///////////////////////////////////////
 
 // NOTE order of shader object attaching is VERY IMPORTANT!!!
 
-	if(features->calculatesAtmospherics)
-	{
-		if (features->hasWaterFog)
-		{
-			if (!shader->attachObject("windlight/atmosphericsVarsWaterF.glsl"))
-			{
-				return FALSE;
-			}
-		}
-		else if (!shader->attachObject("windlight/atmosphericsVarsF.glsl"))
-		{
-			return FALSE;
-		}
-	}
+    if(features->calculatesAtmospherics)
+    {
+        if (features->hasWaterFog)
+        {
+            if (!shader->attachObject("windlight/atmosphericsVarsWaterF.glsl"))
+            {
+                return FALSE;
+            }
+        }
+        else if (!shader->attachObject("windlight/atmosphericsVarsF.glsl"))
+        {
+            return FALSE;
+        }
+    }
 
     if (features->calculatesLighting || features->calculatesAtmospherics)
-	{
-		if (!shader->attachObject("windlight/atmosphericsHelpersF.glsl"))
-		{
-			return FALSE;
-		}
-	}
+    {
+        if (!shader->attachObject("windlight/atmosphericsHelpersF.glsl"))
+        {
+            return FALSE;
+        }
+    }
 
     // we want this BEFORE shadows and AO because those facilities use pos/norm access
     if (features->isDeferred)
-	{
-		if (!shader->attachObject("deferred/deferredUtil.glsl"))
-		{
-			return FALSE;
-		}
-	}
+    {
+        if (!shader->attachObject("deferred/deferredUtil.glsl"))
+        {
+            return FALSE;
+        }
+    }
 
     if (features->hasShadows)
-	{
-		if (!shader->attachObject("deferred/shadowUtil.glsl"))
-		{
-			return FALSE;
-		}
-	}
+    {
+        if (!shader->attachObject("deferred/shadowUtil.glsl"))
+        {
+            return FALSE;
+        }
+    }
 
     if (features->hasAmbientOcclusion)
-	{
-		if (!shader->attachObject("deferred/aoUtil.glsl"))
-		{
-			return FALSE;
-		}
-	}
+    {
+        if (!shader->attachObject("deferred/aoUtil.glsl"))
+        {
+            return FALSE;
+        }
+    }
 
     if (features->hasIndirect)
-	{
-		if (!shader->attachObject("deferred/indirect.glsl"))
-		{
-			return FALSE;
-		}
-	}
-
-	if (features->hasGamma)
-	{
-		if (!shader->attachObject("windlight/gammaF.glsl"))
-		{
-			return FALSE;
-		}
-	}
-
-	if (features->hasSrgb)
-	{
-		if (!shader->attachObject("environment/srgbF.glsl"))
-		{
-			return FALSE;
-		}
-	}
+    {
+        if (!shader->attachObject("deferred/indirect.glsl"))
+        {
+            return FALSE;
+        }
+    }
+
+    if (features->hasGamma)
+    {
+        if (!shader->attachObject("windlight/gammaF.glsl"))
+        {
+            return FALSE;
+        }
+    }
+
+    if (features->hasSrgb)
+    {
+        if (!shader->attachObject("environment/srgbF.glsl"))
+        {
+            return FALSE;
+        }
+    }
 
     if (features->encodesNormal)
-	{
-		if (!shader->attachObject("environment/encodeNormF.glsl"))
-		{
-			return FALSE;
-		}
-	}
-
-	if (features->hasAtmospherics)
-	{
-		if (!shader->attachObject("windlight/atmosphericsF.glsl"))
-		{
-			return FALSE;
-		}
-	}
-	
-	if (features->hasTransport)
-	{
-		if (!shader->attachObject("windlight/transportF.glsl"))
-		{
-			return FALSE;
-		}
-
-		// Test hasFullbright and hasShiny and attach fullbright and 
-		// fullbright shiny atmos transport if we split them out.
-	}
-
-	// NOTE order of shader object attaching is VERY IMPORTANT!!!
-	if (features->hasWaterFog)
-	{
-		if (!shader->attachObject("environment/waterFogF.glsl"))
-		{
-			return FALSE;
-		}
-	}
-	
-	if (features->hasLighting)
-	{
-		if (features->hasWaterFog)
-		{
-			if (features->disableTextureIndex)
-			{
-				if (features->hasAlphaMask)
-				{
-					if (!shader->attachObject("lighting/lightWaterAlphaMaskNonIndexedF.glsl"))
-					{
-						return FALSE;
-					}
-				}
-				else
-				{
-					if (!shader->attachObject("lighting/lightWaterNonIndexedF.glsl"))
-					{
-						return FALSE;
-					}
-				}
-			}
-			else 
-			{
-				if (features->hasAlphaMask)
-				{
-					if (!shader->attachObject("lighting/lightWaterAlphaMaskF.glsl"))
-					{
-						return FALSE;
-					}
-				}
-				else
-				{
-					if (!shader->attachObject("lighting/lightWaterF.glsl"))
-					{
-						return FALSE;
-					}
-				}
-				shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
-			}
-		}
-		
-		else
-		{
-			if (features->disableTextureIndex)
-			{
-				if (features->hasAlphaMask)
-				{
-					if (!shader->attachObject("lighting/lightAlphaMaskNonIndexedF.glsl"))
-					{
-						return FALSE;
-					}
-				}
-				else
-				{
-					if (!shader->attachObject("lighting/lightNonIndexedF.glsl"))
-					{
-						return FALSE;
-					}
-				}
-			}
-			else 
-			{
-				if (features->hasAlphaMask)
-				{
-					if (!shader->attachObject("lighting/lightAlphaMaskF.glsl"))
-					{
-						return FALSE;
-					}
-				}
-				else
-				{
-					if (!shader->attachObject("lighting/lightF.glsl"))
-					{
-						return FALSE;
-					}
-				}
-				shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
-			}
-		}
-	}
-	
-	// NOTE order of shader object attaching is VERY IMPORTANT!!!
-	else if (features->isFullbright)
-	{
-	
-		if (features->isShiny && features->hasWaterFog)
-		{
-			if (features->disableTextureIndex)
-			{
-				if (!shader->attachObject("lighting/lightFullbrightShinyWaterNonIndexedF.glsl"))
-				{
-					return FALSE;
-				}
-			}
-			else 
-			{
-				if (!shader->attachObject("lighting/lightFullbrightShinyWaterF.glsl"))
-				{
-					return FALSE;
-				}
-				shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
-			}
-		}
-		else if (features->hasWaterFog)
-		{
-			if (features->disableTextureIndex)
-			{
-				if (features->hasAlphaMask)
-				{
-					if (!shader->attachObject("lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl"))
-					{
-						return FALSE;
-					}
-				}
-				else if (!shader->attachObject("lighting/lightFullbrightWaterNonIndexedF.glsl"))
-				{
-					return FALSE;
-				}
-			}
-			else 
-			{
-				if (features->hasAlphaMask)
-				{
-					if (!shader->attachObject("lighting/lightFullbrightWaterAlphaMaskF.glsl"))
-					{
-						return FALSE;
-					}
-				}
-				else if (!shader->attachObject("lighting/lightFullbrightWaterF.glsl"))
-				{
-					return FALSE;
-				}
-				shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
-			}
-		}
-		
-		else if (features->isShiny)
-		{
-			if (features->disableTextureIndex)
-			{
-				if (!shader->attachObject("lighting/lightFullbrightShinyNonIndexedF.glsl"))
-				{
-					return FALSE;
-				}
-			}
-			else 
-			{
-				if (!shader->attachObject("lighting/lightFullbrightShinyF.glsl"))
-				{
-					return FALSE;
-				}
-				shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
-			}
-		}
-		
-		else
-		{
-			if (features->disableTextureIndex)
-			{
-
-				if (features->hasAlphaMask)
-				{
-					if (!shader->attachObject("lighting/lightFullbrightNonIndexedAlphaMaskF.glsl"))
-					{
-						return FALSE;
-					}
-				}
-				else
-				{
-					if (!shader->attachObject("lighting/lightFullbrightNonIndexedF.glsl"))
-					{
-						return FALSE;
-					}
-				}
-			}
-			else 
-			{
-				if (features->hasAlphaMask)
-				{
-					if (!shader->attachObject("lighting/lightFullbrightAlphaMaskF.glsl"))
-					{
-						return FALSE;
-					}
-				}
-				else
-				{
-					if (!shader->attachObject("lighting/lightFullbrightF.glsl"))
-					{
-						return FALSE;
-					}
-				}
-				shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
-			}
-		}
-	}
-
-	// NOTE order of shader object attaching is VERY IMPORTANT!!!
-	else if (features->isShiny)
-	{
-	
-		if (features->hasWaterFog)
-		{
-			if (features->disableTextureIndex)
-			{
-				if (!shader->attachObject("lighting/lightShinyWaterNonIndexedF.glsl"))
-				{
-					return FALSE;
-				}
-			}
-			else 
-			{
-				if (!shader->attachObject("lighting/lightShinyWaterF.glsl"))
-				{
-					return FALSE;
-				}
-				shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
-			}
-		}
-		
-		else 
-		{
-			if (features->disableTextureIndex)
-			{
-				if (!shader->attachObject("lighting/lightShinyNonIndexedF.glsl"))
-				{
-					return FALSE;
-				}
-			}
-			else 
-			{
-				if (!shader->attachObject("lighting/lightShinyF.glsl"))
-				{
-					return FALSE;
-				}
-				shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
-			}
-		}
-	}
-
-	if (features->mIndexedTextureChannels <= 1)
-	{
-		if (!shader->attachObject("objects/nonindexedTextureV.glsl"))
-		{
-			return FALSE;
-		}
-	}
-	else
-	{
-		if (!shader->attachObject("objects/indexedTextureV.glsl"))
-		{
-			return FALSE;
-		}
-	}
-
-	return TRUE;
+    {
+        if (!shader->attachObject("environment/encodeNormF.glsl"))
+        {
+            return FALSE;
+        }
+    }
+
+    if (features->hasAtmospherics)
+    {
+        if (!shader->attachObject("windlight/atmosphericsF.glsl"))
+        {
+            return FALSE;
+        }
+    }
+    
+    if (features->hasTransport)
+    {
+        if (!shader->attachObject("windlight/transportF.glsl"))
+        {
+            return FALSE;
+        }
+
+        // Test hasFullbright and hasShiny and attach fullbright and 
+        // fullbright shiny atmos transport if we split them out.
+    }
+
+    // NOTE order of shader object attaching is VERY IMPORTANT!!!
+    if (features->hasWaterFog)
+    {
+        if (!shader->attachObject("environment/waterFogF.glsl"))
+        {
+            return FALSE;
+        }
+    }
+    
+    if (features->hasLighting)
+    {
+        if (features->hasWaterFog)
+        {
+            if (features->disableTextureIndex)
+            {
+                if (features->hasAlphaMask)
+                {
+                    if (!shader->attachObject("lighting/lightWaterAlphaMaskNonIndexedF.glsl"))
+                    {
+                        return FALSE;
+                    }
+                }
+                else
+                {
+                    if (!shader->attachObject("lighting/lightWaterNonIndexedF.glsl"))
+                    {
+                        return FALSE;
+                    }
+                }
+            }
+            else 
+            {
+                if (features->hasAlphaMask)
+                {
+                    if (!shader->attachObject("lighting/lightWaterAlphaMaskF.glsl"))
+                    {
+                        return FALSE;
+                    }
+                }
+                else
+                {
+                    if (!shader->attachObject("lighting/lightWaterF.glsl"))
+                    {
+                        return FALSE;
+                    }
+                }
+                shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
+            }
+        }
+        
+        else
+        {
+            if (features->disableTextureIndex)
+            {
+                if (features->hasAlphaMask)
+                {
+                    if (!shader->attachObject("lighting/lightAlphaMaskNonIndexedF.glsl"))
+                    {
+                        return FALSE;
+                    }
+                }
+                else
+                {
+                    if (!shader->attachObject("lighting/lightNonIndexedF.glsl"))
+                    {
+                        return FALSE;
+                    }
+                }
+            }
+            else 
+            {
+                if (features->hasAlphaMask)
+                {
+                    if (!shader->attachObject("lighting/lightAlphaMaskF.glsl"))
+                    {
+                        return FALSE;
+                    }
+                }
+                else
+                {
+                    if (!shader->attachObject("lighting/lightF.glsl"))
+                    {
+                        return FALSE;
+                    }
+                }
+                shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
+            }
+        }
+    }
+    
+    // NOTE order of shader object attaching is VERY IMPORTANT!!!
+    else if (features->isFullbright)
+    {
+    
+        if (features->isShiny && features->hasWaterFog)
+        {
+            if (features->disableTextureIndex)
+            {
+                if (!shader->attachObject("lighting/lightFullbrightShinyWaterNonIndexedF.glsl"))
+                {
+                    return FALSE;
+                }
+            }
+            else 
+            {
+                if (!shader->attachObject("lighting/lightFullbrightShinyWaterF.glsl"))
+                {
+                    return FALSE;
+                }
+                shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
+            }
+        }
+        else if (features->hasWaterFog)
+        {
+            if (features->disableTextureIndex)
+            {
+                if (features->hasAlphaMask)
+                {
+                    if (!shader->attachObject("lighting/lightFullbrightWaterNonIndexedAlphaMaskF.glsl"))
+                    {
+                        return FALSE;
+                    }
+                }
+                else if (!shader->attachObject("lighting/lightFullbrightWaterNonIndexedF.glsl"))
+                {
+                    return FALSE;
+                }
+            }
+            else 
+            {
+                if (features->hasAlphaMask)
+                {
+                    if (!shader->attachObject("lighting/lightFullbrightWaterAlphaMaskF.glsl"))
+                    {
+                        return FALSE;
+                    }
+                }
+                else if (!shader->attachObject("lighting/lightFullbrightWaterF.glsl"))
+                {
+                    return FALSE;
+                }
+                shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
+            }
+        }
+        
+        else if (features->isShiny)
+        {
+            if (features->disableTextureIndex)
+            {
+                if (!shader->attachObject("lighting/lightFullbrightShinyNonIndexedF.glsl"))
+                {
+                    return FALSE;
+                }
+            }
+            else 
+            {
+                if (!shader->attachObject("lighting/lightFullbrightShinyF.glsl"))
+                {
+                    return FALSE;
+                }
+                shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
+            }
+        }
+        
+        else
+        {
+            if (features->disableTextureIndex)
+            {
+
+                if (features->hasAlphaMask)
+                {
+                    if (!shader->attachObject("lighting/lightFullbrightNonIndexedAlphaMaskF.glsl"))
+                    {
+                        return FALSE;
+                    }
+                }
+                else
+                {
+                    if (!shader->attachObject("lighting/lightFullbrightNonIndexedF.glsl"))
+                    {
+                        return FALSE;
+                    }
+                }
+            }
+            else 
+            {
+                if (features->hasAlphaMask)
+                {
+                    if (!shader->attachObject("lighting/lightFullbrightAlphaMaskF.glsl"))
+                    {
+                        return FALSE;
+                    }
+                }
+                else
+                {
+                    if (!shader->attachObject("lighting/lightFullbrightF.glsl"))
+                    {
+                        return FALSE;
+                    }
+                }
+                shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
+            }
+        }
+    }
+
+    // NOTE order of shader object attaching is VERY IMPORTANT!!!
+    else if (features->isShiny)
+    {
+    
+        if (features->hasWaterFog)
+        {
+            if (features->disableTextureIndex)
+            {
+                if (!shader->attachObject("lighting/lightShinyWaterNonIndexedF.glsl"))
+                {
+                    return FALSE;
+                }
+            }
+            else 
+            {
+                if (!shader->attachObject("lighting/lightShinyWaterF.glsl"))
+                {
+                    return FALSE;
+                }
+                shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
+            }
+        }
+        
+        else 
+        {
+            if (features->disableTextureIndex)
+            {
+                if (!shader->attachObject("lighting/lightShinyNonIndexedF.glsl"))
+                {
+                    return FALSE;
+                }
+            }
+            else 
+            {
+                if (!shader->attachObject("lighting/lightShinyF.glsl"))
+                {
+                    return FALSE;
+                }
+                shader->mFeatures.mIndexedTextureChannels = llmax(LLGLSLShader::sIndexedTextureChannels-1, 1);
+            }
+        }
+    }
+
+    if (features->mIndexedTextureChannels <= 1)
+    {
+        if (!shader->attachObject("objects/nonindexedTextureV.glsl"))
+        {
+            return FALSE;
+        }
+    }
+    else
+    {
+        if (!shader->attachObject("objects/indexedTextureV.glsl"))
+        {
+            return FALSE;
+        }
+    }
+
+    return TRUE;
 }
 
 //============================================================================
@@ -543,46 +543,46 @@ BOOL LLShaderMgr::attachShaderFeatures(LLGLSLShader * shader)
 
 static std::string get_object_log(GLhandleARB ret)
 {
-	std::string res;
-	
-	//get log length 
-	GLint length;
-	glGetObjectParameterivARB(ret, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
-	if (length > 0)
-	{
-		//the log could be any size, so allocate appropriately
-		GLcharARB* log = new GLcharARB[length];
-		glGetInfoLogARB(ret, length, &length, log);
-		res = std::string((char *)log);
-		delete[] log;
-	}
-	return res;
+    std::string res;
+    
+    //get log length 
+    GLint length;
+    glGetObjectParameterivARB(ret, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
+    if (length > 0)
+    {
+        //the log could be any size, so allocate appropriately
+        GLcharARB* log = new GLcharARB[length];
+        glGetInfoLogARB(ret, length, &length, log);
+        res = std::string((char *)log);
+        delete[] log;
+    }
+    return res;
 }
 
 //dump shader source for debugging
 void LLShaderMgr::dumpShaderSource(U32 shader_code_count, GLcharARB** shader_code_text)
-{	
-	for (GLuint i = 0; i < shader_code_count; i++)
-	{
-		LL_SHADER_LOADING_WARNS() << i << ": " << shader_code_text[i] << LL_ENDL;
-	}
+{   
+    for (GLuint i = 0; i < shader_code_count; i++)
+    {
+        LL_SHADER_LOADING_WARNS() << i << ": " << shader_code_text[i] << LL_ENDL;
+    }
     LL_SHADER_LOADING_WARNS() << LL_ENDL;
 }
 
 void LLShaderMgr::dumpObjectLog(GLhandleARB ret, BOOL warns, const std::string& filename) 
 {
-	std::string log = get_object_log(ret);
+    std::string log = get_object_log(ret);
     std::string fname = filename;
     if (filename.empty())
     {
         fname = "unknown shader file";
     }
 
-	if (log.length() > 0)
-	{
+    if (log.length() > 0)
+    {
         LL_SHADER_LOADING_WARNS() << "Shader loading from " << fname << ":\n" << LL_ENDL;
         LL_SHADER_LOADING_WARNS() << log << LL_ENDL;
-	}
+    }
  }
 
 GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shader_level, GLenum type, boost::unordered_map<std::string, std::string>* defines, S32 texture_index_channels)
@@ -596,38 +596,38 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
     }
 #endif
 
-	GLenum error = GL_NO_ERROR;
-	if (gDebugGL)
-	{
-		error = glGetError();
-		if (error != GL_NO_ERROR)
-		{
-			LL_SHADER_LOADING_WARNS() << "GL ERROR entering loadShaderFile(): " << error << LL_ENDL;
-		}
-	}
-	
-	//LL_SHADER_LOADING_WARNS() << "Loading shader file: " << filename << " class " << shader_level << LL_ENDL;
+    GLenum error = GL_NO_ERROR;
+    if (gDebugGL)
+    {
+        error = glGetError();
+        if (error != GL_NO_ERROR)
+        {
+            LL_SHADER_LOADING_WARNS() << "GL ERROR entering loadShaderFile(): " << error << LL_ENDL;
+        }
+    }
+    
+    //LL_SHADER_LOADING_WARNS() << "Loading shader file: " << filename << " class " << shader_level << LL_ENDL;
 
-	if (filename.empty()) 
-	{
-		return 0;
-	}
+    if (filename.empty()) 
+    {
+        return 0;
+    }
 
 
-	//read in from file
-	LLFILE* file = NULL;
+    //read in from file
+    LLFILE* file = NULL;
 
-	S32 try_gpu_class = shader_level;
-	S32 gpu_class;
+    S32 try_gpu_class = shader_level;
+    S32 gpu_class;
 
     std::string open_file_name;
-	//find the most relevant file
-	for (gpu_class = try_gpu_class; gpu_class > 0; gpu_class--)
-	{	//search from the current gpu class down to class 1 to find the most relevant shader
-		std::stringstream fname;
-		fname << getShaderDirPrefix();
-		fname << gpu_class << "/" << filename;
-		
+    //find the most relevant file
+    for (gpu_class = try_gpu_class; gpu_class > 0; gpu_class--)
+    {   //search from the current gpu class down to class 1 to find the most relevant shader
+        std::stringstream fname;
+        fname << getShaderDirPrefix();
+        fname << gpu_class << "/" << filename;
+        
         open_file_name = fname.str();
 
         /*
@@ -643,23 +643,23 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
 
         */
 
- 		LL_DEBUGS("ShaderLoading") << "Looking in " << open_file_name << LL_ENDL;
-		file = LLFile::fopen(open_file_name, "r");		/* Flawfinder: ignore */
-		if (file)
-		{
-			LL_DEBUGS("ShaderLoading") << "Loading file: " << open_file_name << " (Want class " << gpu_class << ")" << LL_ENDL;            
-			break; // done
-		}
-	}
-	
-	if (file == NULL)
-	{
-		LL_SHADER_LOADING_WARNS() << "GLSL Shader file not found: " << open_file_name << LL_ENDL;
-		return 0;
-	}
-
-	//we can't have any lines longer than 1024 characters 
-	//or any shaders longer than 4096 lines... deal - DaveP
+        LL_DEBUGS("ShaderLoading") << "Looking in " << open_file_name << LL_ENDL;
+        file = LLFile::fopen(open_file_name, "r");      /* Flawfinder: ignore */
+        if (file)
+        {
+            LL_DEBUGS("ShaderLoading") << "Loading file: " << open_file_name << " (Want class " << gpu_class << ")" << LL_ENDL;            
+            break; // done
+        }
+    }
+    
+    if (file == NULL)
+    {
+        LL_SHADER_LOADING_WARNS() << "GLSL Shader file not found: " << open_file_name << LL_ENDL;
+        return 0;
+    }
+
+    //we can't have any lines longer than 1024 characters 
+    //or any shaders longer than 4096 lines... deal - DaveP
     GLcharARB buff[1024];
     GLcharARB *extra_code_text[1024];
     GLcharARB *shader_code_text[4096 + LL_ARRAY_SIZE(extra_code_text)] = { NULL };
@@ -667,661 +667,661 @@ GLhandleARB LLShaderMgr::loadShaderFile(const std::string& filename, S32 & shade
     BOOST_STATIC_ASSERT(LL_ARRAY_SIZE(extra_code_text) < LL_ARRAY_SIZE(shader_code_text));
     
     
-	S32 major_version = gGLManager.mGLSLVersionMajor;
-	S32 minor_version = gGLManager.mGLSLVersionMinor;
-	
-	if (major_version == 1 && minor_version < 30)
-	{
-		if (minor_version < 10)
-		{
-			//should NEVER get here -- if major version is 1 and minor version is less than 10, 
-			// viewer should never attempt to use shaders, continuing will result in undefined behavior
-			LL_ERRS() << "Unsupported GLSL Version." << LL_ENDL;
-		}
-
-		if (minor_version <= 19)
-		{
-			shader_code_text[shader_code_count++] = strdup("#version 110\n");
-			extra_code_text[extra_code_count++] = strdup("#define ATTRIBUTE attribute\n");
-			extra_code_text[extra_code_count++] = strdup("#define VARYING varying\n");
-			extra_code_text[extra_code_count++] = strdup("#define VARYING_FLAT varying\n");
-		}
-		else if (minor_version <= 29)
-		{
-			//set version to 1.20
-			shader_code_text[shader_code_count++] = strdup("#version 120\n");
-       		extra_code_text[extra_code_count++] = strdup("#define FXAA_GLSL_120 1\n");
-			extra_code_text[extra_code_count++] = strdup("#define FXAA_FAST_PIXEL_OFFSET 0\n");
-			extra_code_text[extra_code_count++] = strdup("#define ATTRIBUTE attribute\n");
-			extra_code_text[extra_code_count++] = strdup("#define VARYING varying\n");
-			extra_code_text[extra_code_count++] = strdup("#define VARYING_FLAT varying\n");
-		}
-	}
-	else
-	{  
-		if (major_version < 4)
-		{
-			//set version to 1.30
-			shader_code_text[shader_code_count++] = strdup("#version 130\n");
-			//some implementations of GLSL 1.30 require integer precision be explicitly declared
-			extra_code_text[extra_code_count++] = strdup("precision mediump int;\n");
-			extra_code_text[extra_code_count++] = strdup("precision highp float;\n");
-		}
-		else
-		{ //set version to 400
-			shader_code_text[shader_code_count++] = strdup("#version 400\n");
-		}
-
-		extra_code_text[extra_code_count++] = strdup("#define DEFINE_GL_FRAGCOLOR 1\n");
-		extra_code_text[extra_code_count++] = strdup("#define FXAA_GLSL_130 1\n");
-
-		extra_code_text[extra_code_count++] = strdup("#define ATTRIBUTE in\n");
-
-		if (type == GL_VERTEX_SHADER_ARB)
-		{ //"varying" state is "out" in a vertex program, "in" in a fragment program 
-			// ("varying" is deprecated after version 1.20)
-			extra_code_text[extra_code_count++] = strdup("#define VARYING out\n");
-			extra_code_text[extra_code_count++] = strdup("#define VARYING_FLAT flat out\n");
-		}
-		else
-		{
-			extra_code_text[extra_code_count++] = strdup("#define VARYING in\n");
-			extra_code_text[extra_code_count++] = strdup("#define VARYING_FLAT flat in\n");
-		}
-
-		//backwards compatibility with legacy texture lookup syntax
-		extra_code_text[extra_code_count++] = strdup("#define texture2D texture\n");
-		extra_code_text[extra_code_count++] = strdup("#define textureCube texture\n");
-		extra_code_text[extra_code_count++] = strdup("#define texture2DLod textureLod\n");
-		extra_code_text[extra_code_count++] = strdup("#define shadow2D(a,b) vec2(texture(a,b))\n");
-		
-		if (major_version > 1 || minor_version >= 40)
-		{ //GLSL 1.40 replaces texture2DRect et al with texture
-			extra_code_text[extra_code_count++] = strdup("#define texture2DRect texture\n");
-			extra_code_text[extra_code_count++] = strdup("#define shadow2DRect(a,b) vec2(texture(a,b))\n");
-		}
-	}
-	
-	if (defines)
-	{
-		for (boost::unordered_map<std::string,std::string>::iterator iter = defines->begin(); iter != defines->end(); ++iter)
-		{
-			std::string define = "#define " + iter->first + " " + iter->second + "\n";
-			extra_code_text[extra_code_count++] = (GLcharARB *) strdup(define.c_str());
-		}
-	}
-
-	if( gGLManager.mIsATI )
-	{
-		extra_code_text[extra_code_count++] = strdup( "#define IS_AMD_CARD 1\n" );
-	}
-	
-	if (texture_index_channels > 0 && type == GL_FRAGMENT_SHADER_ARB)
-	{
-		//use specified number of texture channels for indexed texture rendering
-
-		/* prepend shader code that looks like this:
-
-		uniform sampler2D tex0;
-		uniform sampler2D tex1;
-		uniform sampler2D tex2;
-		.
-		.
-		.
-		uniform sampler2D texN;
-		
-		VARYING_FLAT ivec4 vary_texture_index;
-
-		vec4 ret = vec4(1,0,1,1);
-
-		vec4 diffuseLookup(vec2 texcoord)
-		{
-			switch (vary_texture_index.r))
-			{
-				case 0: ret = texture2D(tex0, texcoord); break;
-				case 1: ret = texture2D(tex1, texcoord); break;
-				case 2: ret = texture2D(tex2, texcoord); break;
-				.
-				.
-				.
-				case N: return texture2D(texN, texcoord); break;
-			}
-
-			return ret;
-		}
-		*/
-
-		extra_code_text[extra_code_count++] = strdup("#define HAS_DIFFUSE_LOOKUP\n");
-
-		//uniform declartion
-		for (S32 i = 0; i < texture_index_channels; ++i)
-		{
-			std::string decl = llformat("uniform sampler2D tex%d;\n", i);
-			extra_code_text[extra_code_count++] = strdup(decl.c_str());
-		}
-
-		if (texture_index_channels > 1)
-		{
-			extra_code_text[extra_code_count++] = strdup("VARYING_FLAT int vary_texture_index;\n");
-		}
-
-		extra_code_text[extra_code_count++] = strdup("vec4 diffuseLookup(vec2 texcoord)\n");
-		extra_code_text[extra_code_count++] = strdup("{\n");
-		
-		
-		if (texture_index_channels == 1)
-		{ //don't use flow control, that's silly
-			extra_code_text[extra_code_count++] = strdup("return texture2D(tex0, texcoord);\n");
-			extra_code_text[extra_code_count++] = strdup("}\n");
-		}
-		else if (major_version > 1 || minor_version >= 30)
-		{  //switches are supported in GLSL 1.30 and later
-			if (gGLManager.mIsNVIDIA)
-			{ //switches are unreliable on some NVIDIA drivers
-				for (U32 i = 0; i < texture_index_channels; ++i)
-				{
-					std::string if_string = llformat("\t%sif (vary_texture_index == %d) { return texture2D(tex%d, texcoord); }\n", i > 0 ? "else " : "", i, i); 
-					extra_code_text[extra_code_count++] = strdup(if_string.c_str());
-				}
-				extra_code_text[extra_code_count++] = strdup("\treturn vec4(1,0,1,1);\n");
-				extra_code_text[extra_code_count++] = strdup("}\n");
-			}
-			else
-			{
-				extra_code_text[extra_code_count++] = strdup("\tvec4 ret = vec4(1,0,1,1);\n");
-				extra_code_text[extra_code_count++] = strdup("\tswitch (vary_texture_index)\n");
-				extra_code_text[extra_code_count++] = strdup("\t{\n");
-		
-				//switch body
-				for (S32 i = 0; i < texture_index_channels; ++i)
-				{
-					std::string case_str = llformat("\t\tcase %d: return texture2D(tex%d, texcoord);\n", i, i);
-					extra_code_text[extra_code_count++] = strdup(case_str.c_str());
-				}
-
-				extra_code_text[extra_code_count++] = strdup("\t}\n");
-				extra_code_text[extra_code_count++] = strdup("\treturn ret;\n");
-				extra_code_text[extra_code_count++] = strdup("}\n");
-			}
-		}
-		else
-		{ //should never get here.  Indexed texture rendering requires GLSL 1.30 or later 
-			// (for passing integers between vertex and fragment shaders)
-			LL_ERRS() << "Indexed texture rendering requires GLSL 1.30 or later." << LL_ENDL;
-		}
-	}
+    S32 major_version = gGLManager.mGLSLVersionMajor;
+    S32 minor_version = gGLManager.mGLSLVersionMinor;
+    
+    if (major_version == 1 && minor_version < 30)
+    {
+        if (minor_version < 10)
+        {
+            //should NEVER get here -- if major version is 1 and minor version is less than 10, 
+            // viewer should never attempt to use shaders, continuing will result in undefined behavior
+            LL_ERRS() << "Unsupported GLSL Version." << LL_ENDL;
+        }
+
+        if (minor_version <= 19)
+        {
+            shader_code_text[shader_code_count++] = strdup("#version 110\n");
+            extra_code_text[extra_code_count++] = strdup("#define ATTRIBUTE attribute\n");
+            extra_code_text[extra_code_count++] = strdup("#define VARYING varying\n");
+            extra_code_text[extra_code_count++] = strdup("#define VARYING_FLAT varying\n");
+        }
+        else if (minor_version <= 29)
+        {
+            //set version to 1.20
+            shader_code_text[shader_code_count++] = strdup("#version 120\n");
+            extra_code_text[extra_code_count++] = strdup("#define FXAA_GLSL_120 1\n");
+            extra_code_text[extra_code_count++] = strdup("#define FXAA_FAST_PIXEL_OFFSET 0\n");
+            extra_code_text[extra_code_count++] = strdup("#define ATTRIBUTE attribute\n");
+            extra_code_text[extra_code_count++] = strdup("#define VARYING varying\n");
+            extra_code_text[extra_code_count++] = strdup("#define VARYING_FLAT varying\n");
+        }
+    }
+    else
+    {  
+        if (major_version < 4)
+        {
+            //set version to 1.30
+            shader_code_text[shader_code_count++] = strdup("#version 130\n");
+            //some implementations of GLSL 1.30 require integer precision be explicitly declared
+            extra_code_text[extra_code_count++] = strdup("precision mediump int;\n");
+            extra_code_text[extra_code_count++] = strdup("precision highp float;\n");
+        }
+        else
+        { //set version to 400
+            shader_code_text[shader_code_count++] = strdup("#version 400\n");
+        }
+
+        extra_code_text[extra_code_count++] = strdup("#define DEFINE_GL_FRAGCOLOR 1\n");
+        extra_code_text[extra_code_count++] = strdup("#define FXAA_GLSL_130 1\n");
+
+        extra_code_text[extra_code_count++] = strdup("#define ATTRIBUTE in\n");
+
+        if (type == GL_VERTEX_SHADER_ARB)
+        { //"varying" state is "out" in a vertex program, "in" in a fragment program 
+            // ("varying" is deprecated after version 1.20)
+            extra_code_text[extra_code_count++] = strdup("#define VARYING out\n");
+            extra_code_text[extra_code_count++] = strdup("#define VARYING_FLAT flat out\n");
+        }
+        else
+        {
+            extra_code_text[extra_code_count++] = strdup("#define VARYING in\n");
+            extra_code_text[extra_code_count++] = strdup("#define VARYING_FLAT flat in\n");
+        }
+
+        //backwards compatibility with legacy texture lookup syntax
+        extra_code_text[extra_code_count++] = strdup("#define texture2D texture\n");
+        extra_code_text[extra_code_count++] = strdup("#define textureCube texture\n");
+        extra_code_text[extra_code_count++] = strdup("#define texture2DLod textureLod\n");
+        extra_code_text[extra_code_count++] = strdup("#define shadow2D(a,b) vec2(texture(a,b))\n");
+        
+        if (major_version > 1 || minor_version >= 40)
+        { //GLSL 1.40 replaces texture2DRect et al with texture
+            extra_code_text[extra_code_count++] = strdup("#define texture2DRect texture\n");
+            extra_code_text[extra_code_count++] = strdup("#define shadow2DRect(a,b) vec2(texture(a,b))\n");
+        }
+    }
+    
+    if (defines)
+    {
+        for (boost::unordered_map<std::string,std::string>::iterator iter = defines->begin(); iter != defines->end(); ++iter)
+        {
+            std::string define = "#define " + iter->first + " " + iter->second + "\n";
+            extra_code_text[extra_code_count++] = (GLcharARB *) strdup(define.c_str());
+        }
+    }
+
+    if( gGLManager.mIsATI )
+    {
+        extra_code_text[extra_code_count++] = strdup( "#define IS_AMD_CARD 1\n" );
+    }
+    
+    if (texture_index_channels > 0 && type == GL_FRAGMENT_SHADER_ARB)
+    {
+        //use specified number of texture channels for indexed texture rendering
+
+        /* prepend shader code that looks like this:
+
+        uniform sampler2D tex0;
+        uniform sampler2D tex1;
+        uniform sampler2D tex2;
+        .
+        .
+        .
+        uniform sampler2D texN;
+        
+        VARYING_FLAT ivec4 vary_texture_index;
+
+        vec4 ret = vec4(1,0,1,1);
+
+        vec4 diffuseLookup(vec2 texcoord)
+        {
+            switch (vary_texture_index.r))
+            {
+                case 0: ret = texture2D(tex0, texcoord); break;
+                case 1: ret = texture2D(tex1, texcoord); break;
+                case 2: ret = texture2D(tex2, texcoord); break;
+                .
+                .
+                .
+                case N: return texture2D(texN, texcoord); break;
+            }
+
+            return ret;
+        }
+        */
+
+        extra_code_text[extra_code_count++] = strdup("#define HAS_DIFFUSE_LOOKUP\n");
+
+        //uniform declartion
+        for (S32 i = 0; i < texture_index_channels; ++i)
+        {
+            std::string decl = llformat("uniform sampler2D tex%d;\n", i);
+            extra_code_text[extra_code_count++] = strdup(decl.c_str());
+        }
+
+        if (texture_index_channels > 1)
+        {
+            extra_code_text[extra_code_count++] = strdup("VARYING_FLAT int vary_texture_index;\n");
+        }
+
+        extra_code_text[extra_code_count++] = strdup("vec4 diffuseLookup(vec2 texcoord)\n");
+        extra_code_text[extra_code_count++] = strdup("{\n");
+        
+        
+        if (texture_index_channels == 1)
+        { //don't use flow control, that's silly
+            extra_code_text[extra_code_count++] = strdup("return texture2D(tex0, texcoord);\n");
+            extra_code_text[extra_code_count++] = strdup("}\n");
+        }
+        else if (major_version > 1 || minor_version >= 30)
+        {  //switches are supported in GLSL 1.30 and later
+            if (gGLManager.mIsNVIDIA)
+            { //switches are unreliable on some NVIDIA drivers
+                for (U32 i = 0; i < texture_index_channels; ++i)
+                {
+                    std::string if_string = llformat("\t%sif (vary_texture_index == %d) { return texture2D(tex%d, texcoord); }\n", i > 0 ? "else " : "", i, i); 
+                    extra_code_text[extra_code_count++] = strdup(if_string.c_str());
+                }
+                extra_code_text[extra_code_count++] = strdup("\treturn vec4(1,0,1,1);\n");
+                extra_code_text[extra_code_count++] = strdup("}\n");
+            }
+            else
+            {
+                extra_code_text[extra_code_count++] = strdup("\tvec4 ret = vec4(1,0,1,1);\n");
+                extra_code_text[extra_code_count++] = strdup("\tswitch (vary_texture_index)\n");
+                extra_code_text[extra_code_count++] = strdup("\t{\n");
+        
+                //switch body
+                for (S32 i = 0; i < texture_index_channels; ++i)
+                {
+                    std::string case_str = llformat("\t\tcase %d: return texture2D(tex%d, texcoord);\n", i, i);
+                    extra_code_text[extra_code_count++] = strdup(case_str.c_str());
+                }
+
+                extra_code_text[extra_code_count++] = strdup("\t}\n");
+                extra_code_text[extra_code_count++] = strdup("\treturn ret;\n");
+                extra_code_text[extra_code_count++] = strdup("}\n");
+            }
+        }
+        else
+        { //should never get here.  Indexed texture rendering requires GLSL 1.30 or later 
+            // (for passing integers between vertex and fragment shaders)
+            LL_ERRS() << "Indexed texture rendering requires GLSL 1.30 or later." << LL_ENDL;
+        }
+    }
+    
+    //copy file into memory
+    enum {
+          flag_write_to_out_of_extra_block_area = 0x01
+        , flag_extra_block_marker_was_found = 0x02
+    };
+    
+    unsigned char flags = flag_write_to_out_of_extra_block_area;
+    
+    GLuint out_of_extra_block_counter = 0, start_shader_code = shader_code_count, file_lines_count = 0;
     
-	//copy file into memory
-	enum {
-		  flag_write_to_out_of_extra_block_area = 0x01
-		, flag_extra_block_marker_was_found = 0x02
-	};
-	
-	unsigned char flags = flag_write_to_out_of_extra_block_area;
-	
-	GLuint out_of_extra_block_counter = 0, start_shader_code = shader_code_count, file_lines_count = 0;
-	
-	while(NULL != fgets((char *)buff, 1024, file)
-		  && shader_code_count < (LL_ARRAY_SIZE(shader_code_text) - LL_ARRAY_SIZE(extra_code_text)))
-	{
-		file_lines_count++;
-
-		bool extra_block_area_found = NULL != strstr((const char*)buff, "[EXTRA_CODE_HERE]");
-		
-		if(extra_block_area_found && !(flag_extra_block_marker_was_found & flags))
-		{
-			if(!(flag_write_to_out_of_extra_block_area & flags))
-			{
-				//shift
-				for(GLuint to = start_shader_code, from = extra_code_count + start_shader_code;
-					from < shader_code_count; ++to, ++from)
-				{
-					shader_code_text[to] = shader_code_text[from];
-				}
-				
-				shader_code_count -= extra_code_count;
-			}
-		  
-			//copy extra code
-			for(GLuint n = 0; n < extra_code_count
-				&& shader_code_count < (LL_ARRAY_SIZE(shader_code_text) - LL_ARRAY_SIZE(extra_code_text)); ++n)
-			{
-				shader_code_text[shader_code_count++] = extra_code_text[n];
-			}
-			
-			extra_code_count = 0;
-			
-			flags &= ~flag_write_to_out_of_extra_block_area;
-			flags |= flag_extra_block_marker_was_found;
-		}
+    while(NULL != fgets((char *)buff, 1024, file)
+          && shader_code_count < (LL_ARRAY_SIZE(shader_code_text) - LL_ARRAY_SIZE(extra_code_text)))
+    {
+        file_lines_count++;
+
+        bool extra_block_area_found = NULL != strstr((const char*)buff, "[EXTRA_CODE_HERE]");
+        
+        if(extra_block_area_found && !(flag_extra_block_marker_was_found & flags))
+        {
+            if(!(flag_write_to_out_of_extra_block_area & flags))
+            {
+                //shift
+                for(GLuint to = start_shader_code, from = extra_code_count + start_shader_code;
+                    from < shader_code_count; ++to, ++from)
+                {
+                    shader_code_text[to] = shader_code_text[from];
+                }
+                
+                shader_code_count -= extra_code_count;
+            }
+          
+            //copy extra code
+            for(GLuint n = 0; n < extra_code_count
+                && shader_code_count < (LL_ARRAY_SIZE(shader_code_text) - LL_ARRAY_SIZE(extra_code_text)); ++n)
+            {
+                shader_code_text[shader_code_count++] = extra_code_text[n];
+            }
+            
+            extra_code_count = 0;
+            
+            flags &= ~flag_write_to_out_of_extra_block_area;
+            flags |= flag_extra_block_marker_was_found;
+        }
         else
         {
             shader_code_text[shader_code_count] = (GLcharARB *)strdup((char *)buff);
-		
+        
             if(flag_write_to_out_of_extra_block_area & flags)
             {
                 shader_code_text[extra_code_count + start_shader_code + out_of_extra_block_counter]
                     = shader_code_text[shader_code_count];
                 out_of_extra_block_counter++;
-			
+            
                 if(out_of_extra_block_counter == extra_code_count)
                 {
                     shader_code_count += extra_code_count;
                     flags &= ~flag_write_to_out_of_extra_block_area;
                 }
             }
-		
+        
             ++shader_code_count;
-		}
-	} //while
-	
-	if(!(flag_extra_block_marker_was_found & flags))
-	{
-		for(GLuint n = start_shader_code; n < extra_code_count + start_shader_code; ++n)
-		{
-			shader_code_text[n] = extra_code_text[n - start_shader_code];
-		}
-		
-		if (file_lines_count < extra_code_count)
-		{
-			shader_code_count += extra_code_count;
-		}
-
-		extra_code_count = 0;
-	}
-
-	fclose(file);
-
-	//create shader object
-	GLhandleARB ret = glCreateShaderObjectARB(type);
-	if (gDebugGL)
-	{
-		error = glGetError();
-		if (error != GL_NO_ERROR)
-		{
-			LL_WARNS("ShaderLoading") << "GL ERROR in glCreateShaderObjectARB: " << error << LL_ENDL;
-		}
-	}
-	
-	//load source
-	glShaderSourceARB(ret, shader_code_count, (const GLcharARB**) shader_code_text, NULL);
-
-	if (gDebugGL)
-	{
-		error = glGetError();
-		if (error != GL_NO_ERROR)
-		{
-			LL_WARNS("ShaderLoading") << "GL ERROR in glShaderSourceARB: " << error << LL_ENDL;
-		}
-	}
-
-	//compile source
-	glCompileShaderARB(ret);
-
-	if (gDebugGL)
-	{
-		error = glGetError();
-		if (error != GL_NO_ERROR)
-		{
-			LL_WARNS("ShaderLoading") << "GL ERROR in glCompileShaderARB: " << error << LL_ENDL;
-		}
-	}
-		
-	if (error == GL_NO_ERROR)
-	{
-		//check for errors
-		GLint success = GL_TRUE;
-		glGetObjectParameterivARB(ret, GL_OBJECT_COMPILE_STATUS_ARB, &success);
-		if (gDebugGL || success == GL_FALSE)
-		{
-			error = glGetError();
-			if (error != GL_NO_ERROR || success == GL_FALSE) 
-			{
-				//an error occured, print log
-				LL_WARNS("ShaderLoading") << "GLSL Compilation Error:" << LL_ENDL;
-				dumpObjectLog(ret, TRUE, open_file_name);
+        }
+    } //while
+    
+    if(!(flag_extra_block_marker_was_found & flags))
+    {
+        for(GLuint n = start_shader_code; n < extra_code_count + start_shader_code; ++n)
+        {
+            shader_code_text[n] = extra_code_text[n - start_shader_code];
+        }
+        
+        if (file_lines_count < extra_code_count)
+        {
+            shader_code_count += extra_code_count;
+        }
+
+        extra_code_count = 0;
+    }
+
+    fclose(file);
+
+    //create shader object
+    GLhandleARB ret = glCreateShaderObjectARB(type);
+    if (gDebugGL)
+    {
+        error = glGetError();
+        if (error != GL_NO_ERROR)
+        {
+            LL_WARNS("ShaderLoading") << "GL ERROR in glCreateShaderObjectARB: " << error << LL_ENDL;
+        }
+    }
+    
+    //load source
+    glShaderSourceARB(ret, shader_code_count, (const GLcharARB**) shader_code_text, NULL);
+
+    if (gDebugGL)
+    {
+        error = glGetError();
+        if (error != GL_NO_ERROR)
+        {
+            LL_WARNS("ShaderLoading") << "GL ERROR in glShaderSourceARB: " << error << LL_ENDL;
+        }
+    }
+
+    //compile source
+    glCompileShaderARB(ret);
+
+    if (gDebugGL)
+    {
+        error = glGetError();
+        if (error != GL_NO_ERROR)
+        {
+            LL_WARNS("ShaderLoading") << "GL ERROR in glCompileShaderARB: " << error << LL_ENDL;
+        }
+    }
+        
+    if (error == GL_NO_ERROR)
+    {
+        //check for errors
+        GLint success = GL_TRUE;
+        glGetObjectParameterivARB(ret, GL_OBJECT_COMPILE_STATUS_ARB, &success);
+        if (gDebugGL || success == GL_FALSE)
+        {
+            error = glGetError();
+            if (error != GL_NO_ERROR || success == GL_FALSE) 
+            {
+                //an error occured, print log
+                LL_WARNS("ShaderLoading") << "GLSL Compilation Error:" << LL_ENDL;
+                dumpObjectLog(ret, TRUE, open_file_name);
                 dumpShaderSource(shader_code_count, shader_code_text);
-				ret = 0;
-			}
-		}
-	}
-	else
-	{
-		ret = 0;
-	}
-	stop_glerror();
-
-	//free memory
-	for (GLuint i = 0; i < shader_code_count; i++)
-	{
-		free(shader_code_text[i]);
-	}
-
-	//successfully loaded, save results
-	if (ret)
-	{
-		// Add shader file to map
-		mShaderObjects[filename] = ret;
-		shader_level = try_gpu_class;
-	}
-	else
-	{
-		if (shader_level > 1)
-		{
-			shader_level--;
-			return loadShaderFile(filename, shader_level, type, defines, texture_index_channels);
-		}
-		LL_WARNS("ShaderLoading") << "Failed to load " << filename << LL_ENDL;	
-	}
-	return ret;
+                ret = 0;
+            }
+        }
+    }
+    else
+    {
+        ret = 0;
+    }
+    stop_glerror();
+
+    //free memory
+    for (GLuint i = 0; i < shader_code_count; i++)
+    {
+        free(shader_code_text[i]);
+    }
+
+    //successfully loaded, save results
+    if (ret)
+    {
+        // Add shader file to map
+        mShaderObjects[filename] = ret;
+        shader_level = try_gpu_class;
+    }
+    else
+    {
+        if (shader_level > 1)
+        {
+            shader_level--;
+            return loadShaderFile(filename, shader_level, type, defines, texture_index_channels);
+        }
+        LL_WARNS("ShaderLoading") << "Failed to load " << filename << LL_ENDL;  
+    }
+    return ret;
 }
 
 BOOL LLShaderMgr::linkProgramObject(GLhandleARB obj, BOOL suppress_errors) 
 {
-	//check for errors
-	glLinkProgramARB(obj);
-	GLint success = GL_TRUE;
-	glGetObjectParameterivARB(obj, GL_OBJECT_LINK_STATUS_ARB, &success);
-	if (!suppress_errors && success == GL_FALSE) 
-	{
-		//an error occured, print log
-		LL_SHADER_LOADING_WARNS() << "GLSL Linker Error:" << LL_ENDL;
-	}
+    //check for errors
+    glLinkProgramARB(obj);
+    GLint success = GL_TRUE;
+    glGetObjectParameterivARB(obj, GL_OBJECT_LINK_STATUS_ARB, &success);
+    if (!suppress_errors && success == GL_FALSE) 
+    {
+        //an error occured, print log
+        LL_SHADER_LOADING_WARNS() << "GLSL Linker Error:" << LL_ENDL;
+    }
 
 #if LL_DARWIN
 
-	// For some reason this absolutely kills the frame rate when VBO's are enabled
-	if (0)
-	{
-		// Force an evaluation of the gl state so the driver can tell if the shader will run in hardware or software
-		// per Apple's suggestion
-		LLGLSLShader::sNoFixedFunction = false;
-		
-		glUseProgramObjectARB(obj);
-
-		gGL.begin(LLRender::TRIANGLES);
-		gGL.vertex3f(0.0f, 0.0f, 0.0f);
-		gGL.vertex3f(0.0f, 0.0f, 0.0f);
-		gGL.vertex3f(0.0f, 0.0f, 0.0f);
-		gGL.end();
-		gGL.flush();
-		
-		glUseProgramObjectARB(0);
-		
-		LLGLSLShader::sNoFixedFunction = true;
-
-		// Query whether the shader can or cannot run in hardware
-		// http://developer.apple.com/qa/qa2007/qa1502.html
-		GLint vertexGPUProcessing, fragmentGPUProcessing;
-		CGLContextObj ctx = CGLGetCurrentContext();
-		CGLGetParameter(ctx, kCGLCPGPUVertexProcessing, &vertexGPUProcessing);	
-		CGLGetParameter(ctx, kCGLCPGPUFragmentProcessing, &fragmentGPUProcessing);
-		if (!fragmentGPUProcessing || !vertexGPUProcessing)
-		{
-			LL_SHADER_LOADING_WARNS() << "GLSL Linker: Running in Software:" << LL_ENDL;
-			success = GL_FALSE;
-			suppress_errors = FALSE;		
-		}
-	}
+    // For some reason this absolutely kills the frame rate when VBO's are enabled
+    if (0)
+    {
+        // Force an evaluation of the gl state so the driver can tell if the shader will run in hardware or software
+        // per Apple's suggestion
+        LLGLSLShader::sNoFixedFunction = false;
+        
+        glUseProgramObjectARB(obj);
+
+        gGL.begin(LLRender::TRIANGLES);
+        gGL.vertex3f(0.0f, 0.0f, 0.0f);
+        gGL.vertex3f(0.0f, 0.0f, 0.0f);
+        gGL.vertex3f(0.0f, 0.0f, 0.0f);
+        gGL.end();
+        gGL.flush();
+        
+        glUseProgramObjectARB(0);
+        
+        LLGLSLShader::sNoFixedFunction = true;
+
+        // Query whether the shader can or cannot run in hardware
+        // http://developer.apple.com/qa/qa2007/qa1502.html
+        GLint vertexGPUProcessing, fragmentGPUProcessing;
+        CGLContextObj ctx = CGLGetCurrentContext();
+        CGLGetParameter(ctx, kCGLCPGPUVertexProcessing, &vertexGPUProcessing);  
+        CGLGetParameter(ctx, kCGLCPGPUFragmentProcessing, &fragmentGPUProcessing);
+        if (!fragmentGPUProcessing || !vertexGPUProcessing)
+        {
+            LL_SHADER_LOADING_WARNS() << "GLSL Linker: Running in Software:" << LL_ENDL;
+            success = GL_FALSE;
+            suppress_errors = FALSE;        
+        }
+    }
 
 #else
-	std::string log = get_object_log(obj);
-	LLStringUtil::toLower(log);
-	if (log.find("software") != std::string::npos)
-	{
-		LL_SHADER_LOADING_WARNS() << "GLSL Linker: Running in Software:" << LL_ENDL;
-		success = GL_FALSE;
-		suppress_errors = FALSE;
-	}
+    std::string log = get_object_log(obj);
+    LLStringUtil::toLower(log);
+    if (log.find("software") != std::string::npos)
+    {
+        LL_SHADER_LOADING_WARNS() << "GLSL Linker: Running in Software:" << LL_ENDL;
+        success = GL_FALSE;
+        suppress_errors = FALSE;
+    }
 #endif
-	return success;
+    return success;
 }
 
 BOOL LLShaderMgr::validateProgramObject(GLhandleARB obj)
 {
-	//check program validity against current GL
-	glValidateProgramARB(obj);
-	GLint success = GL_TRUE;
-	glGetObjectParameterivARB(obj, GL_OBJECT_VALIDATE_STATUS_ARB, &success);
-	if (success == GL_FALSE)
-	{
-		LL_SHADER_LOADING_WARNS() << "GLSL program not valid: " << LL_ENDL;
-		dumpObjectLog(obj);
-	}
-	else
-	{
-		dumpObjectLog(obj, FALSE);
-	}
-
-	return success;
+    //check program validity against current GL
+    glValidateProgramARB(obj);
+    GLint success = GL_TRUE;
+    glGetObjectParameterivARB(obj, GL_OBJECT_VALIDATE_STATUS_ARB, &success);
+    if (success == GL_FALSE)
+    {
+        LL_SHADER_LOADING_WARNS() << "GLSL program not valid: " << LL_ENDL;
+        dumpObjectLog(obj);
+    }
+    else
+    {
+        dumpObjectLog(obj, FALSE);
+    }
+
+    return success;
 }
 
 //virtual
 void LLShaderMgr::initAttribsAndUniforms()
 {
-	//MUST match order of enum in LLVertexBuffer.h
-	mReservedAttribs.push_back("position");
-	mReservedAttribs.push_back("normal");
-	mReservedAttribs.push_back("texcoord0");
-	mReservedAttribs.push_back("texcoord1");
-	mReservedAttribs.push_back("texcoord2");
-	mReservedAttribs.push_back("texcoord3");
-	mReservedAttribs.push_back("diffuse_color");
-	mReservedAttribs.push_back("emissive");
-	mReservedAttribs.push_back("tangent");
-	mReservedAttribs.push_back("weight");
-	mReservedAttribs.push_back("weight4");
-	mReservedAttribs.push_back("clothing");
-	mReservedAttribs.push_back("texture_index");
-	
-	//matrix state
-	mReservedUniforms.push_back("modelview_matrix");
-	mReservedUniforms.push_back("projection_matrix");
-	mReservedUniforms.push_back("inv_proj");
-	mReservedUniforms.push_back("modelview_projection_matrix");
+    //MUST match order of enum in LLVertexBuffer.h
+    mReservedAttribs.push_back("position");
+    mReservedAttribs.push_back("normal");
+    mReservedAttribs.push_back("texcoord0");
+    mReservedAttribs.push_back("texcoord1");
+    mReservedAttribs.push_back("texcoord2");
+    mReservedAttribs.push_back("texcoord3");
+    mReservedAttribs.push_back("diffuse_color");
+    mReservedAttribs.push_back("emissive");
+    mReservedAttribs.push_back("tangent");
+    mReservedAttribs.push_back("weight");
+    mReservedAttribs.push_back("weight4");
+    mReservedAttribs.push_back("clothing");
+    mReservedAttribs.push_back("texture_index");
+    
+    //matrix state
+    mReservedUniforms.push_back("modelview_matrix");
+    mReservedUniforms.push_back("projection_matrix");
+    mReservedUniforms.push_back("inv_proj");
+    mReservedUniforms.push_back("modelview_projection_matrix");
     mReservedUniforms.push_back("inv_modelview");
-	mReservedUniforms.push_back("normal_matrix");
-	mReservedUniforms.push_back("texture_matrix0");
-	mReservedUniforms.push_back("texture_matrix1");
-	mReservedUniforms.push_back("texture_matrix2");
-	mReservedUniforms.push_back("texture_matrix3");
-	mReservedUniforms.push_back("object_plane_s");
-	mReservedUniforms.push_back("object_plane_t");
-	llassert(mReservedUniforms.size() == LLShaderMgr::OBJECT_PLANE_T+1);
-
-	mReservedUniforms.push_back("viewport");
-
-	mReservedUniforms.push_back("light_position");
-	mReservedUniforms.push_back("light_direction");
-	mReservedUniforms.push_back("light_attenuation");
-	mReservedUniforms.push_back("light_diffuse");
-	mReservedUniforms.push_back("light_ambient");
-	mReservedUniforms.push_back("light_count");
-	mReservedUniforms.push_back("light");
-	mReservedUniforms.push_back("light_col");
-	mReservedUniforms.push_back("far_z");
-
-	llassert(mReservedUniforms.size() == LLShaderMgr::MULTI_LIGHT_FAR_Z+1);
-
-
-	mReservedUniforms.push_back("proj_mat");
-	mReservedUniforms.push_back("proj_near");
-	mReservedUniforms.push_back("proj_p");
-	mReservedUniforms.push_back("proj_n");
-	mReservedUniforms.push_back("proj_origin");
-	mReservedUniforms.push_back("proj_range");
-	mReservedUniforms.push_back("proj_ambiance");
-	mReservedUniforms.push_back("proj_shadow_idx");
-	mReservedUniforms.push_back("shadow_fade");
-	mReservedUniforms.push_back("proj_focus");
-	mReservedUniforms.push_back("proj_lod");
-	mReservedUniforms.push_back("proj_ambient_lod");
-
-	llassert(mReservedUniforms.size() == LLShaderMgr::PROJECTOR_AMBIENT_LOD+1);
-
-	mReservedUniforms.push_back("color");
-		
-	mReservedUniforms.push_back("diffuseMap");
+    mReservedUniforms.push_back("normal_matrix");
+    mReservedUniforms.push_back("texture_matrix0");
+    mReservedUniforms.push_back("texture_matrix1");
+    mReservedUniforms.push_back("texture_matrix2");
+    mReservedUniforms.push_back("texture_matrix3");
+    mReservedUniforms.push_back("object_plane_s");
+    mReservedUniforms.push_back("object_plane_t");
+    llassert(mReservedUniforms.size() == LLShaderMgr::OBJECT_PLANE_T+1);
+
+    mReservedUniforms.push_back("viewport");
+
+    mReservedUniforms.push_back("light_position");
+    mReservedUniforms.push_back("light_direction");
+    mReservedUniforms.push_back("light_attenuation");
+    mReservedUniforms.push_back("light_diffuse");
+    mReservedUniforms.push_back("light_ambient");
+    mReservedUniforms.push_back("light_count");
+    mReservedUniforms.push_back("light");
+    mReservedUniforms.push_back("light_col");
+    mReservedUniforms.push_back("far_z");
+
+    llassert(mReservedUniforms.size() == LLShaderMgr::MULTI_LIGHT_FAR_Z+1);
+
+
+    mReservedUniforms.push_back("proj_mat");
+    mReservedUniforms.push_back("proj_near");
+    mReservedUniforms.push_back("proj_p");
+    mReservedUniforms.push_back("proj_n");
+    mReservedUniforms.push_back("proj_origin");
+    mReservedUniforms.push_back("proj_range");
+    mReservedUniforms.push_back("proj_ambiance");
+    mReservedUniforms.push_back("proj_shadow_idx");
+    mReservedUniforms.push_back("shadow_fade");
+    mReservedUniforms.push_back("proj_focus");
+    mReservedUniforms.push_back("proj_lod");
+    mReservedUniforms.push_back("proj_ambient_lod");
+
+    llassert(mReservedUniforms.size() == LLShaderMgr::PROJECTOR_AMBIENT_LOD+1);
+
+    mReservedUniforms.push_back("color");
+        
+    mReservedUniforms.push_back("diffuseMap");
     mReservedUniforms.push_back("altDiffuseMap");
-	mReservedUniforms.push_back("specularMap");
-	mReservedUniforms.push_back("bumpMap");
+    mReservedUniforms.push_back("specularMap");
+    mReservedUniforms.push_back("bumpMap");
     mReservedUniforms.push_back("bumpMap2");
-	mReservedUniforms.push_back("environmentMap");
-	mReservedUniforms.push_back("cloud_noise_texture");
+    mReservedUniforms.push_back("environmentMap");
+    mReservedUniforms.push_back("cloud_noise_texture");
     mReservedUniforms.push_back("cloud_noise_texture_next");
-	mReservedUniforms.push_back("fullbright");
-	mReservedUniforms.push_back("lightnorm");
-	mReservedUniforms.push_back("sunlight_color");
-	mReservedUniforms.push_back("ambient");
-	mReservedUniforms.push_back("blue_horizon");
-	mReservedUniforms.push_back("blue_density");
-	mReservedUniforms.push_back("haze_horizon");
-	mReservedUniforms.push_back("haze_density");
-	mReservedUniforms.push_back("cloud_shadow");
-	mReservedUniforms.push_back("density_multiplier");
-	mReservedUniforms.push_back("distance_multiplier");
-	mReservedUniforms.push_back("max_y");
-	mReservedUniforms.push_back("glow");
-	mReservedUniforms.push_back("cloud_color");
-	mReservedUniforms.push_back("cloud_pos_density1");
-	mReservedUniforms.push_back("cloud_pos_density2");
-	mReservedUniforms.push_back("cloud_scale");
-	mReservedUniforms.push_back("gamma");
-	mReservedUniforms.push_back("scene_light_strength");
-
-	llassert(mReservedUniforms.size() == LLShaderMgr::SCENE_LIGHT_STRENGTH+1);
-
-	mReservedUniforms.push_back("center");
-	mReservedUniforms.push_back("size");
-	mReservedUniforms.push_back("falloff");
-
-	mReservedUniforms.push_back("box_center");
-	mReservedUniforms.push_back("box_size");
-
-
-	mReservedUniforms.push_back("minLuminance");
-	mReservedUniforms.push_back("maxExtractAlpha");
-	mReservedUniforms.push_back("lumWeights");
-	mReservedUniforms.push_back("warmthWeights");
-	mReservedUniforms.push_back("warmthAmount");
-	mReservedUniforms.push_back("glowStrength");
-	mReservedUniforms.push_back("glowDelta");
-
-	llassert(mReservedUniforms.size() == LLShaderMgr::GLOW_DELTA+1);
-
-
-	mReservedUniforms.push_back("minimum_alpha");
-	mReservedUniforms.push_back("emissive_brightness");
-
-	mReservedUniforms.push_back("shadow_matrix");
-	mReservedUniforms.push_back("env_mat");
-	mReservedUniforms.push_back("shadow_clip");
-	mReservedUniforms.push_back("sun_wash");
-	mReservedUniforms.push_back("shadow_noise");
-	mReservedUniforms.push_back("blur_size");
-	mReservedUniforms.push_back("ssao_radius");
-	mReservedUniforms.push_back("ssao_max_radius");
-	mReservedUniforms.push_back("ssao_factor");
-	mReservedUniforms.push_back("ssao_factor_inv");
-	mReservedUniforms.push_back("ssao_effect_mat");
-	mReservedUniforms.push_back("screen_res");
-	mReservedUniforms.push_back("near_clip");
-	mReservedUniforms.push_back("shadow_offset");
-	mReservedUniforms.push_back("shadow_bias");
-	mReservedUniforms.push_back("spot_shadow_bias");
-	mReservedUniforms.push_back("spot_shadow_offset");
-	mReservedUniforms.push_back("sun_dir");
+    mReservedUniforms.push_back("fullbright");
+    mReservedUniforms.push_back("lightnorm");
+    mReservedUniforms.push_back("sunlight_color");
+    mReservedUniforms.push_back("ambient");
+    mReservedUniforms.push_back("blue_horizon");
+    mReservedUniforms.push_back("blue_density");
+    mReservedUniforms.push_back("haze_horizon");
+    mReservedUniforms.push_back("haze_density");
+    mReservedUniforms.push_back("cloud_shadow");
+    mReservedUniforms.push_back("density_multiplier");
+    mReservedUniforms.push_back("distance_multiplier");
+    mReservedUniforms.push_back("max_y");
+    mReservedUniforms.push_back("glow");
+    mReservedUniforms.push_back("cloud_color");
+    mReservedUniforms.push_back("cloud_pos_density1");
+    mReservedUniforms.push_back("cloud_pos_density2");
+    mReservedUniforms.push_back("cloud_scale");
+    mReservedUniforms.push_back("gamma");
+    mReservedUniforms.push_back("scene_light_strength");
+
+    llassert(mReservedUniforms.size() == LLShaderMgr::SCENE_LIGHT_STRENGTH+1);
+
+    mReservedUniforms.push_back("center");
+    mReservedUniforms.push_back("size");
+    mReservedUniforms.push_back("falloff");
+
+    mReservedUniforms.push_back("box_center");
+    mReservedUniforms.push_back("box_size");
+
+
+    mReservedUniforms.push_back("minLuminance");
+    mReservedUniforms.push_back("maxExtractAlpha");
+    mReservedUniforms.push_back("lumWeights");
+    mReservedUniforms.push_back("warmthWeights");
+    mReservedUniforms.push_back("warmthAmount");
+    mReservedUniforms.push_back("glowStrength");
+    mReservedUniforms.push_back("glowDelta");
+
+    llassert(mReservedUniforms.size() == LLShaderMgr::GLOW_DELTA+1);
+
+
+    mReservedUniforms.push_back("minimum_alpha");
+    mReservedUniforms.push_back("emissive_brightness");
+
+    mReservedUniforms.push_back("shadow_matrix");
+    mReservedUniforms.push_back("env_mat");
+    mReservedUniforms.push_back("shadow_clip");
+    mReservedUniforms.push_back("sun_wash");
+    mReservedUniforms.push_back("shadow_noise");
+    mReservedUniforms.push_back("blur_size");
+    mReservedUniforms.push_back("ssao_radius");
+    mReservedUniforms.push_back("ssao_max_radius");
+    mReservedUniforms.push_back("ssao_factor");
+    mReservedUniforms.push_back("ssao_factor_inv");
+    mReservedUniforms.push_back("ssao_effect_mat");
+    mReservedUniforms.push_back("screen_res");
+    mReservedUniforms.push_back("near_clip");
+    mReservedUniforms.push_back("shadow_offset");
+    mReservedUniforms.push_back("shadow_bias");
+    mReservedUniforms.push_back("spot_shadow_bias");
+    mReservedUniforms.push_back("spot_shadow_offset");
+    mReservedUniforms.push_back("sun_dir");
     mReservedUniforms.push_back("moon_dir");
-	mReservedUniforms.push_back("shadow_res");
-	mReservedUniforms.push_back("proj_shadow_res");
-	mReservedUniforms.push_back("depth_cutoff");
-	mReservedUniforms.push_back("norm_cutoff");
-	mReservedUniforms.push_back("shadow_target_width");
-	
-	llassert(mReservedUniforms.size() == LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH+1);
-
-	mReservedUniforms.push_back("tc_scale");
-	mReservedUniforms.push_back("rcp_screen_res");
-	mReservedUniforms.push_back("rcp_frame_opt");
-	mReservedUniforms.push_back("rcp_frame_opt2");
-	
-	mReservedUniforms.push_back("focal_distance");
-	mReservedUniforms.push_back("blur_constant");
-	mReservedUniforms.push_back("tan_pixel_angle");
-	mReservedUniforms.push_back("magnification");
-	mReservedUniforms.push_back("max_cof");
-	mReservedUniforms.push_back("res_scale");
-	mReservedUniforms.push_back("dof_width");
-	mReservedUniforms.push_back("dof_height");
-
-	mReservedUniforms.push_back("depthMap");
-	mReservedUniforms.push_back("shadowMap0");
-	mReservedUniforms.push_back("shadowMap1");
-	mReservedUniforms.push_back("shadowMap2");
-	mReservedUniforms.push_back("shadowMap3");
-	mReservedUniforms.push_back("shadowMap4");
-	mReservedUniforms.push_back("shadowMap5");
-
-	llassert(mReservedUniforms.size() == LLShaderMgr::DEFERRED_SHADOW5+1);
-
-	mReservedUniforms.push_back("normalMap");
-	mReservedUniforms.push_back("positionMap");
-	mReservedUniforms.push_back("diffuseRect");
-	mReservedUniforms.push_back("specularRect");
-	mReservedUniforms.push_back("noiseMap");
-	mReservedUniforms.push_back("lightFunc");
-	mReservedUniforms.push_back("lightMap");
-	mReservedUniforms.push_back("bloomMap");
-	mReservedUniforms.push_back("projectionMap");
-	mReservedUniforms.push_back("norm_mat");
-
-	mReservedUniforms.push_back("global_gamma");
-	mReservedUniforms.push_back("texture_gamma");
-	
-	mReservedUniforms.push_back("specular_color");
-	mReservedUniforms.push_back("env_intensity");
-
-	mReservedUniforms.push_back("matrixPalette");
-	mReservedUniforms.push_back("translationPalette");
-	
-	mReservedUniforms.push_back("screenTex");
-	mReservedUniforms.push_back("screenDepth");
-	mReservedUniforms.push_back("refTex");
-	mReservedUniforms.push_back("eyeVec");
-	mReservedUniforms.push_back("time");
-	mReservedUniforms.push_back("waveDir1");
-	mReservedUniforms.push_back("waveDir2");
-	mReservedUniforms.push_back("lightDir");
-	mReservedUniforms.push_back("specular");
-	mReservedUniforms.push_back("lightExp");
-	mReservedUniforms.push_back("waterFogColor");
-	mReservedUniforms.push_back("waterFogDensity");
-	mReservedUniforms.push_back("waterFogKS");
-	mReservedUniforms.push_back("refScale");
-	mReservedUniforms.push_back("waterHeight");
-	mReservedUniforms.push_back("waterPlane");
-	mReservedUniforms.push_back("normScale");
-	mReservedUniforms.push_back("fresnelScale");
-	mReservedUniforms.push_back("fresnelOffset");
-	mReservedUniforms.push_back("blurMultiplier");
-	mReservedUniforms.push_back("sunAngle");
-	mReservedUniforms.push_back("scaledAngle");
-	mReservedUniforms.push_back("sunAngle2");
-	
-	mReservedUniforms.push_back("camPosLocal");
-
-	mReservedUniforms.push_back("gWindDir");
-	mReservedUniforms.push_back("gSinWaveParams");
-	mReservedUniforms.push_back("gGravity");
-
-	mReservedUniforms.push_back("detail_0");
-	mReservedUniforms.push_back("detail_1");
-	mReservedUniforms.push_back("detail_2");
-	mReservedUniforms.push_back("detail_3");
-	mReservedUniforms.push_back("alpha_ramp");
-
-	mReservedUniforms.push_back("origin");
-	mReservedUniforms.push_back("display_gamma");
+    mReservedUniforms.push_back("shadow_res");
+    mReservedUniforms.push_back("proj_shadow_res");
+    mReservedUniforms.push_back("depth_cutoff");
+    mReservedUniforms.push_back("norm_cutoff");
+    mReservedUniforms.push_back("shadow_target_width");
+    
+    llassert(mReservedUniforms.size() == LLShaderMgr::DEFERRED_SHADOW_TARGET_WIDTH+1);
+
+    mReservedUniforms.push_back("tc_scale");
+    mReservedUniforms.push_back("rcp_screen_res");
+    mReservedUniforms.push_back("rcp_frame_opt");
+    mReservedUniforms.push_back("rcp_frame_opt2");
+    
+    mReservedUniforms.push_back("focal_distance");
+    mReservedUniforms.push_back("blur_constant");
+    mReservedUniforms.push_back("tan_pixel_angle");
+    mReservedUniforms.push_back("magnification");
+    mReservedUniforms.push_back("max_cof");
+    mReservedUniforms.push_back("res_scale");
+    mReservedUniforms.push_back("dof_width");
+    mReservedUniforms.push_back("dof_height");
+
+    mReservedUniforms.push_back("depthMap");
+    mReservedUniforms.push_back("shadowMap0");
+    mReservedUniforms.push_back("shadowMap1");
+    mReservedUniforms.push_back("shadowMap2");
+    mReservedUniforms.push_back("shadowMap3");
+    mReservedUniforms.push_back("shadowMap4");
+    mReservedUniforms.push_back("shadowMap5");
+
+    llassert(mReservedUniforms.size() == LLShaderMgr::DEFERRED_SHADOW5+1);
+
+    mReservedUniforms.push_back("normalMap");
+    mReservedUniforms.push_back("positionMap");
+    mReservedUniforms.push_back("diffuseRect");
+    mReservedUniforms.push_back("specularRect");
+    mReservedUniforms.push_back("noiseMap");
+    mReservedUniforms.push_back("lightFunc");
+    mReservedUniforms.push_back("lightMap");
+    mReservedUniforms.push_back("bloomMap");
+    mReservedUniforms.push_back("projectionMap");
+    mReservedUniforms.push_back("norm_mat");
+
+    mReservedUniforms.push_back("global_gamma");
+    mReservedUniforms.push_back("texture_gamma");
+    
+    mReservedUniforms.push_back("specular_color");
+    mReservedUniforms.push_back("env_intensity");
+
+    mReservedUniforms.push_back("matrixPalette");
+    mReservedUniforms.push_back("translationPalette");
+    
+    mReservedUniforms.push_back("screenTex");
+    mReservedUniforms.push_back("screenDepth");
+    mReservedUniforms.push_back("refTex");
+    mReservedUniforms.push_back("eyeVec");
+    mReservedUniforms.push_back("time");
+    mReservedUniforms.push_back("waveDir1");
+    mReservedUniforms.push_back("waveDir2");
+    mReservedUniforms.push_back("lightDir");
+    mReservedUniforms.push_back("specular");
+    mReservedUniforms.push_back("lightExp");
+    mReservedUniforms.push_back("waterFogColor");
+    mReservedUniforms.push_back("waterFogDensity");
+    mReservedUniforms.push_back("waterFogKS");
+    mReservedUniforms.push_back("refScale");
+    mReservedUniforms.push_back("waterHeight");
+    mReservedUniforms.push_back("waterPlane");
+    mReservedUniforms.push_back("normScale");
+    mReservedUniforms.push_back("fresnelScale");
+    mReservedUniforms.push_back("fresnelOffset");
+    mReservedUniforms.push_back("blurMultiplier");
+    mReservedUniforms.push_back("sunAngle");
+    mReservedUniforms.push_back("scaledAngle");
+    mReservedUniforms.push_back("sunAngle2");
+    
+    mReservedUniforms.push_back("camPosLocal");
+
+    mReservedUniforms.push_back("gWindDir");
+    mReservedUniforms.push_back("gSinWaveParams");
+    mReservedUniforms.push_back("gGravity");
+
+    mReservedUniforms.push_back("detail_0");
+    mReservedUniforms.push_back("detail_1");
+    mReservedUniforms.push_back("detail_2");
+    mReservedUniforms.push_back("detail_3");
+    mReservedUniforms.push_back("alpha_ramp");
+
+    mReservedUniforms.push_back("origin");
+    mReservedUniforms.push_back("display_gamma");
 
     mReservedUniforms.push_back("inscatter");
     mReservedUniforms.push_back("sun_size");
@@ -1350,17 +1350,17 @@ void LLShaderMgr::initAttribsAndUniforms()
     mReservedUniforms.push_back("sun_up_factor");
     mReservedUniforms.push_back("moonlight_color");
 
-	llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS);
+    llassert(mReservedUniforms.size() == END_RESERVED_UNIFORMS);
 
-	std::set<std::string> dupe_check;
+    std::set<std::string> dupe_check;
 
-	for (U32 i = 0; i < mReservedUniforms.size(); ++i)
-	{
-		if (dupe_check.find(mReservedUniforms[i]) != dupe_check.end())
-		{
-			LL_ERRS() << "Duplicate reserved uniform name found: " << mReservedUniforms[i] << LL_ENDL;
-		}
-		dupe_check.insert(mReservedUniforms[i]);
-	}
+    for (U32 i = 0; i < mReservedUniforms.size(); ++i)
+    {
+        if (dupe_check.find(mReservedUniforms[i]) != dupe_check.end())
+        {
+            LL_ERRS() << "Duplicate reserved uniform name found: " << mReservedUniforms[i] << LL_ENDL;
+        }
+        dupe_check.insert(mReservedUniforms[i]);
+    }
 }
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
index dd691fb36b0..5f4f1677d78 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl
@@ -301,7 +301,8 @@ void main()
     ambient *= ambient;
     ambient = 1.0 - ambient * smoothstep(0.0, 0.3, shadow);
 
-    vec3 sun_contrib = min(da, shadow) * sunlit;
+    float final_da = min(da, shadow);
+    vec3 sun_contrib = final_da * sunlit;
    
     col.rgb *= ambient;
     col.rgb += sun_contrib;
@@ -314,7 +315,7 @@ void main()
         // the old infinite-sky shiny reflection
         //
                 
-        float sa = dot(refnormpersp, sun_dir.xyz);
+        float sa = dot(refnormpersp, light_dir.xyz);
 
         vec3 dumbshiny = sunlit*shadow*(texture2D(lightFunc, vec2(sa, spec.a)).r);
                             
@@ -351,8 +352,6 @@ vec3 post_spec = col.rgb;
     col = atmosFragLighting(col, additive, atten);
     col = scaleSoftClipFrag(col);
 
-vec3 post_atmo= col.rgb;
-
     vec3 npos = normalize(-pos.xyz);
             
     vec3 light = vec3(0,0,0);
@@ -369,8 +368,6 @@ vec3 post_atmo= col.rgb;
 
     col.rgb += light.rgb;
 
-vec3 post_lighting = col.rgb;
-
     glare = min(glare, 1.0);
     float al = max(diffcol.a,glare)*vertex_color.a;
 
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index 07a24698a98..a39a73f1b62 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -125,7 +125,7 @@ void main()
         if (spec.a > 0.0) // specular reflection
         {
             // the old infinite-sky shiny reflection
-            float sa = dot(refnormpersp, sun_dir.xyz);
+            float sa = dot(refnormpersp, light_dir.xyz);
             vec3 dumbshiny = sunlit*(texture2D(lightFunc, vec2(sa, spec.a)).r);
             
             // add the two types of shiny together
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
index d220bda332e..484c0cae3eb 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -137,8 +137,8 @@ void main()
         if (spec.a > 0.0) // specular reflection
         {
             // the old infinite-sky shiny reflection
-            float sa = dot(refnormpersp, sun_dir.xyz);
-            vec3 dumbshiny = sunlit*scol_ambocc.r*(texture2D(lightFunc, vec2(sa, spec.a)).r);
+            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;
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 6e7e8eef211..b63f5bd05ac 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -9993,14 +9993,14 @@ bool LLPipeline::getVisiblePointCloud(LLCamera& camera, LLVector3& min, LLVector
 void LLPipeline::renderHighlight(const LLViewerObject* obj, F32 fade)
 {
     BOOL shaders = canUseVertexShaders();
-	if(shaders) 
-	{
-		gHighlightProgram.bind();
-	}
-	else
-	{
-		gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
-	}
+    if(shaders) 
+    {
+        gHighlightProgram.bind();
+    }
+    else
+    {
+        gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
+    }
 
     if (obj && obj->getVolume())
     {
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index a31f880fbf6..38fb26d8115 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -53,8 +53,8 @@ class LLDrawPoolAlpha;
 
 typedef enum e_avatar_skinning_method
 {
-	SKIN_METHOD_SOFTWARE,
-	SKIN_METHOD_VERTEX_PROGRAM
+    SKIN_METHOD_SOFTWARE,
+    SKIN_METHOD_VERTEX_PROGRAM
 } EAvatarSkinningMethod;
 
 bool compute_min_max(LLMatrix4& box, LLVector2& min, LLVector2& max); // Shouldn't be defined here!
@@ -93,861 +93,861 @@ extern LLTrace::BlockTimerStatHandle FTM_RENDER_UI_SCENE_MON;
 class LLPipeline
 {
 public:
-	LLPipeline();
-	~LLPipeline();
-
-	void destroyGL();
-	void restoreGL();
-	void resetVertexBuffers();
-	void doResetVertexBuffers(bool forced = false);
-	void resizeScreenTexture();
-	void releaseGLBuffers();
-	void releaseLUTBuffers();
-	void releaseScreenBuffers();
-	void createGLBuffers();
-	void createLUTBuffers();
-
-	//allocate the largest screen buffer possible up to resX, resY
-	//returns true if full size buffer allocated, false if some other size is allocated
-	bool allocateScreenBuffer(U32 resX, U32 resY);
-
-	typedef enum {
-		FBO_SUCCESS_FULLRES = 0,
-		FBO_SUCCESS_LOWRES,
-		FBO_FAILURE
-	} eFBOStatus;
+    LLPipeline();
+    ~LLPipeline();
+
+    void destroyGL();
+    void restoreGL();
+    void resetVertexBuffers();
+    void doResetVertexBuffers(bool forced = false);
+    void resizeScreenTexture();
+    void releaseGLBuffers();
+    void releaseLUTBuffers();
+    void releaseScreenBuffers();
+    void createGLBuffers();
+    void createLUTBuffers();
+
+    //allocate the largest screen buffer possible up to resX, resY
+    //returns true if full size buffer allocated, false if some other size is allocated
+    bool allocateScreenBuffer(U32 resX, U32 resY);
+
+    typedef enum {
+        FBO_SUCCESS_FULLRES = 0,
+        FBO_SUCCESS_LOWRES,
+        FBO_FAILURE
+    } eFBOStatus;
 
 private:
-	//implementation of above, wrapped for easy error handling
-	eFBOStatus doAllocateScreenBuffer(U32 resX, U32 resY);
+    //implementation of above, wrapped for easy error handling
+    eFBOStatus doAllocateScreenBuffer(U32 resX, U32 resY);
 public:
 
-	//attempt to allocate screen buffers at resX, resY
-	//returns true if allocation successful, false otherwise
-	bool allocateScreenBuffer(U32 resX, U32 resY, U32 samples);
-
-	void allocatePhysicsBuffer();
-	
-	void resetVertexBuffers(LLDrawable* drawable);
-	void generateImpostor(LLVOAvatar* avatar);
-	void bindScreenToTexture();
-	void renderBloom(bool for_snapshot, F32 zoom_factor = 1.f, int subfield = 0);
-
-	void init();
-	void cleanup();
-	bool isInit() { return mInitialized; };
-
-	/// @brief Get a draw pool from pool type (POOL_SIMPLE, POOL_MEDIA) and texture.
-	/// @return Draw pool, or NULL if not found.
-	LLDrawPool *findPool(const U32 pool_type, LLViewerTexture *tex0 = NULL);
-
-	/// @brief Get a draw pool for faces of the appropriate type and texture.  Create if necessary.
-	/// @return Always returns a draw pool.
-	LLDrawPool *getPool(const U32 pool_type, LLViewerTexture *tex0 = NULL);
-
-	/// @brief Figures out draw pool type from texture entry. Creates pool if necessary.
-	static LLDrawPool* getPoolFromTE(const LLTextureEntry* te, LLViewerTexture* te_image);
-	static U32 getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* imagep);
-
-	void		 addPool(LLDrawPool *poolp);	// Only to be used by LLDrawPool classes for splitting pools!
-	void		 removePool( LLDrawPool* poolp );
-
-	void		 allocDrawable(LLViewerObject *obj);
-
-	void		 unlinkDrawable(LLDrawable*);
-
-	static void removeMutedAVsLights(LLVOAvatar*);
-
-	// Object related methods
-	void        markVisible(LLDrawable *drawablep, LLCamera& camera);
-	void		markOccluder(LLSpatialGroup* group);
-
-	//downsample source to dest, taking the maximum depth value per pixel in source and writing to dest
-	// if source's depth buffer cannot be bound for reading, a scratch space depth buffer must be provided
-	void		downsampleDepthBuffer(LLRenderTarget& source, LLRenderTarget& dest, LLRenderTarget* scratch_space = NULL);
-
-	// Downsample depth buffer with gather and find local min/max depth values. Writes to a 16F RG render target.
-	void		downsampleMinMaxDepthBuffer(LLRenderTarget& source, LLRenderTarget& dest, LLRenderTarget* scratch_space = NULL);
-
-	void		doOcclusion(LLCamera& camera, LLRenderTarget& source, LLRenderTarget& dest, LLRenderTarget* scratch_space = NULL);
-	void		doOcclusion(LLCamera& camera);
-	void		markNotCulled(LLSpatialGroup* group, LLCamera &camera);
-	void        markMoved(LLDrawable *drawablep, bool damped_motion = false);
-	void        markShift(LLDrawable *drawablep);
-	void        markTextured(LLDrawable *drawablep);
-	void		markGLRebuild(LLGLUpdate* glu);
-	void		markRebuild(LLSpatialGroup* group, bool priority = false);
-	void        markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag = LLDrawable::REBUILD_ALL, bool priority = false);
-	void		markPartitionMove(LLDrawable* drawablep);
-	void		markMeshDirty(LLSpatialGroup* group);
-
-	//get the object between start and end that's closest to start.
-	LLViewerObject* lineSegmentIntersectInWorld(const LLVector4a& start, const LLVector4a& end,
-												bool pick_transparent,
-												bool pick_rigged,
-												S32* face_hit,                          // return the face hit
-												LLVector4a* intersection = NULL,         // return the intersection point
-												LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
-												LLVector4a* normal = NULL,               // return the surface normal at the intersection point
-												LLVector4a* tangent = NULL             // return the surface tangent at the intersection point  
-		);
-
-	//get the closest particle to start between start and end, returns the LLVOPartGroup and particle index
-	LLVOPartGroup* lineSegmentIntersectParticle(const LLVector4a& start, const LLVector4a& end, LLVector4a* intersection,
-														S32* face_hit);
-
-
-	LLViewerObject* lineSegmentIntersectInHUD(const LLVector4a& start, const LLVector4a& end,
-											  bool pick_transparent,
-											  S32* face_hit,                          // return the face hit
-											  LLVector4a* intersection = NULL,         // return the intersection point
-											  LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
-											  LLVector4a* normal = NULL,               // return the surface normal at the intersection point
-											  LLVector4a* tangent = NULL             // return the surface tangent at the intersection point
-		);
-
-	// Something about these textures has changed.  Dirty them.
-	void        dirtyPoolObjectTextures(const std::set<LLViewerFetchedTexture*>& textures);
-
-	void        resetDrawOrders();
-
-	U32         addObject(LLViewerObject *obj);
-
-	void		enableShadows(const bool enable_shadows);
+    //attempt to allocate screen buffers at resX, resY
+    //returns true if allocation successful, false otherwise
+    bool allocateScreenBuffer(U32 resX, U32 resY, U32 samples);
+
+    void allocatePhysicsBuffer();
+    
+    void resetVertexBuffers(LLDrawable* drawable);
+    void generateImpostor(LLVOAvatar* avatar);
+    void bindScreenToTexture();
+    void renderBloom(bool for_snapshot, F32 zoom_factor = 1.f, int subfield = 0);
+
+    void init();
+    void cleanup();
+    bool isInit() { return mInitialized; };
+
+    /// @brief Get a draw pool from pool type (POOL_SIMPLE, POOL_MEDIA) and texture.
+    /// @return Draw pool, or NULL if not found.
+    LLDrawPool *findPool(const U32 pool_type, LLViewerTexture *tex0 = NULL);
+
+    /// @brief Get a draw pool for faces of the appropriate type and texture.  Create if necessary.
+    /// @return Always returns a draw pool.
+    LLDrawPool *getPool(const U32 pool_type, LLViewerTexture *tex0 = NULL);
+
+    /// @brief Figures out draw pool type from texture entry. Creates pool if necessary.
+    static LLDrawPool* getPoolFromTE(const LLTextureEntry* te, LLViewerTexture* te_image);
+    static U32 getPoolTypeFromTE(const LLTextureEntry* te, LLViewerTexture* imagep);
+
+    void         addPool(LLDrawPool *poolp);    // Only to be used by LLDrawPool classes for splitting pools!
+    void         removePool( LLDrawPool* poolp );
+
+    void         allocDrawable(LLViewerObject *obj);
+
+    void         unlinkDrawable(LLDrawable*);
+
+    static void removeMutedAVsLights(LLVOAvatar*);
+
+    // Object related methods
+    void        markVisible(LLDrawable *drawablep, LLCamera& camera);
+    void        markOccluder(LLSpatialGroup* group);
+
+    //downsample source to dest, taking the maximum depth value per pixel in source and writing to dest
+    // if source's depth buffer cannot be bound for reading, a scratch space depth buffer must be provided
+    void        downsampleDepthBuffer(LLRenderTarget& source, LLRenderTarget& dest, LLRenderTarget* scratch_space = NULL);
+
+    // Downsample depth buffer with gather and find local min/max depth values. Writes to a 16F RG render target.
+    void        downsampleMinMaxDepthBuffer(LLRenderTarget& source, LLRenderTarget& dest, LLRenderTarget* scratch_space = NULL);
+
+    void        doOcclusion(LLCamera& camera, LLRenderTarget& source, LLRenderTarget& dest, LLRenderTarget* scratch_space = NULL);
+    void        doOcclusion(LLCamera& camera);
+    void        markNotCulled(LLSpatialGroup* group, LLCamera &camera);
+    void        markMoved(LLDrawable *drawablep, bool damped_motion = false);
+    void        markShift(LLDrawable *drawablep);
+    void        markTextured(LLDrawable *drawablep);
+    void        markGLRebuild(LLGLUpdate* glu);
+    void        markRebuild(LLSpatialGroup* group, bool priority = false);
+    void        markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag = LLDrawable::REBUILD_ALL, bool priority = false);
+    void        markPartitionMove(LLDrawable* drawablep);
+    void        markMeshDirty(LLSpatialGroup* group);
+
+    //get the object between start and end that's closest to start.
+    LLViewerObject* lineSegmentIntersectInWorld(const LLVector4a& start, const LLVector4a& end,
+                                                bool pick_transparent,
+                                                bool pick_rigged,
+                                                S32* face_hit,                          // return the face hit
+                                                LLVector4a* intersection = NULL,         // return the intersection point
+                                                LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
+                                                LLVector4a* normal = NULL,               // return the surface normal at the intersection point
+                                                LLVector4a* tangent = NULL             // return the surface tangent at the intersection point  
+        );
+
+    //get the closest particle to start between start and end, returns the LLVOPartGroup and particle index
+    LLVOPartGroup* lineSegmentIntersectParticle(const LLVector4a& start, const LLVector4a& end, LLVector4a* intersection,
+                                                        S32* face_hit);
+
+
+    LLViewerObject* lineSegmentIntersectInHUD(const LLVector4a& start, const LLVector4a& end,
+                                              bool pick_transparent,
+                                              S32* face_hit,                          // return the face hit
+                                              LLVector4a* intersection = NULL,         // return the intersection point
+                                              LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
+                                              LLVector4a* normal = NULL,               // return the surface normal at the intersection point
+                                              LLVector4a* tangent = NULL             // return the surface tangent at the intersection point
+        );
+
+    // Something about these textures has changed.  Dirty them.
+    void        dirtyPoolObjectTextures(const std::set<LLViewerFetchedTexture*>& textures);
+
+    void        resetDrawOrders();
+
+    U32         addObject(LLViewerObject *obj);
+
+    void        enableShadows(const bool enable_shadows);
     void        releaseShadowTargets();
     void        releaseShadowTarget(U32 index);
 
-// 	void		setLocalLighting(const bool local_lighting);
-// 	bool		isLocalLightingEnabled() const;
-	S32			setLightingDetail(S32 level);
-	S32			getLightingDetail() const { return mLightingDetail; }
-	S32			getMaxLightingDetail() const;
-		
-	void		setUseVertexShaders(bool use_shaders);
-	bool		getUseVertexShaders() const { return mVertexShadersEnabled; }
-	bool		canUseVertexShaders();
-	bool		canUseWindLightShaders() const;
-	bool		canUseWindLightShadersOnObjects() const;
-	bool		canUseAntiAliasing() const;
-
-	// phases
-	void resetFrameStats();
-
-	void updateMoveDampedAsync(LLDrawable* drawablep);
-	void updateMoveNormalAsync(LLDrawable* drawablep);
-	void updateMovedList(LLDrawable::drawable_vector_t& move_list);
-	void updateMove();
-	bool visibleObjectsInFrustum(LLCamera& camera);
-	bool getVisibleExtents(LLCamera& camera, LLVector3 &min, LLVector3& max);
-	bool getVisiblePointCloud(LLCamera& camera, LLVector3 &min, LLVector3& max, std::vector<LLVector3>& fp, LLVector3 light_dir = LLVector3(0,0,0));
-	void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0, LLPlane* plane = NULL);  //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
-	void createObjects(F32 max_dtime);
-	void createObject(LLViewerObject* vobj);
-	void processPartitionQ();
-	void updateGeom(F32 max_dtime);
-	void updateGL();
-	void rebuildPriorityGroups();
-	void rebuildGroups();
-	void clearRebuildGroups();
-	void clearRebuildDrawables();
-
-	//calculate pixel area of given box from vantage point of given camera
-	static F32 calcPixelArea(LLVector3 center, LLVector3 size, LLCamera& camera);
-	static F32 calcPixelArea(const LLVector4a& center, const LLVector4a& size, LLCamera &camera);
-
-	void stateSort(LLCamera& camera, LLCullResult& result);
-	void stateSort(LLSpatialGroup* group, LLCamera& camera);
-	void stateSort(LLSpatialBridge* bridge, LLCamera& camera, BOOL fov_changed = FALSE);
-	void stateSort(LLDrawable* drawablep, LLCamera& camera);
-	void postSort(LLCamera& camera);
-	void forAllVisibleDrawables(void (*func)(LLDrawable*));
-
-	void renderObjects(U32 type, U32 mask, bool texture = true, bool batch_texture = false);
-	void renderMaskedObjects(U32 type, U32 mask, bool texture = true, bool batch_texture = false);
-
-	void renderGroups(LLRenderPass* pass, U32 type, U32 mask, bool texture);
-
-	void grabReferences(LLCullResult& result);
-	void clearReferences();
-
-	//check references will assert that there are no references in sCullResult to the provided data
-	void checkReferences(LLFace* face);
-	void checkReferences(LLDrawable* drawable);
-	void checkReferences(LLDrawInfo* draw_info);
-	void checkReferences(LLSpatialGroup* group);
-
-
-	void renderGeom(LLCamera& camera, bool forceVBOUpdate = false);
-	void renderGeomDeferred(LLCamera& camera);
-	void renderGeomPostDeferred(LLCamera& camera, bool do_occlusion=true);
-	void renderGeomShadow(LLCamera& camera);
-	void bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_target = nullptr);
-	void setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep);
-
-	void unbindDeferredShader(LLGLSLShader& shader);
-	void renderDeferredLighting(LLRenderTarget* light_target);
-	void postDeferredGammaCorrect(LLRenderTarget* screen_target);
-
-	void generateWaterReflection(LLCamera& camera);
-	void generateSunShadow(LLCamera& camera);
+//  void        setLocalLighting(const bool local_lighting);
+//  bool        isLocalLightingEnabled() const;
+    S32         setLightingDetail(S32 level);
+    S32         getLightingDetail() const { return mLightingDetail; }
+    S32         getMaxLightingDetail() const;
+        
+    void        setUseVertexShaders(bool use_shaders);
+    bool        getUseVertexShaders() const { return mVertexShadersEnabled; }
+    bool        canUseVertexShaders();
+    bool        canUseWindLightShaders() const;
+    bool        canUseWindLightShadersOnObjects() const;
+    bool        canUseAntiAliasing() const;
+
+    // phases
+    void resetFrameStats();
+
+    void updateMoveDampedAsync(LLDrawable* drawablep);
+    void updateMoveNormalAsync(LLDrawable* drawablep);
+    void updateMovedList(LLDrawable::drawable_vector_t& move_list);
+    void updateMove();
+    bool visibleObjectsInFrustum(LLCamera& camera);
+    bool getVisibleExtents(LLCamera& camera, LLVector3 &min, LLVector3& max);
+    bool getVisiblePointCloud(LLCamera& camera, LLVector3 &min, LLVector3& max, std::vector<LLVector3>& fp, LLVector3 light_dir = LLVector3(0,0,0));
+    void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0, LLPlane* plane = NULL);  //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
+    void createObjects(F32 max_dtime);
+    void createObject(LLViewerObject* vobj);
+    void processPartitionQ();
+    void updateGeom(F32 max_dtime);
+    void updateGL();
+    void rebuildPriorityGroups();
+    void rebuildGroups();
+    void clearRebuildGroups();
+    void clearRebuildDrawables();
+
+    //calculate pixel area of given box from vantage point of given camera
+    static F32 calcPixelArea(LLVector3 center, LLVector3 size, LLCamera& camera);
+    static F32 calcPixelArea(const LLVector4a& center, const LLVector4a& size, LLCamera &camera);
+
+    void stateSort(LLCamera& camera, LLCullResult& result);
+    void stateSort(LLSpatialGroup* group, LLCamera& camera);
+    void stateSort(LLSpatialBridge* bridge, LLCamera& camera, BOOL fov_changed = FALSE);
+    void stateSort(LLDrawable* drawablep, LLCamera& camera);
+    void postSort(LLCamera& camera);
+    void forAllVisibleDrawables(void (*func)(LLDrawable*));
+
+    void renderObjects(U32 type, U32 mask, bool texture = true, bool batch_texture = false);
+    void renderMaskedObjects(U32 type, U32 mask, bool texture = true, bool batch_texture = false);
+
+    void renderGroups(LLRenderPass* pass, U32 type, U32 mask, bool texture);
+
+    void grabReferences(LLCullResult& result);
+    void clearReferences();
+
+    //check references will assert that there are no references in sCullResult to the provided data
+    void checkReferences(LLFace* face);
+    void checkReferences(LLDrawable* drawable);
+    void checkReferences(LLDrawInfo* draw_info);
+    void checkReferences(LLSpatialGroup* group);
+
+
+    void renderGeom(LLCamera& camera, bool forceVBOUpdate = false);
+    void renderGeomDeferred(LLCamera& camera);
+    void renderGeomPostDeferred(LLCamera& camera, bool do_occlusion=true);
+    void renderGeomShadow(LLCamera& camera);
+    void bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_target = nullptr);
+    void setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep);
+
+    void unbindDeferredShader(LLGLSLShader& shader);
+    void renderDeferredLighting(LLRenderTarget* light_target);
+    void postDeferredGammaCorrect(LLRenderTarget* screen_target);
+
+    void generateWaterReflection(LLCamera& camera);
+    void generateSunShadow(LLCamera& camera);
     LLRenderTarget* getShadowTarget(U32 i);
 
-	void generateHighlight(LLCamera& camera);
-	void renderHighlight(const LLViewerObject* obj, F32 fade);
-	void setHighlightObject(LLDrawable* obj) { mHighlightObject = obj; }
-
-
-	void renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& camera, LLCullResult& result, bool use_shader, bool use_occlusion, U32 target_width);
-	void renderHighlights();
-	void renderDebug();
-	void renderPhysicsDisplay();
-
-	void rebuildPools(); // Rebuild pools
-
-	void findReferences(LLDrawable *drawablep);	// Find the lists which have references to this object
-	bool verify();						// Verify that all data in the pipeline is "correct"
-
-	S32  getLightCount() const { return mLights.size(); }
-
-	void calcNearbyLights(LLCamera& camera);
-	void setupHWLights(LLDrawPool* pool);
-	void setupAvatarLights(bool for_edit = false);
-	void enableLights(U32 mask);
-	void enableLightsStatic();
-	void enableLightsDynamic();
-	void enableLightsAvatar();
-	void enableLightsPreview();
-	void enableLightsAvatarEdit(const LLColor4& color);
-	void enableLightsFullbright(const LLColor4& color);
-	void disableLights();
-
-	void shiftObjects(const LLVector3 &offset);
-
-	void setLight(LLDrawable *drawablep, bool is_light);
-	
-	bool hasRenderBatches(const U32 type) const;
-	LLCullResult::drawinfo_iterator beginRenderMap(U32 type);
-	LLCullResult::drawinfo_iterator endRenderMap(U32 type);
-	LLCullResult::sg_iterator beginAlphaGroups();
-	LLCullResult::sg_iterator endAlphaGroups();
-	
-
-	void addTrianglesDrawn(S32 index_count, U32 render_type = LLRender::TRIANGLES);
-
-	bool hasRenderDebugFeatureMask(const U32 mask) const	{ return bool(mRenderDebugFeatureMask & mask); }
-	bool hasRenderDebugMask(const U64 mask) const			{ return bool(mRenderDebugMask & mask); }
-	void setAllRenderDebugFeatures() { mRenderDebugFeatureMask = 0xffffffff; }
-	void clearAllRenderDebugFeatures() { mRenderDebugFeatureMask = 0x0; }
-	void setAllRenderDebugDisplays() { mRenderDebugMask = 0xffffffffffffffff; }
-	void clearAllRenderDebugDisplays() { mRenderDebugMask = 0x0; }
-
-	bool hasRenderType(const U32 type) const;
-	bool hasAnyRenderType(const U32 type, ...) const;
-
-	void setRenderTypeMask(U32 type, ...);
-	// This is equivalent to 'setRenderTypeMask'
-	//void orRenderTypeMask(U32 type, ...);
-	void andRenderTypeMask(U32 type, ...);
-	void clearRenderTypeMask(U32 type, ...);
-	void setAllRenderTypes();
-	void clearAllRenderTypes();
-	
-	void pushRenderTypeMask();
-	void popRenderTypeMask();
-
-	void pushRenderDebugFeatureMask();
-	void popRenderDebugFeatureMask();
-
-	static void toggleRenderType(U32 type);
-
-	// For UI control of render features
-	static bool hasRenderTypeControl(U32 data);
-	static void toggleRenderDebug(U64 data);
-	static void toggleRenderDebugFeature(U32 data);
-	static void toggleRenderTypeControl(U32 data);
-	static bool toggleRenderTypeControlNegated(S32 data);
-	static bool toggleRenderDebugControl(U64 data);
-	static bool toggleRenderDebugFeatureControl(U32 data);
-	static void setRenderDebugFeatureControl(U32 bit, bool value);
-
-	static void setRenderParticleBeacons(bool val);
-	static void toggleRenderParticleBeacons();
-	static bool getRenderParticleBeacons();
-
-	static void setRenderSoundBeacons(bool val);
-	static void toggleRenderSoundBeacons();
-	static bool getRenderSoundBeacons();
-
-	static void setRenderMOAPBeacons(bool val);
-	static void toggleRenderMOAPBeacons();
-	static bool getRenderMOAPBeacons();
-
-	static void setRenderPhysicalBeacons(bool val);
-	static void toggleRenderPhysicalBeacons();
-	static bool getRenderPhysicalBeacons();
-
-	static void setRenderScriptedBeacons(bool val);
-	static void toggleRenderScriptedBeacons();
-	static bool getRenderScriptedBeacons();
-
-	static void setRenderScriptedTouchBeacons(bool val);
-	static void toggleRenderScriptedTouchBeacons();
-	static bool getRenderScriptedTouchBeacons();
-
-	static void setRenderBeacons(bool val);
-	static void toggleRenderBeacons();
-	static bool getRenderBeacons();
-
-	static void setRenderHighlights(bool val);
-	static void toggleRenderHighlights();
-	static bool getRenderHighlights();
-	static void setRenderHighlightTextureChannel(LLRender::eTexIndex channel); // sets which UV setup to display in highlight overlay
-
-	static void updateRenderBump();
-	static void updateRenderDeferred();
-	static void refreshCachedSettings();
-
-	static void throttleNewMemoryAllocation(bool disable);
-
-	
-
-	void addDebugBlip(const LLVector3& position, const LLColor4& color);
-
-	void hidePermanentObjects( std::vector<U32>& restoreList );
-	void restorePermanentObjects( const std::vector<U32>& restoreList );
-	void skipRenderingOfTerrain( bool flag );
-	void hideObject( const LLUUID& id );
-	void restoreHiddenObject( const LLUUID& id );
+    void generateHighlight(LLCamera& camera);
+    void renderHighlight(const LLViewerObject* obj, F32 fade);
+    void setHighlightObject(LLDrawable* obj) { mHighlightObject = obj; }
+
+
+    void renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera& camera, LLCullResult& result, bool use_shader, bool use_occlusion, U32 target_width);
+    void renderHighlights();
+    void renderDebug();
+    void renderPhysicsDisplay();
+
+    void rebuildPools(); // Rebuild pools
+
+    void findReferences(LLDrawable *drawablep); // Find the lists which have references to this object
+    bool verify();                      // Verify that all data in the pipeline is "correct"
+
+    S32  getLightCount() const { return mLights.size(); }
+
+    void calcNearbyLights(LLCamera& camera);
+    void setupHWLights(LLDrawPool* pool);
+    void setupAvatarLights(bool for_edit = false);
+    void enableLights(U32 mask);
+    void enableLightsStatic();
+    void enableLightsDynamic();
+    void enableLightsAvatar();
+    void enableLightsPreview();
+    void enableLightsAvatarEdit(const LLColor4& color);
+    void enableLightsFullbright(const LLColor4& color);
+    void disableLights();
+
+    void shiftObjects(const LLVector3 &offset);
+
+    void setLight(LLDrawable *drawablep, bool is_light);
+    
+    bool hasRenderBatches(const U32 type) const;
+    LLCullResult::drawinfo_iterator beginRenderMap(U32 type);
+    LLCullResult::drawinfo_iterator endRenderMap(U32 type);
+    LLCullResult::sg_iterator beginAlphaGroups();
+    LLCullResult::sg_iterator endAlphaGroups();
+    
+
+    void addTrianglesDrawn(S32 index_count, U32 render_type = LLRender::TRIANGLES);
+
+    bool hasRenderDebugFeatureMask(const U32 mask) const    { return bool(mRenderDebugFeatureMask & mask); }
+    bool hasRenderDebugMask(const U64 mask) const           { return bool(mRenderDebugMask & mask); }
+    void setAllRenderDebugFeatures() { mRenderDebugFeatureMask = 0xffffffff; }
+    void clearAllRenderDebugFeatures() { mRenderDebugFeatureMask = 0x0; }
+    void setAllRenderDebugDisplays() { mRenderDebugMask = 0xffffffffffffffff; }
+    void clearAllRenderDebugDisplays() { mRenderDebugMask = 0x0; }
+
+    bool hasRenderType(const U32 type) const;
+    bool hasAnyRenderType(const U32 type, ...) const;
+
+    void setRenderTypeMask(U32 type, ...);
+    // This is equivalent to 'setRenderTypeMask'
+    //void orRenderTypeMask(U32 type, ...);
+    void andRenderTypeMask(U32 type, ...);
+    void clearRenderTypeMask(U32 type, ...);
+    void setAllRenderTypes();
+    void clearAllRenderTypes();
+    
+    void pushRenderTypeMask();
+    void popRenderTypeMask();
+
+    void pushRenderDebugFeatureMask();
+    void popRenderDebugFeatureMask();
+
+    static void toggleRenderType(U32 type);
+
+    // For UI control of render features
+    static bool hasRenderTypeControl(U32 data);
+    static void toggleRenderDebug(U64 data);
+    static void toggleRenderDebugFeature(U32 data);
+    static void toggleRenderTypeControl(U32 data);
+    static bool toggleRenderTypeControlNegated(S32 data);
+    static bool toggleRenderDebugControl(U64 data);
+    static bool toggleRenderDebugFeatureControl(U32 data);
+    static void setRenderDebugFeatureControl(U32 bit, bool value);
+
+    static void setRenderParticleBeacons(bool val);
+    static void toggleRenderParticleBeacons();
+    static bool getRenderParticleBeacons();
+
+    static void setRenderSoundBeacons(bool val);
+    static void toggleRenderSoundBeacons();
+    static bool getRenderSoundBeacons();
+
+    static void setRenderMOAPBeacons(bool val);
+    static void toggleRenderMOAPBeacons();
+    static bool getRenderMOAPBeacons();
+
+    static void setRenderPhysicalBeacons(bool val);
+    static void toggleRenderPhysicalBeacons();
+    static bool getRenderPhysicalBeacons();
+
+    static void setRenderScriptedBeacons(bool val);
+    static void toggleRenderScriptedBeacons();
+    static bool getRenderScriptedBeacons();
+
+    static void setRenderScriptedTouchBeacons(bool val);
+    static void toggleRenderScriptedTouchBeacons();
+    static bool getRenderScriptedTouchBeacons();
+
+    static void setRenderBeacons(bool val);
+    static void toggleRenderBeacons();
+    static bool getRenderBeacons();
+
+    static void setRenderHighlights(bool val);
+    static void toggleRenderHighlights();
+    static bool getRenderHighlights();
+    static void setRenderHighlightTextureChannel(LLRender::eTexIndex channel); // sets which UV setup to display in highlight overlay
+
+    static void updateRenderBump();
+    static void updateRenderDeferred();
+    static void refreshCachedSettings();
+
+    static void throttleNewMemoryAllocation(bool disable);
+
+    
+
+    void addDebugBlip(const LLVector3& position, const LLColor4& color);
+
+    void hidePermanentObjects( std::vector<U32>& restoreList );
+    void restorePermanentObjects( const std::vector<U32>& restoreList );
+    void skipRenderingOfTerrain( bool flag );
+    void hideObject( const LLUUID& id );
+    void restoreHiddenObject( const LLUUID& id );
 
 private:
-	void unloadShaders();
-	void addToQuickLookup( LLDrawPool* new_poolp );
-	void removeFromQuickLookup( LLDrawPool* poolp );
-	bool updateDrawableGeom(LLDrawable* drawable, bool priority);
-	void assertInitializedDoError();
-	bool assertInitialized() { const bool is_init = isInit(); if (!is_init) assertInitializedDoError(); return is_init; };
-	void connectRefreshCachedSettingsSafe(const std::string name);
-	void hideDrawable( LLDrawable *pDrawable );
-	void unhideDrawable( LLDrawable *pDrawable );
+    void unloadShaders();
+    void addToQuickLookup( LLDrawPool* new_poolp );
+    void removeFromQuickLookup( LLDrawPool* poolp );
+    bool updateDrawableGeom(LLDrawable* drawable, bool priority);
+    void assertInitializedDoError();
+    bool assertInitialized() { const bool is_init = isInit(); if (!is_init) assertInitializedDoError(); return is_init; };
+    void connectRefreshCachedSettingsSafe(const std::string name);
+    void hideDrawable( LLDrawable *pDrawable );
+    void unhideDrawable( LLDrawable *pDrawable );
 public:
-	enum {GPU_CLASS_MAX = 3 };
-
-	enum LLRenderTypeMask
-	{
-		// Following are pool types (some are also object types)
-		RENDER_TYPE_SKY							= LLDrawPool::POOL_SKY,
-		RENDER_TYPE_WL_SKY						= LLDrawPool::POOL_WL_SKY,
-		RENDER_TYPE_GROUND						= LLDrawPool::POOL_GROUND,	
-		RENDER_TYPE_TERRAIN						= LLDrawPool::POOL_TERRAIN,
-		RENDER_TYPE_SIMPLE						= LLDrawPool::POOL_SIMPLE,
-		RENDER_TYPE_GRASS						= LLDrawPool::POOL_GRASS,
-		RENDER_TYPE_ALPHA_MASK					= LLDrawPool::POOL_ALPHA_MASK,
-		RENDER_TYPE_FULLBRIGHT_ALPHA_MASK		= LLDrawPool::POOL_FULLBRIGHT_ALPHA_MASK,
-		RENDER_TYPE_FULLBRIGHT					= LLDrawPool::POOL_FULLBRIGHT,
-		RENDER_TYPE_BUMP						= LLDrawPool::POOL_BUMP,
-		RENDER_TYPE_MATERIALS					= LLDrawPool::POOL_MATERIALS,
-		RENDER_TYPE_AVATAR						= LLDrawPool::POOL_AVATAR,
-		RENDER_TYPE_TREE						= LLDrawPool::POOL_TREE,
-		RENDER_TYPE_INVISIBLE					= LLDrawPool::POOL_INVISIBLE,
-		RENDER_TYPE_VOIDWATER					= LLDrawPool::POOL_VOIDWATER,
-		RENDER_TYPE_WATER						= LLDrawPool::POOL_WATER,
- 		RENDER_TYPE_ALPHA						= LLDrawPool::POOL_ALPHA,
-		RENDER_TYPE_GLOW						= LLDrawPool::POOL_GLOW,
-		RENDER_TYPE_PASS_SIMPLE 				= LLRenderPass::PASS_SIMPLE,
-		RENDER_TYPE_PASS_GRASS					= LLRenderPass::PASS_GRASS,
-		RENDER_TYPE_PASS_FULLBRIGHT				= LLRenderPass::PASS_FULLBRIGHT,
-		RENDER_TYPE_PASS_INVISIBLE				= LLRenderPass::PASS_INVISIBLE,
-		RENDER_TYPE_PASS_INVISI_SHINY			= LLRenderPass::PASS_INVISI_SHINY,
-		RENDER_TYPE_PASS_FULLBRIGHT_SHINY		= LLRenderPass::PASS_FULLBRIGHT_SHINY,
-		RENDER_TYPE_PASS_SHINY					= LLRenderPass::PASS_SHINY,
-		RENDER_TYPE_PASS_BUMP					= LLRenderPass::PASS_BUMP,
-		RENDER_TYPE_PASS_POST_BUMP				= LLRenderPass::PASS_POST_BUMP,
-		RENDER_TYPE_PASS_GLOW					= LLRenderPass::PASS_GLOW,
-		RENDER_TYPE_PASS_ALPHA					= LLRenderPass::PASS_ALPHA,
-		RENDER_TYPE_PASS_ALPHA_MASK				= LLRenderPass::PASS_ALPHA_MASK,
-		RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK	= LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK,
-		RENDER_TYPE_PASS_MATERIAL				= LLRenderPass::PASS_MATERIAL,
-		RENDER_TYPE_PASS_MATERIAL_ALPHA			= LLRenderPass::PASS_MATERIAL_ALPHA,
-		RENDER_TYPE_PASS_MATERIAL_ALPHA_MASK	= LLRenderPass::PASS_MATERIAL_ALPHA_MASK,
-		RENDER_TYPE_PASS_MATERIAL_ALPHA_EMISSIVE= LLRenderPass::PASS_MATERIAL_ALPHA_EMISSIVE,
-		RENDER_TYPE_PASS_SPECMAP				= LLRenderPass::PASS_SPECMAP,
-		RENDER_TYPE_PASS_SPECMAP_BLEND			= LLRenderPass::PASS_SPECMAP_BLEND,
-		RENDER_TYPE_PASS_SPECMAP_MASK			= LLRenderPass::PASS_SPECMAP_MASK,
-		RENDER_TYPE_PASS_SPECMAP_EMISSIVE		= LLRenderPass::PASS_SPECMAP_EMISSIVE,
-		RENDER_TYPE_PASS_NORMMAP				= LLRenderPass::PASS_NORMMAP,
-		RENDER_TYPE_PASS_NORMMAP_BLEND			= LLRenderPass::PASS_NORMMAP_BLEND,
-		RENDER_TYPE_PASS_NORMMAP_MASK			= LLRenderPass::PASS_NORMMAP_MASK,
-		RENDER_TYPE_PASS_NORMMAP_EMISSIVE		= LLRenderPass::PASS_NORMMAP_EMISSIVE,
-		RENDER_TYPE_PASS_NORMSPEC				= LLRenderPass::PASS_NORMSPEC,
-		RENDER_TYPE_PASS_NORMSPEC_BLEND			= LLRenderPass::PASS_NORMSPEC_BLEND,
-		RENDER_TYPE_PASS_NORMSPEC_MASK			= LLRenderPass::PASS_NORMSPEC_MASK,
-		RENDER_TYPE_PASS_NORMSPEC_EMISSIVE		= LLRenderPass::PASS_NORMSPEC_EMISSIVE,
-		// Following are object types (only used in drawable mRenderType)
-		RENDER_TYPE_HUD = LLRenderPass::NUM_RENDER_TYPES,
-		RENDER_TYPE_VOLUME,
-		RENDER_TYPE_PARTICLES,
-		RENDER_TYPE_CLOUDS,
-		RENDER_TYPE_HUD_PARTICLES,
-		NUM_RENDER_TYPES,
-		END_RENDER_TYPES = NUM_RENDER_TYPES
-	};
-
-	enum LLRenderDebugFeatureMask
-	{
-		RENDER_DEBUG_FEATURE_UI					= 0x0001,
-		RENDER_DEBUG_FEATURE_SELECTED			= 0x0002,
-		RENDER_DEBUG_FEATURE_HIGHLIGHTED		= 0x0004,
-		RENDER_DEBUG_FEATURE_DYNAMIC_TEXTURES	= 0x0008,
-// 		RENDER_DEBUG_FEATURE_HW_LIGHTING		= 0x0010,
-		RENDER_DEBUG_FEATURE_FLEXIBLE			= 0x0010,
-		RENDER_DEBUG_FEATURE_FOG				= 0x0020,
-		RENDER_DEBUG_FEATURE_FR_INFO			= 0x0080,
-		RENDER_DEBUG_FEATURE_FOOT_SHADOWS		= 0x0100,
-	};
-
-	enum LLRenderDebugMask: U64
-	{
-		RENDER_DEBUG_COMPOSITION		=  0x00000001,
-		RENDER_DEBUG_VERIFY				=  0x00000002,
-		RENDER_DEBUG_BBOXES				=  0x00000004,
-		RENDER_DEBUG_OCTREE				=  0x00000008,
-		RENDER_DEBUG_WIND_VECTORS		=  0x00000010,
-		RENDER_DEBUG_OCCLUSION			=  0x00000020,
-		RENDER_DEBUG_POINTS				=  0x00000040,
-		RENDER_DEBUG_TEXTURE_PRIORITY	=  0x00000080,
-		RENDER_DEBUG_TEXTURE_AREA		=  0x00000100,
-		RENDER_DEBUG_FACE_AREA			=  0x00000200,
-		RENDER_DEBUG_PARTICLES			=  0x00000400,
-		RENDER_DEBUG_GLOW				=  0x00000800, // not used
-		RENDER_DEBUG_TEXTURE_ANIM		=  0x00001000,
-		RENDER_DEBUG_LIGHTS				=  0x00002000,
-		RENDER_DEBUG_BATCH_SIZE			=  0x00004000,
-		RENDER_DEBUG_ALPHA_BINS			=  0x00008000, // not used
-		RENDER_DEBUG_RAYCAST            =  0x00010000,
-		RENDER_DEBUG_AVATAR_DRAW_INFO	=  0x00020000,
-		RENDER_DEBUG_SHADOW_FRUSTA		=  0x00040000,
-		RENDER_DEBUG_SCULPTED           =  0x00080000,
-		RENDER_DEBUG_AVATAR_VOLUME      =  0x00100000,
-		RENDER_DEBUG_AVATAR_JOINTS      =  0x00200000,
-		RENDER_DEBUG_BUILD_QUEUE		=  0x00400000,
-		RENDER_DEBUG_AGENT_TARGET       =  0x00800000,
-		RENDER_DEBUG_UPDATE_TYPE		=  0x01000000,
-		RENDER_DEBUG_PHYSICS_SHAPES     =  0x02000000,
-		RENDER_DEBUG_NORMALS	        =  0x04000000,
-		RENDER_DEBUG_LOD_INFO	        =  0x08000000,
-		RENDER_DEBUG_RENDER_COMPLEXITY  =  0x10000000,
-		RENDER_DEBUG_ATTACHMENT_BYTES	=  0x20000000, // not used
-		RENDER_DEBUG_TEXEL_DENSITY		=  0x40000000,
-		RENDER_DEBUG_TRIANGLE_COUNT		=  0x80000000,
-		RENDER_DEBUG_IMPOSTORS			= 0x100000000,
+    enum {GPU_CLASS_MAX = 3 };
+
+    enum LLRenderTypeMask
+    {
+        // Following are pool types (some are also object types)
+        RENDER_TYPE_SKY                         = LLDrawPool::POOL_SKY,
+        RENDER_TYPE_WL_SKY                      = LLDrawPool::POOL_WL_SKY,
+        RENDER_TYPE_GROUND                      = LLDrawPool::POOL_GROUND,  
+        RENDER_TYPE_TERRAIN                     = LLDrawPool::POOL_TERRAIN,
+        RENDER_TYPE_SIMPLE                      = LLDrawPool::POOL_SIMPLE,
+        RENDER_TYPE_GRASS                       = LLDrawPool::POOL_GRASS,
+        RENDER_TYPE_ALPHA_MASK                  = LLDrawPool::POOL_ALPHA_MASK,
+        RENDER_TYPE_FULLBRIGHT_ALPHA_MASK       = LLDrawPool::POOL_FULLBRIGHT_ALPHA_MASK,
+        RENDER_TYPE_FULLBRIGHT                  = LLDrawPool::POOL_FULLBRIGHT,
+        RENDER_TYPE_BUMP                        = LLDrawPool::POOL_BUMP,
+        RENDER_TYPE_MATERIALS                   = LLDrawPool::POOL_MATERIALS,
+        RENDER_TYPE_AVATAR                      = LLDrawPool::POOL_AVATAR,
+        RENDER_TYPE_TREE                        = LLDrawPool::POOL_TREE,
+        RENDER_TYPE_INVISIBLE                   = LLDrawPool::POOL_INVISIBLE,
+        RENDER_TYPE_VOIDWATER                   = LLDrawPool::POOL_VOIDWATER,
+        RENDER_TYPE_WATER                       = LLDrawPool::POOL_WATER,
+        RENDER_TYPE_ALPHA                       = LLDrawPool::POOL_ALPHA,
+        RENDER_TYPE_GLOW                        = LLDrawPool::POOL_GLOW,
+        RENDER_TYPE_PASS_SIMPLE                 = LLRenderPass::PASS_SIMPLE,
+        RENDER_TYPE_PASS_GRASS                  = LLRenderPass::PASS_GRASS,
+        RENDER_TYPE_PASS_FULLBRIGHT             = LLRenderPass::PASS_FULLBRIGHT,
+        RENDER_TYPE_PASS_INVISIBLE              = LLRenderPass::PASS_INVISIBLE,
+        RENDER_TYPE_PASS_INVISI_SHINY           = LLRenderPass::PASS_INVISI_SHINY,
+        RENDER_TYPE_PASS_FULLBRIGHT_SHINY       = LLRenderPass::PASS_FULLBRIGHT_SHINY,
+        RENDER_TYPE_PASS_SHINY                  = LLRenderPass::PASS_SHINY,
+        RENDER_TYPE_PASS_BUMP                   = LLRenderPass::PASS_BUMP,
+        RENDER_TYPE_PASS_POST_BUMP              = LLRenderPass::PASS_POST_BUMP,
+        RENDER_TYPE_PASS_GLOW                   = LLRenderPass::PASS_GLOW,
+        RENDER_TYPE_PASS_ALPHA                  = LLRenderPass::PASS_ALPHA,
+        RENDER_TYPE_PASS_ALPHA_MASK             = LLRenderPass::PASS_ALPHA_MASK,
+        RENDER_TYPE_PASS_FULLBRIGHT_ALPHA_MASK  = LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK,
+        RENDER_TYPE_PASS_MATERIAL               = LLRenderPass::PASS_MATERIAL,
+        RENDER_TYPE_PASS_MATERIAL_ALPHA         = LLRenderPass::PASS_MATERIAL_ALPHA,
+        RENDER_TYPE_PASS_MATERIAL_ALPHA_MASK    = LLRenderPass::PASS_MATERIAL_ALPHA_MASK,
+        RENDER_TYPE_PASS_MATERIAL_ALPHA_EMISSIVE= LLRenderPass::PASS_MATERIAL_ALPHA_EMISSIVE,
+        RENDER_TYPE_PASS_SPECMAP                = LLRenderPass::PASS_SPECMAP,
+        RENDER_TYPE_PASS_SPECMAP_BLEND          = LLRenderPass::PASS_SPECMAP_BLEND,
+        RENDER_TYPE_PASS_SPECMAP_MASK           = LLRenderPass::PASS_SPECMAP_MASK,
+        RENDER_TYPE_PASS_SPECMAP_EMISSIVE       = LLRenderPass::PASS_SPECMAP_EMISSIVE,
+        RENDER_TYPE_PASS_NORMMAP                = LLRenderPass::PASS_NORMMAP,
+        RENDER_TYPE_PASS_NORMMAP_BLEND          = LLRenderPass::PASS_NORMMAP_BLEND,
+        RENDER_TYPE_PASS_NORMMAP_MASK           = LLRenderPass::PASS_NORMMAP_MASK,
+        RENDER_TYPE_PASS_NORMMAP_EMISSIVE       = LLRenderPass::PASS_NORMMAP_EMISSIVE,
+        RENDER_TYPE_PASS_NORMSPEC               = LLRenderPass::PASS_NORMSPEC,
+        RENDER_TYPE_PASS_NORMSPEC_BLEND         = LLRenderPass::PASS_NORMSPEC_BLEND,
+        RENDER_TYPE_PASS_NORMSPEC_MASK          = LLRenderPass::PASS_NORMSPEC_MASK,
+        RENDER_TYPE_PASS_NORMSPEC_EMISSIVE      = LLRenderPass::PASS_NORMSPEC_EMISSIVE,
+        // Following are object types (only used in drawable mRenderType)
+        RENDER_TYPE_HUD = LLRenderPass::NUM_RENDER_TYPES,
+        RENDER_TYPE_VOLUME,
+        RENDER_TYPE_PARTICLES,
+        RENDER_TYPE_CLOUDS,
+        RENDER_TYPE_HUD_PARTICLES,
+        NUM_RENDER_TYPES,
+        END_RENDER_TYPES = NUM_RENDER_TYPES
+    };
+
+    enum LLRenderDebugFeatureMask
+    {
+        RENDER_DEBUG_FEATURE_UI                 = 0x0001,
+        RENDER_DEBUG_FEATURE_SELECTED           = 0x0002,
+        RENDER_DEBUG_FEATURE_HIGHLIGHTED        = 0x0004,
+        RENDER_DEBUG_FEATURE_DYNAMIC_TEXTURES   = 0x0008,
+//      RENDER_DEBUG_FEATURE_HW_LIGHTING        = 0x0010,
+        RENDER_DEBUG_FEATURE_FLEXIBLE           = 0x0010,
+        RENDER_DEBUG_FEATURE_FOG                = 0x0020,
+        RENDER_DEBUG_FEATURE_FR_INFO            = 0x0080,
+        RENDER_DEBUG_FEATURE_FOOT_SHADOWS       = 0x0100,
+    };
+
+    enum LLRenderDebugMask: U64
+    {
+        RENDER_DEBUG_COMPOSITION        =  0x00000001,
+        RENDER_DEBUG_VERIFY             =  0x00000002,
+        RENDER_DEBUG_BBOXES             =  0x00000004,
+        RENDER_DEBUG_OCTREE             =  0x00000008,
+        RENDER_DEBUG_WIND_VECTORS       =  0x00000010,
+        RENDER_DEBUG_OCCLUSION          =  0x00000020,
+        RENDER_DEBUG_POINTS             =  0x00000040,
+        RENDER_DEBUG_TEXTURE_PRIORITY   =  0x00000080,
+        RENDER_DEBUG_TEXTURE_AREA       =  0x00000100,
+        RENDER_DEBUG_FACE_AREA          =  0x00000200,
+        RENDER_DEBUG_PARTICLES          =  0x00000400,
+        RENDER_DEBUG_GLOW               =  0x00000800, // not used
+        RENDER_DEBUG_TEXTURE_ANIM       =  0x00001000,
+        RENDER_DEBUG_LIGHTS             =  0x00002000,
+        RENDER_DEBUG_BATCH_SIZE         =  0x00004000,
+        RENDER_DEBUG_ALPHA_BINS         =  0x00008000, // not used
+        RENDER_DEBUG_RAYCAST            =  0x00010000,
+        RENDER_DEBUG_AVATAR_DRAW_INFO   =  0x00020000,
+        RENDER_DEBUG_SHADOW_FRUSTA      =  0x00040000,
+        RENDER_DEBUG_SCULPTED           =  0x00080000,
+        RENDER_DEBUG_AVATAR_VOLUME      =  0x00100000,
+        RENDER_DEBUG_AVATAR_JOINTS      =  0x00200000,
+        RENDER_DEBUG_BUILD_QUEUE        =  0x00400000,
+        RENDER_DEBUG_AGENT_TARGET       =  0x00800000,
+        RENDER_DEBUG_UPDATE_TYPE        =  0x01000000,
+        RENDER_DEBUG_PHYSICS_SHAPES     =  0x02000000,
+        RENDER_DEBUG_NORMALS            =  0x04000000,
+        RENDER_DEBUG_LOD_INFO           =  0x08000000,
+        RENDER_DEBUG_RENDER_COMPLEXITY  =  0x10000000,
+        RENDER_DEBUG_ATTACHMENT_BYTES   =  0x20000000, // not used
+        RENDER_DEBUG_TEXEL_DENSITY      =  0x40000000,
+        RENDER_DEBUG_TRIANGLE_COUNT     =  0x80000000,
+        RENDER_DEBUG_IMPOSTORS          = 0x100000000,
         RENDER_DEBUG_SH                  = 0x200000000,
-	};
+    };
 
 public:
-	
-	LLSpatialPartition* getSpatialPartition(LLViewerObject* vobj);
-
-	void updateCamera(bool reset = false);
-	
-	LLVector3				mFlyCamPosition;
-	LLQuaternion			mFlyCamRotation;
-
-	bool					 mBackfaceCull;
-	S32						 mMatrixOpCount;
-	S32						 mTextureMatrixOps;
-	S32						 mNumVisibleNodes;
-
-	S32						 mDebugTextureUploadCost;
-	S32						 mDebugSculptUploadCost;
-	S32						 mDebugMeshUploadCost;
-
-	S32						 mNumVisibleFaces;
-
-	static S32				sCompiles;
-
-	static bool				sShowHUDAttachments;
-	static bool				sForceOldBakedUpload; // If true will not use capabilities to upload baked textures.
-	static S32				sUseOcclusion;  // 0 = no occlusion, 1 = read only, 2 = read/write
-	static bool				sDelayVBUpdate;
-	static bool				sAutoMaskAlphaDeferred;
-	static bool				sAutoMaskAlphaNonDeferred;
-	static bool				sDisableShaders; // if true, rendering will be done without shaders
-	static bool				sRenderBump;
-	static bool				sBakeSunlight;
-	static bool				sNoAlpha;
-	static bool				sUseTriStrips;
-	static bool				sUseFarClip;
-	static bool				sShadowRender;
-	static bool				sWaterReflections;
-	static bool				sDynamicLOD;
-	static bool				sPickAvatar;
-	static bool				sReflectionRender;
-    static bool				sDistortionRender;
-	static bool				sImpostorRender;
-	static bool				sImpostorRenderAlphaDepthPass;
-	static bool				sUnderWaterRender;
-	static bool				sRenderGlow;
-	static bool				sTextureBindTest;
-	static bool				sRenderFrameTest;
-	static bool				sRenderAttachedLights;
-	static bool				sRenderAttachedParticles;
-	static bool				sRenderDeferred;
-	static bool             sMemAllocationThrottled;
-	static S32				sVisibleLightCount;
-	static F32				sMinRenderSize;
-	static bool				sRenderingHUDs;
+    
+    LLSpatialPartition* getSpatialPartition(LLViewerObject* vobj);
+
+    void updateCamera(bool reset = false);
+    
+    LLVector3               mFlyCamPosition;
+    LLQuaternion            mFlyCamRotation;
+
+    bool                     mBackfaceCull;
+    S32                      mMatrixOpCount;
+    S32                      mTextureMatrixOps;
+    S32                      mNumVisibleNodes;
+
+    S32                      mDebugTextureUploadCost;
+    S32                      mDebugSculptUploadCost;
+    S32                      mDebugMeshUploadCost;
+
+    S32                      mNumVisibleFaces;
+
+    static S32              sCompiles;
+
+    static bool             sShowHUDAttachments;
+    static bool             sForceOldBakedUpload; // If true will not use capabilities to upload baked textures.
+    static S32              sUseOcclusion;  // 0 = no occlusion, 1 = read only, 2 = read/write
+    static bool             sDelayVBUpdate;
+    static bool             sAutoMaskAlphaDeferred;
+    static bool             sAutoMaskAlphaNonDeferred;
+    static bool             sDisableShaders; // if true, rendering will be done without shaders
+    static bool             sRenderBump;
+    static bool             sBakeSunlight;
+    static bool             sNoAlpha;
+    static bool             sUseTriStrips;
+    static bool             sUseFarClip;
+    static bool             sShadowRender;
+    static bool             sWaterReflections;
+    static bool             sDynamicLOD;
+    static bool             sPickAvatar;
+    static bool             sReflectionRender;
+    static bool             sDistortionRender;
+    static bool             sImpostorRender;
+    static bool             sImpostorRenderAlphaDepthPass;
+    static bool             sUnderWaterRender;
+    static bool             sRenderGlow;
+    static bool             sTextureBindTest;
+    static bool             sRenderFrameTest;
+    static bool             sRenderAttachedLights;
+    static bool             sRenderAttachedParticles;
+    static bool             sRenderDeferred;
+    static bool             sMemAllocationThrottled;
+    static S32              sVisibleLightCount;
+    static F32              sMinRenderSize;
+    static bool             sRenderingHUDs;
     static F32              sDistortionWaterClipPlaneMargin;
 
-	static LLTrace::EventStatHandle<S64> sStatBatchSize;
-
-	//screen texture
-	U32 					mScreenWidth;
-	U32 					mScreenHeight;
-	
-	LLRenderTarget			mScreen;
-	LLRenderTarget			mUIScreen;
-	LLRenderTarget			mDeferredScreen;
-	LLRenderTarget			mFXAABuffer;
-	LLRenderTarget			mEdgeMap;
-	LLRenderTarget			mDeferredDepth;
-	LLRenderTarget			mOcclusionDepth;
-	LLRenderTarget			mDeferredLight;
-	LLRenderTarget			mHighlight;
-	LLRenderTarget			mPhysicsDisplay;
+    static LLTrace::EventStatHandle<S64> sStatBatchSize;
+
+    //screen texture
+    U32                     mScreenWidth;
+    U32                     mScreenHeight;
+    
+    LLRenderTarget          mScreen;
+    LLRenderTarget          mUIScreen;
+    LLRenderTarget          mDeferredScreen;
+    LLRenderTarget          mFXAABuffer;
+    LLRenderTarget          mEdgeMap;
+    LLRenderTarget          mDeferredDepth;
+    LLRenderTarget          mOcclusionDepth;
+    LLRenderTarget          mDeferredLight;
+    LLRenderTarget          mHighlight;
+    LLRenderTarget          mPhysicsDisplay;
 
     LLCullResult            mSky;
     LLCullResult            mReflectedObjects;
     LLCullResult            mRefractedObjects;
 
-	//utility buffer for rendering post effects, gets abused by renderDeferredLighting
-	LLPointer<LLVertexBuffer> mDeferredVB;
-
-	//utility buffer for rendering cubes, 8 vertices are corners of a cube [-1, 1]
-	LLPointer<LLVertexBuffer> mCubeVB;
-
-	//sun shadow map
-	LLRenderTarget			mShadow[6];
-	LLRenderTarget			mShadowOcclusion[6];
-
-	std::vector<LLVector3>  mShadowFrustPoints[4];
-	LLVector4			    mShadowError;
-	LLVector4			    mShadowFOV;
-	LLVector3			    mShadowFrustOrigin[4];
-	LLCamera			    mShadowCamera[8];
-	LLVector3			    mShadowExtents[4][2];
-	glh::matrix4f			mSunShadowMatrix[6];
-	glh::matrix4f			mShadowModelview[6];
-	glh::matrix4f			mShadowProjection[6];
+    //utility buffer for rendering post effects, gets abused by renderDeferredLighting
+    LLPointer<LLVertexBuffer> mDeferredVB;
+
+    //utility buffer for rendering cubes, 8 vertices are corners of a cube [-1, 1]
+    LLPointer<LLVertexBuffer> mCubeVB;
+
+    //sun shadow map
+    LLRenderTarget          mShadow[6];
+    LLRenderTarget          mShadowOcclusion[6];
+
+    std::vector<LLVector3>  mShadowFrustPoints[4];
+    LLVector4               mShadowError;
+    LLVector4               mShadowFOV;
+    LLVector3               mShadowFrustOrigin[4];
+    LLCamera                mShadowCamera[8];
+    LLVector3               mShadowExtents[4][2];
+    glh::matrix4f           mSunShadowMatrix[6];
+    glh::matrix4f           mShadowModelview[6];
+    glh::matrix4f           mShadowProjection[6];
     glh::matrix4f           mReflectionModelView;
 
-	LLPointer<LLDrawable>	mShadowSpotLight[2];
-	F32						mSpotLightFade[2];
-	LLPointer<LLDrawable>	mTargetShadowSpotLight[2];
+    LLPointer<LLDrawable>   mShadowSpotLight[2];
+    F32                     mSpotLightFade[2];
+    LLPointer<LLDrawable>   mTargetShadowSpotLight[2];
 
-	LLVector4				mSunClipPlanes;
-	LLVector4				mSunOrthoClipPlanes;
-	LLVector2				mScreenScale;
+    LLVector4               mSunClipPlanes;
+    LLVector4               mSunOrthoClipPlanes;
+    LLVector2               mScreenScale;
 
-	//water reflection texture
-	LLRenderTarget				mWaterRef;
+    //water reflection texture
+    LLRenderTarget              mWaterRef;
 
-	//water distortion texture (refraction)
-	LLRenderTarget				mWaterDis;
+    //water distortion texture (refraction)
+    LLRenderTarget              mWaterDis;
 
-	//texture for making the glow
-	LLRenderTarget				mGlow[3];
+    //texture for making the glow
+    LLRenderTarget              mGlow[3];
 
-	//noise map
-	U32					mNoiseMap;
-	U32					mTrueNoiseMap;
-	U32					mLightFunc;
+    //noise map
+    U32                 mNoiseMap;
+    U32                 mTrueNoiseMap;
+    U32                 mLightFunc;
 
-	LLColor4			mSunDiffuse;
-    LLColor4			mMoonDiffuse;
-	LLVector4			mSunDir;
-    LLVector4			mMoonDir;
+    LLColor4            mSunDiffuse;
+    LLColor4            mMoonDiffuse;
+    LLVector4           mSunDir;
+    LLVector4           mMoonDir;
     bool                mNeedsShadowTargetClear;
 
-	LLVector4			mTransformedSunDir;
-    LLVector4			mTransformedMoonDir;
+    LLVector4           mTransformedSunDir;
+    LLVector4           mTransformedMoonDir;
 
-	bool					mInitialized;
-	bool					mVertexShadersEnabled;
-	S32						mVertexShadersLoaded; // 0 = no, 1 = yes, -1 = failed
+    bool                    mInitialized;
+    bool                    mVertexShadersEnabled;
+    S32                     mVertexShadersLoaded; // 0 = no, 1 = yes, -1 = failed
 
-	U32						mTransformFeedbackPrimitives; //number of primitives expected to be generated by transform feedback
+    U32                     mTransformFeedbackPrimitives; //number of primitives expected to be generated by transform feedback
 protected:
-	bool					mRenderTypeEnabled[NUM_RENDER_TYPES];
-	std::stack<std::string> mRenderTypeEnableStack;
-
-	U32						mRenderDebugFeatureMask;
-	U64						mRenderDebugMask;
-	U64						mOldRenderDebugMask;
-	std::stack<U32>			mRenderDebugFeatureStack;
-
-	
-	/////////////////////////////////////////////
-	//
-	//
-	LLDrawable::drawable_vector_t	mMovedList;
-	LLDrawable::drawable_vector_t mMovedBridge;
-	LLDrawable::drawable_vector_t	mShiftList;
-
-	/////////////////////////////////////////////
-	//
-	//
-	struct Light
-	{
-		Light(LLDrawable* ptr, F32 d, F32 f = 0.0f)
-			: drawable(ptr),
-			  dist(d),
-			  fade(f)
-		{}
-		LLPointer<LLDrawable> drawable;
-		F32 dist;
-		F32 fade;
-		struct compare
-		{
-			bool operator()(const Light& a, const Light& b) const
-			{
-				if ( a.dist < b.dist )
-					return true;
-				else if ( a.dist > b.dist )
-					return false;
-				else
-					return a.drawable < b.drawable;
-			}
-		};
-	};
-	typedef std::set< Light, Light::compare > light_set_t;
-	
-	LLDrawable::drawable_set_t		mLights;
-	light_set_t						mNearbyLights; // lights near camera
-	LLColor4						mHWLightColors[8];
-	
-	/////////////////////////////////////////////
-	//
-	// Different queues of drawables being processed.
-	//
-	LLDrawable::drawable_list_t 	mBuildQ1; // priority
-	LLDrawable::drawable_list_t 	mBuildQ2; // non-priority
-	LLSpatialGroup::sg_vector_t		mGroupQ1; //priority
-	LLSpatialGroup::sg_vector_t		mGroupQ2; // non-priority
-
-	LLSpatialGroup::sg_vector_t		mGroupSaveQ1; // a place to save mGroupQ1 until it is safe to unref
-
-	LLSpatialGroup::sg_vector_t		mMeshDirtyGroup; //groups that need rebuildMesh called
-	U32 mMeshDirtyQueryObject;
-
-	LLDrawable::drawable_list_t		mPartitionQ; //drawables that need to update their spatial partition radius 
-
-	bool mGroupQ2Locked;
-	bool mGroupQ1Locked;
-
-	bool mResetVertexBuffers; //if true, clear vertex buffers on next update
-
-	LLViewerObject::vobj_list_t		mCreateQ;
-		
-	LLDrawable::drawable_set_t		mRetexturedList;
-
-	class HighlightItem
-	{
-	public:
-		const LLPointer<LLDrawable> mItem;
-		mutable F32 mFade;
-
-		HighlightItem(LLDrawable* item)
-		: mItem(item), mFade(0)
-		{
-		}
-
-		bool operator<(const HighlightItem& rhs) const
-		{
-			return mItem < rhs.mItem;
-		}
-
-		bool operator==(const HighlightItem& rhs) const
-		{
-			return mItem == rhs.mItem;
-		}
-
-		void incrFade(F32 val) const
-		{
-			mFade = llclamp(mFade+val, 0.f, 1.f);
-		}
-	};
-
-	std::set<HighlightItem> mHighlightSet;
-	LLPointer<LLDrawable> mHighlightObject;
-
-	//////////////////////////////////////////////////
-	//
-	// Draw pools are responsible for storing all rendered data,
-	// and performing the actual rendering of objects.
-	//
-	struct compare_pools
-	{
-		bool operator()(const LLDrawPool* a, const LLDrawPool* b) const
-		{
-			if (!a)
-				return true;
-			else if (!b)
-				return false;
-			else
-			{
-				S32 atype = a->getType();
-				S32 btype = b->getType();
-				if (atype < btype)
-					return true;
-				else if (atype > btype)
-					return false;
-				else
-					return a->getId() < b->getId();
-			}
-		}
-	};
- 	typedef std::set<LLDrawPool*, compare_pools > pool_set_t;
-	pool_set_t mPools;
-	LLDrawPool*	mLastRebuildPool;
-	
-	// For quick-lookups into mPools (mapped by texture pointer)
-	std::map<uintptr_t, LLDrawPool*>	mTerrainPools;
-	std::map<uintptr_t, LLDrawPool*>	mTreePools;
-	LLDrawPoolAlpha*			mAlphaPool;
-	LLDrawPool*					mSkyPool;
-	LLDrawPool*					mTerrainPool;
-	LLDrawPool*					mWaterPool;
-	LLDrawPool*					mGroundPool;
-	LLRenderPass*				mSimplePool;
-	LLRenderPass*				mGrassPool;
-	LLRenderPass*				mAlphaMaskPool;
-	LLRenderPass*				mFullbrightAlphaMaskPool;
-	LLRenderPass*				mFullbrightPool;
-	LLDrawPool*					mInvisiblePool;
-	LLDrawPool*					mGlowPool;
-	LLDrawPool*					mBumpPool;
-	LLDrawPool*					mMaterialsPool;
-	LLDrawPool*					mWLSkyPool;
-	// Note: no need to keep an quick-lookup to avatar pools, since there's only one per avatar
-	
+    bool                    mRenderTypeEnabled[NUM_RENDER_TYPES];
+    std::stack<std::string> mRenderTypeEnableStack;
+
+    U32                     mRenderDebugFeatureMask;
+    U64                     mRenderDebugMask;
+    U64                     mOldRenderDebugMask;
+    std::stack<U32>         mRenderDebugFeatureStack;
+
+    
+    /////////////////////////////////////////////
+    //
+    //
+    LLDrawable::drawable_vector_t   mMovedList;
+    LLDrawable::drawable_vector_t mMovedBridge;
+    LLDrawable::drawable_vector_t   mShiftList;
+
+    /////////////////////////////////////////////
+    //
+    //
+    struct Light
+    {
+        Light(LLDrawable* ptr, F32 d, F32 f = 0.0f)
+            : drawable(ptr),
+              dist(d),
+              fade(f)
+        {}
+        LLPointer<LLDrawable> drawable;
+        F32 dist;
+        F32 fade;
+        struct compare
+        {
+            bool operator()(const Light& a, const Light& b) const
+            {
+                if ( a.dist < b.dist )
+                    return true;
+                else if ( a.dist > b.dist )
+                    return false;
+                else
+                    return a.drawable < b.drawable;
+            }
+        };
+    };
+    typedef std::set< Light, Light::compare > light_set_t;
+    
+    LLDrawable::drawable_set_t      mLights;
+    light_set_t                     mNearbyLights; // lights near camera
+    LLColor4                        mHWLightColors[8];
+    
+    /////////////////////////////////////////////
+    //
+    // Different queues of drawables being processed.
+    //
+    LLDrawable::drawable_list_t     mBuildQ1; // priority
+    LLDrawable::drawable_list_t     mBuildQ2; // non-priority
+    LLSpatialGroup::sg_vector_t     mGroupQ1; //priority
+    LLSpatialGroup::sg_vector_t     mGroupQ2; // non-priority
+
+    LLSpatialGroup::sg_vector_t     mGroupSaveQ1; // a place to save mGroupQ1 until it is safe to unref
+
+    LLSpatialGroup::sg_vector_t     mMeshDirtyGroup; //groups that need rebuildMesh called
+    U32 mMeshDirtyQueryObject;
+
+    LLDrawable::drawable_list_t     mPartitionQ; //drawables that need to update their spatial partition radius 
+
+    bool mGroupQ2Locked;
+    bool mGroupQ1Locked;
+
+    bool mResetVertexBuffers; //if true, clear vertex buffers on next update
+
+    LLViewerObject::vobj_list_t     mCreateQ;
+        
+    LLDrawable::drawable_set_t      mRetexturedList;
+
+    class HighlightItem
+    {
+    public:
+        const LLPointer<LLDrawable> mItem;
+        mutable F32 mFade;
+
+        HighlightItem(LLDrawable* item)
+        : mItem(item), mFade(0)
+        {
+        }
+
+        bool operator<(const HighlightItem& rhs) const
+        {
+            return mItem < rhs.mItem;
+        }
+
+        bool operator==(const HighlightItem& rhs) const
+        {
+            return mItem == rhs.mItem;
+        }
+
+        void incrFade(F32 val) const
+        {
+            mFade = llclamp(mFade+val, 0.f, 1.f);
+        }
+    };
+
+    std::set<HighlightItem> mHighlightSet;
+    LLPointer<LLDrawable> mHighlightObject;
+
+    //////////////////////////////////////////////////
+    //
+    // Draw pools are responsible for storing all rendered data,
+    // and performing the actual rendering of objects.
+    //
+    struct compare_pools
+    {
+        bool operator()(const LLDrawPool* a, const LLDrawPool* b) const
+        {
+            if (!a)
+                return true;
+            else if (!b)
+                return false;
+            else
+            {
+                S32 atype = a->getType();
+                S32 btype = b->getType();
+                if (atype < btype)
+                    return true;
+                else if (atype > btype)
+                    return false;
+                else
+                    return a->getId() < b->getId();
+            }
+        }
+    };
+    typedef std::set<LLDrawPool*, compare_pools > pool_set_t;
+    pool_set_t mPools;
+    LLDrawPool* mLastRebuildPool;
+    
+    // For quick-lookups into mPools (mapped by texture pointer)
+    std::map<uintptr_t, LLDrawPool*>    mTerrainPools;
+    std::map<uintptr_t, LLDrawPool*>    mTreePools;
+    LLDrawPoolAlpha*            mAlphaPool;
+    LLDrawPool*                 mSkyPool;
+    LLDrawPool*                 mTerrainPool;
+    LLDrawPool*                 mWaterPool;
+    LLDrawPool*                 mGroundPool;
+    LLRenderPass*               mSimplePool;
+    LLRenderPass*               mGrassPool;
+    LLRenderPass*               mAlphaMaskPool;
+    LLRenderPass*               mFullbrightAlphaMaskPool;
+    LLRenderPass*               mFullbrightPool;
+    LLDrawPool*                 mInvisiblePool;
+    LLDrawPool*                 mGlowPool;
+    LLDrawPool*                 mBumpPool;
+    LLDrawPool*                 mMaterialsPool;
+    LLDrawPool*                 mWLSkyPool;
+    // Note: no need to keep an quick-lookup to avatar pools, since there's only one per avatar
+    
 public:
-	std::vector<LLFace*>		mHighlightFaces;	// highlight faces on physical objects
+    std::vector<LLFace*>        mHighlightFaces;    // highlight faces on physical objects
 protected:
-	std::vector<LLFace*>		mSelectedFaces;
-
-	class DebugBlip
-	{
-	public:
-		LLColor4 mColor;
-		LLVector3 mPosition;
-		F32 mAge;
-
-		DebugBlip(const LLVector3& position, const LLColor4& color)
-			: mColor(color), mPosition(position), mAge(0.f)
-		{ }
-	};
-
-	std::list<DebugBlip> mDebugBlips;
-
-	LLPointer<LLViewerFetchedTexture>	mFaceSelectImagep;
-	
-	U32						mLightMask;
-	U32						mLightMovingMask;
-	S32						mLightingDetail;
-		
-	static bool				sRenderPhysicalBeacons;
-	static bool				sRenderMOAPBeacons;
-	static bool				sRenderScriptedTouchBeacons;
-	static bool				sRenderScriptedBeacons;
-	static bool				sRenderParticleBeacons;
-	static bool				sRenderSoundBeacons;
+    std::vector<LLFace*>        mSelectedFaces;
+
+    class DebugBlip
+    {
+    public:
+        LLColor4 mColor;
+        LLVector3 mPosition;
+        F32 mAge;
+
+        DebugBlip(const LLVector3& position, const LLColor4& color)
+            : mColor(color), mPosition(position), mAge(0.f)
+        { }
+    };
+
+    std::list<DebugBlip> mDebugBlips;
+
+    LLPointer<LLViewerFetchedTexture>   mFaceSelectImagep;
+    
+    U32                     mLightMask;
+    U32                     mLightMovingMask;
+    S32                     mLightingDetail;
+        
+    static bool             sRenderPhysicalBeacons;
+    static bool             sRenderMOAPBeacons;
+    static bool             sRenderScriptedTouchBeacons;
+    static bool             sRenderScriptedBeacons;
+    static bool             sRenderParticleBeacons;
+    static bool             sRenderSoundBeacons;
 public:
-	static bool				sRenderBeacons;
-	static bool				sRenderHighlight;
-
-	// Determines which set of UVs to use in highlight display
-	//
-	static LLRender::eTexIndex sRenderHighlightTextureChannel;
-
-	//debug use
-	static U32              sCurRenderPoolType ;
-
-	//cached settings
-	static bool WindLightUseAtmosShaders;
-	static bool VertexShaderEnable;
-	static bool RenderAvatarVP;
-	static bool RenderDeferred;
-	static F32 RenderDeferredSunWash;
-	static U32 RenderFSAASamples;
-	static U32 RenderResolutionDivisor;
-	static bool RenderUIBuffer;
-	static S32 RenderShadowDetail;
-	static bool RenderDeferredSSAO;
-	static F32 RenderShadowResolutionScale;
-	static bool RenderLocalLights;
-	static bool RenderDelayCreation;
-	static bool RenderAnimateRes;
-	static bool FreezeTime;
-	static S32 DebugBeaconLineWidth;
-	static F32 RenderHighlightBrightness;
-	static LLColor4 RenderHighlightColor;
-	static F32 RenderHighlightThickness;
-	static bool RenderSpotLightsInNondeferred;
-	static LLColor4 PreviewAmbientColor;
-	static LLColor4 PreviewDiffuse0;
-	static LLColor4 PreviewSpecular0;
-	static LLColor4 PreviewDiffuse1;
-	static LLColor4 PreviewSpecular1;
-	static LLColor4 PreviewDiffuse2;
-	static LLColor4 PreviewSpecular2;
-	static LLVector3 PreviewDirection0;
-	static LLVector3 PreviewDirection1;
-	static LLVector3 PreviewDirection2;
-	static F32 RenderGlowMinLuminance;
-	static F32 RenderGlowMaxExtractAlpha;
-	static F32 RenderGlowWarmthAmount;
-	static LLVector3 RenderGlowLumWeights;
-	static LLVector3 RenderGlowWarmthWeights;
-	static S32 RenderGlowResolutionPow;
-	static S32 RenderGlowIterations;
-	static F32 RenderGlowWidth;
-	static F32 RenderGlowStrength;
-	static bool RenderDepthOfField;
-	static bool RenderDepthOfFieldInEditMode;
-	static F32 CameraFocusTransitionTime;
-	static F32 CameraFNumber;
-	static F32 CameraFocalLength;
-	static F32 CameraFieldOfView;
-	static F32 RenderShadowNoise;
-	static F32 RenderShadowBlurSize;
-	static F32 RenderSSAOScale;
-	static U32 RenderSSAOMaxScale;
-	static F32 RenderSSAOFactor;
-	static LLVector3 RenderSSAOEffect;
-	static F32 RenderShadowOffsetError;
-	static F32 RenderShadowBiasError;
-	static F32 RenderShadowOffset;
-	static F32 RenderShadowBias;
-	static F32 RenderSpotShadowOffset;
-	static F32 RenderSpotShadowBias;
-	static F32 RenderEdgeDepthCutoff;
-	static F32 RenderEdgeNormCutoff;
-	static LLVector3 RenderShadowGaussian;
-	static F32 RenderShadowBlurDistFactor;
-	static bool RenderDeferredAtmospheric;
-	static S32 RenderReflectionDetail;
-	static F32 RenderHighlightFadeTime;
-	static LLVector3 RenderShadowClipPlanes;
-	static LLVector3 RenderShadowOrthoClipPlanes;
-	static LLVector3 RenderShadowNearDist;
-	static F32 RenderFarClip;
-	static LLVector3 RenderShadowSplitExponent;
-	static F32 RenderShadowErrorCutoff;
-	static F32 RenderShadowFOVCutoff;
-	static bool CameraOffset;
-	static F32 CameraMaxCoF;
-	static F32 CameraDoFResScale;
-	static F32 RenderAutoHideSurfaceAreaLimit;
+    static bool             sRenderBeacons;
+    static bool             sRenderHighlight;
+
+    // Determines which set of UVs to use in highlight display
+    //
+    static LLRender::eTexIndex sRenderHighlightTextureChannel;
+
+    //debug use
+    static U32              sCurRenderPoolType ;
+
+    //cached settings
+    static bool WindLightUseAtmosShaders;
+    static bool VertexShaderEnable;
+    static bool RenderAvatarVP;
+    static bool RenderDeferred;
+    static F32 RenderDeferredSunWash;
+    static U32 RenderFSAASamples;
+    static U32 RenderResolutionDivisor;
+    static bool RenderUIBuffer;
+    static S32 RenderShadowDetail;
+    static bool RenderDeferredSSAO;
+    static F32 RenderShadowResolutionScale;
+    static bool RenderLocalLights;
+    static bool RenderDelayCreation;
+    static bool RenderAnimateRes;
+    static bool FreezeTime;
+    static S32 DebugBeaconLineWidth;
+    static F32 RenderHighlightBrightness;
+    static LLColor4 RenderHighlightColor;
+    static F32 RenderHighlightThickness;
+    static bool RenderSpotLightsInNondeferred;
+    static LLColor4 PreviewAmbientColor;
+    static LLColor4 PreviewDiffuse0;
+    static LLColor4 PreviewSpecular0;
+    static LLColor4 PreviewDiffuse1;
+    static LLColor4 PreviewSpecular1;
+    static LLColor4 PreviewDiffuse2;
+    static LLColor4 PreviewSpecular2;
+    static LLVector3 PreviewDirection0;
+    static LLVector3 PreviewDirection1;
+    static LLVector3 PreviewDirection2;
+    static F32 RenderGlowMinLuminance;
+    static F32 RenderGlowMaxExtractAlpha;
+    static F32 RenderGlowWarmthAmount;
+    static LLVector3 RenderGlowLumWeights;
+    static LLVector3 RenderGlowWarmthWeights;
+    static S32 RenderGlowResolutionPow;
+    static S32 RenderGlowIterations;
+    static F32 RenderGlowWidth;
+    static F32 RenderGlowStrength;
+    static bool RenderDepthOfField;
+    static bool RenderDepthOfFieldInEditMode;
+    static F32 CameraFocusTransitionTime;
+    static F32 CameraFNumber;
+    static F32 CameraFocalLength;
+    static F32 CameraFieldOfView;
+    static F32 RenderShadowNoise;
+    static F32 RenderShadowBlurSize;
+    static F32 RenderSSAOScale;
+    static U32 RenderSSAOMaxScale;
+    static F32 RenderSSAOFactor;
+    static LLVector3 RenderSSAOEffect;
+    static F32 RenderShadowOffsetError;
+    static F32 RenderShadowBiasError;
+    static F32 RenderShadowOffset;
+    static F32 RenderShadowBias;
+    static F32 RenderSpotShadowOffset;
+    static F32 RenderSpotShadowBias;
+    static F32 RenderEdgeDepthCutoff;
+    static F32 RenderEdgeNormCutoff;
+    static LLVector3 RenderShadowGaussian;
+    static F32 RenderShadowBlurDistFactor;
+    static bool RenderDeferredAtmospheric;
+    static S32 RenderReflectionDetail;
+    static F32 RenderHighlightFadeTime;
+    static LLVector3 RenderShadowClipPlanes;
+    static LLVector3 RenderShadowOrthoClipPlanes;
+    static LLVector3 RenderShadowNearDist;
+    static F32 RenderFarClip;
+    static LLVector3 RenderShadowSplitExponent;
+    static F32 RenderShadowErrorCutoff;
+    static F32 RenderShadowFOVCutoff;
+    static bool CameraOffset;
+    static F32 CameraMaxCoF;
+    static F32 CameraDoFResScale;
+    static F32 RenderAutoHideSurfaceAreaLimit;
 };
 
 void render_bbox(const LLVector3 &min, const LLVector3 &max);
-- 
GitLab