From 2f95a549a365ca2bedf7824014a687b3af88e20f Mon Sep 17 00:00:00 2001
From: Dave Parks <davep@lindenlab.com>
Date: Sat, 1 May 2010 01:55:21 -0500
Subject: [PATCH] Fullbrigt skinned and fix for silly crash from not removing
 face references.

---
 .../shaders/class1/objects/shinyV.glsl        |  2 +-
 indra/newview/lldrawpoolavatar.cpp            | 40 ++++++++++++++++++-
 indra/newview/lldrawpoolavatar.h              |  5 ++-
 indra/newview/llface.cpp                      | 13 ++++--
 indra/newview/llviewershadermgr.cpp           | 19 +++++++++
 indra/newview/llviewershadermgr.h             |  1 +
 indra/newview/llvovolume.cpp                  |  9 ++++-
 7 files changed, 81 insertions(+), 8 deletions(-)

diff --git a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
index c2e1ddf734f..101458c438d 100644
--- a/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
+++ b/indra/newview/app_settings/shaders/class1/objects/shinyV.glsl
@@ -12,7 +12,7 @@ uniform vec4 origin;
 void main()
 {
 	//transform vertex
-	gl_Position = ftransform(); //gl_ModelViewProjectionMatrix * gl_Vertex;
+	gl_Position = ftransform();
 	
 	vec4 pos = (gl_ModelViewMatrix * gl_Vertex);
 	vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 02c7e3bb6f6..9463be6059f 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -364,7 +364,7 @@ S32 LLDrawPoolAvatar::getNumPasses()
 	}
 	else if (getVertexShaderLevel() > 0)
 	{
-		return 5;
+		return 6;
 	}
 	else
 	{
@@ -411,6 +411,9 @@ void LLDrawPoolAvatar::beginRenderPass(S32 pass)
 		beginRiggedSimple();
 		break;
 	case 4:
+		beginRiggedFullbright();
+		break;
+	case 5:
 		beginRiggedShinySimple();
 		break;
 	}
@@ -441,6 +444,9 @@ void LLDrawPoolAvatar::endRenderPass(S32 pass)
 		endRiggedSimple();
 		break;
 	case 4:
+		endRiggedFullbright();
+		break;
+	case 5:
 		endRiggedShinySimple();
 		break;
 	}
@@ -644,6 +650,22 @@ void LLDrawPoolAvatar::endRiggedSimple()
 	LLVertexBuffer::sWeight4Loc = -1;
 }
 
+void LLDrawPoolAvatar::beginRiggedFullbright()
+{
+	sVertexProgram = &gSkinnedObjectFullbrightProgram;
+	diffuse_channel = 0;
+	gSkinnedObjectFullbrightProgram.bind();
+	LLVertexBuffer::sWeight4Loc = gSkinnedObjectFullbrightProgram.getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
+}
+
+void LLDrawPoolAvatar::endRiggedFullbright()
+{
+	sVertexProgram = NULL;
+	LLVertexBuffer::unbind();
+	gSkinnedObjectFullbrightProgram.unbind();
+	LLVertexBuffer::sWeight4Loc = -1;
+}
+
 void LLDrawPoolAvatar::beginRiggedShinySimple()
 {
 	sVertexProgram = &gSkinnedObjectShinySimpleProgram;
@@ -825,6 +847,12 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
 	}
 
 	if (pass == 4)
+	{
+		renderRiggedFullbright(avatarp);
+		return;
+	}
+
+	if (pass == 5)
 	{
 		renderRiggedShinySimple(avatarp);
 		return;
@@ -990,6 +1018,16 @@ void LLDrawPoolAvatar::renderRiggedSimple(LLVOAvatar* avatar)
 	renderRigged(avatar, RIGGED_SIMPLE, data_mask);
 }
 
+void LLDrawPoolAvatar::renderRiggedFullbright(LLVOAvatar* avatar)
+{
+	const U32 data_mask =	LLVertexBuffer::MAP_VERTEX | 
+							LLVertexBuffer::MAP_TEXCOORD0 |
+							LLVertexBuffer::MAP_COLOR |
+							LLVertexBuffer::MAP_WEIGHT4;
+
+	renderRigged(avatar, RIGGED_FULLBRIGHT, data_mask);
+}
+
 	
 void LLDrawPoolAvatar::renderRiggedShinySimple(LLVOAvatar* avatar)
 {
diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h
index 0ebb035f2a4..84430693768 100644
--- a/indra/newview/lldrawpoolavatar.h
+++ b/indra/newview/lldrawpoolavatar.h
@@ -97,12 +97,14 @@ class LLDrawPoolAvatar : public LLFacePool
 	void beginImpostor();
 	void beginSkinned();
 	void beginRiggedSimple();
+	void beginRiggedFullbright();
 	void beginRiggedShinySimple();
 
 	void endRigid();
 	void endImpostor();
 	void endSkinned();
 	void endRiggedSimple();
+	void endRiggedFullbright();
 	void endRiggedShinySimple();
 
 	void beginDeferredImpostor();
@@ -123,6 +125,7 @@ class LLDrawPoolAvatar : public LLFacePool
 
 	void renderRigged(LLVOAvatar* avatar, U32 type, const U32 data_mask);
 	void renderRiggedSimple(LLVOAvatar* avatar);
+	void renderRiggedFullbright(LLVOAvatar* avatar);
 	void renderRiggedShinySimple(LLVOAvatar* avatar);
 
 	/*virtual*/ LLViewerTexture *getDebugTexture();
@@ -133,11 +136,11 @@ class LLDrawPoolAvatar : public LLFacePool
 	typedef enum
 	{
 		RIGGED_SIMPLE = 0,
+		RIGGED_FULLBRIGHT,
 		RIGGED_SHINY_SIMPLE,
 		RIGGED_SHINY_FULLBRIGHT,
 		RIGGED_SHINY_BUMP,
 		RIGGED_BUMP,
-		RIGGED_FULLBRIGHT,
 		RIGGED_ALPHA,
 		NUM_RIGGED_PASSES,
 		RIGGED_UNKNOWN,
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 0e0b8447caf..9df692e787e 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -41,6 +41,7 @@
 #include "m3math.h"
 #include "v3color.h"
 
+#include "lldrawpoolavatar.h"
 #include "lldrawpoolbump.h"
 #include "llgl.h"
 #include "llrender.h"
@@ -207,10 +208,14 @@ void LLFace::destroy()
 		LLFastTimer t(FTM_DESTROY_DRAWPOOL);
 
 		if (this->isState(LLFace::RIGGED) && mDrawPoolp->getType() == LLDrawPool::POOL_AVATAR)
-		mDrawPoolp->removeFace(this);
-
-		
-		
+		{
+			((LLDrawPoolAvatar*) mDrawPoolp)->removeRiggedFace(this);
+		}
+		else
+		{
+			mDrawPoolp->removeFace(this);
+		}
+	
 		mDrawPoolp = NULL;
 	}
 
diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp
index fe68d6eaa4c..3cc5b4357ac 100644
--- a/indra/newview/llviewershadermgr.cpp
+++ b/indra/newview/llviewershadermgr.cpp
@@ -79,6 +79,7 @@ LLGLSLShader		gObjectShinyWaterProgram;
 
 //object hardware skinning shaders
 LLGLSLShader		gSkinnedObjectSimpleProgram;
+LLGLSLShader		gSkinnedObjectFullbrightProgram;
 LLGLSLShader		gSkinnedObjectShinySimpleProgram;
 
 //environment shaders
@@ -155,6 +156,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
 	mShaderList.push_back(&gObjectFullbrightProgram);
 	mShaderList.push_back(&gObjectFullbrightShinyProgram);
 	mShaderList.push_back(&gSkinnedObjectSimpleProgram);
+	mShaderList.push_back(&gSkinnedObjectFullbrightProgram);
 	mShaderList.push_back(&gSkinnedObjectShinySimpleProgram);
 	mShaderList.push_back(&gTerrainProgram);
 	mShaderList.push_back(&gTerrainWaterProgram);
@@ -562,6 +564,7 @@ void LLViewerShaderMgr::unloadShaders()
 	gObjectShinyWaterProgram.unload();
 
 	gSkinnedObjectSimpleProgram.unload();
+	gSkinnedObjectFullbrightProgram.unload();
 	gSkinnedObjectShinySimpleProgram.unload();
 	
 
@@ -1258,6 +1261,7 @@ BOOL LLViewerShaderMgr::loadShadersObject()
 		gObjectFullbrightProgram.unload();
 		gObjectFullbrightWaterProgram.unload();
 		gSkinnedObjectSimpleProgram.unload();
+		gSkinnedObjectFullbrightProgram.unload();
 		gSkinnedObjectShinySimpleProgram.unload();
 	
 		return FALSE;
@@ -1385,6 +1389,21 @@ BOOL LLViewerShaderMgr::loadShadersObject()
 		success = gSkinnedObjectSimpleProgram.createShader(NULL, NULL);
 	}
 
+	if (success)
+	{
+		gSkinnedObjectFullbrightProgram.mName = "Skinned Fullbright Shader";
+		gSkinnedObjectFullbrightProgram.mFeatures.calculatesAtmospherics = true;
+		gSkinnedObjectFullbrightProgram.mFeatures.hasGamma = true;
+		gSkinnedObjectFullbrightProgram.mFeatures.hasTransport = true;
+		gSkinnedObjectFullbrightProgram.mFeatures.isFullbright = true;
+		gSkinnedObjectFullbrightProgram.mFeatures.hasObjectSkinning = true;
+		gSkinnedObjectFullbrightProgram.mShaderFiles.clear();
+		gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
+		gSkinnedObjectFullbrightProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
+		gSkinnedObjectFullbrightProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
+		success = gSkinnedObjectFullbrightProgram.createShader(NULL, NULL);
+	}
+
 	if (success)
 	{
 		gSkinnedObjectShinySimpleProgram.mName = "Skinned Shiny Simple Shader";
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index beac5462e2d..b4fc336bf31 100644
--- a/indra/newview/llviewershadermgr.h
+++ b/indra/newview/llviewershadermgr.h
@@ -315,6 +315,7 @@ extern LLGLSLShader			gObjectShinyProgram;
 extern LLGLSLShader			gObjectShinyWaterProgram;
 
 extern LLGLSLShader			gSkinnedObjectSimpleProgram;
+extern LLGLSLShader			gSkinnedObjectFullbrightProgram;
 extern LLGLSLShader			gSkinnedObjectShinySimpleProgram;
 
 //environment shaders
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index e49b33bd80d..3449c05be8e 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -3551,7 +3551,14 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 						}
 						else
 						{
-							pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
+							if (te->getFullbright())
+							{
+								pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT);
+							}
+							else
+							{
+								pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
+							}
 						}
 					}
 
-- 
GitLab