summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Parks <davep@lindenlab.com>2010-05-01 01:55:21 -0500
committerDave Parks <davep@lindenlab.com>2010-05-01 01:55:21 -0500
commit2f95a549a365ca2bedf7824014a687b3af88e20f (patch)
tree26d87b108ffd4730d29ae9ebed2f34154c904e86
parentad8fb0e1bb6c242cc84aa3d2cfaabc9ee36e39b6 (diff)
Fullbrigt skinned and fix for silly crash from not removing face references.
-rw-r--r--indra/newview/app_settings/shaders/class1/objects/shinyV.glsl2
-rw-r--r--indra/newview/lldrawpoolavatar.cpp40
-rw-r--r--indra/newview/lldrawpoolavatar.h5
-rw-r--r--indra/newview/llface.cpp13
-rw-r--r--indra/newview/llviewershadermgr.cpp19
-rw-r--r--indra/newview/llviewershadermgr.h1
-rw-r--r--indra/newview/llvovolume.cpp9
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 c2e1ddf734..101458c438 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 02c7e3bb6f..9463be6059 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;
@@ -826,6 +848,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 0ebb035f2a..8443069376 100644
--- a/indra/newview/lldrawpoolavatar.h
+++ b/indra/newview/lldrawpoolavatar.h
@@ -97,12 +97,14 @@ public:
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 @@ public:
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 @@ public:
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 0e0b8447ca..9df692e787 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 fe68d6eaa4..3cc5b4357a 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;
@@ -1387,6 +1391,21 @@ BOOL LLViewerShaderMgr::loadShadersObject()
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";
gSkinnedObjectShinySimpleProgram.mFeatures.calculatesLighting = true;
gSkinnedObjectShinySimpleProgram.mFeatures.calculatesAtmospherics = true;
diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h
index beac5462e2..b4fc336bf3 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 e49b33bd80..3449c05be8 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);
+ }
}
}