Mats.
This commit is contained in:
@@ -55,6 +55,7 @@
|
||||
#include "llappviewer.h"
|
||||
#include "llrendersphere.h"
|
||||
#include "llviewerpartsim.h"
|
||||
#include "llviewercontrol.h" // for gSavedSettings
|
||||
|
||||
static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK;
|
||||
static U32 sBufferUsage = GL_STREAM_DRAW_ARB;
|
||||
@@ -65,9 +66,11 @@ LLGLSLShader* LLDrawPoolAvatar::sVertexProgram = NULL;
|
||||
BOOL LLDrawPoolAvatar::sSkipOpaque = FALSE;
|
||||
BOOL LLDrawPoolAvatar::sSkipTransparent = FALSE;
|
||||
S32 LLDrawPoolAvatar::sDiffuseChannel = 0;
|
||||
F32 LLDrawPoolAvatar::sMinimumAlpha = 0.2f;
|
||||
|
||||
|
||||
static bool is_deferred_render = false;
|
||||
static bool is_post_deferred_render = false;
|
||||
|
||||
extern BOOL gUseGLPick;
|
||||
|
||||
@@ -197,6 +200,9 @@ void LLDrawPoolAvatar::beginDeferredPass(S32 pass)
|
||||
case 4:
|
||||
beginDeferredRiggedBump();
|
||||
break;
|
||||
default:
|
||||
beginDeferredRiggedMaterial(pass-5);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -229,6 +235,9 @@ void LLDrawPoolAvatar::endDeferredPass(S32 pass)
|
||||
case 4:
|
||||
endDeferredRiggedBump();
|
||||
break;
|
||||
default:
|
||||
endDeferredRiggedMaterial(pass-5);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -239,7 +248,7 @@ void LLDrawPoolAvatar::renderDeferred(S32 pass)
|
||||
|
||||
S32 LLDrawPoolAvatar::getNumPostDeferredPasses()
|
||||
{
|
||||
return 6;
|
||||
return 10;
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass)
|
||||
@@ -261,9 +270,12 @@ void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass)
|
||||
case 4:
|
||||
beginRiggedFullbrightAlpha();
|
||||
break;
|
||||
case 5:
|
||||
case 9:
|
||||
beginRiggedGlow();
|
||||
break;
|
||||
default:
|
||||
beginDeferredRiggedMaterialAlpha(pass-5);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,7 +288,7 @@ void LLDrawPoolAvatar::beginPostDeferredAlpha()
|
||||
|
||||
gPipeline.bindDeferredShader(*sVertexProgram);
|
||||
|
||||
sVertexProgram->setMinimumAlpha(0.2f);
|
||||
sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha);
|
||||
|
||||
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
|
||||
}
|
||||
@@ -289,11 +301,34 @@ void LLDrawPoolAvatar::beginDeferredRiggedAlpha()
|
||||
gPipeline.enableLightsDynamic();
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::beginDeferredRiggedMaterialAlpha(S32 pass)
|
||||
{
|
||||
switch (pass)
|
||||
{
|
||||
case 0: pass = 1; break;
|
||||
case 1: pass = 5; break;
|
||||
case 2: pass = 9; break;
|
||||
default: pass = 13; break;
|
||||
}
|
||||
pass += LLMaterial::SHADER_COUNT;
|
||||
sVertexProgram = &gDeferredMaterialProgram[pass];
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
sVertexProgram = &(gDeferredMaterialWaterProgram[pass]);
|
||||
}
|
||||
gPipeline.bindDeferredShader(*sVertexProgram);
|
||||
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
|
||||
normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP);
|
||||
specular_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::SPECULAR_MAP);
|
||||
gPipeline.enableLightsDynamic();
|
||||
}
|
||||
void LLDrawPoolAvatar::endDeferredRiggedAlpha()
|
||||
{
|
||||
LLVertexBuffer::unbind();
|
||||
gPipeline.unbindDeferredShader(*sVertexProgram);
|
||||
sDiffuseChannel = 0;
|
||||
normal_channel = -1;
|
||||
specular_channel = -1;
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
|
||||
@@ -319,6 +354,9 @@ void LLDrawPoolAvatar::endPostDeferredPass(S32 pass)
|
||||
case 5:
|
||||
endRiggedGlow();
|
||||
break;
|
||||
default:
|
||||
endDeferredRiggedAlpha();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -343,16 +381,22 @@ void LLDrawPoolAvatar::renderPostDeferred(S32 pass)
|
||||
7, //rigged alpha
|
||||
8, //rigged fullbright alpha
|
||||
9, //rigged glow
|
||||
10,//rigged material alpha 2
|
||||
11,//rigged material alpha 3
|
||||
12,//rigged material alpha 4
|
||||
13, //rigged glow
|
||||
};
|
||||
|
||||
pass = actual_pass[pass];
|
||||
S32 p = actual_pass[pass];
|
||||
|
||||
if (LLPipeline::sImpostorRender)
|
||||
{ //HACK for impostors so actual pass ends up being proper pass
|
||||
pass -= 2;
|
||||
p -= 2;
|
||||
}
|
||||
|
||||
render(pass);
|
||||
is_post_deferred_render = true;
|
||||
render(p);
|
||||
is_post_deferred_render = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -439,12 +483,10 @@ void LLDrawPoolAvatar::renderShadow(S32 pass)
|
||||
}
|
||||
else
|
||||
{
|
||||
renderRigged(avatarp, RIGGED_SIMPLE);
|
||||
renderRigged(avatarp, RIGGED_ALPHA);
|
||||
renderRigged(avatarp, RIGGED_FULLBRIGHT);
|
||||
renderRigged(avatarp, RIGGED_FULLBRIGHT_SHINY);
|
||||
renderRigged(avatarp, RIGGED_SHINY);
|
||||
renderRigged(avatarp, RIGGED_FULLBRIGHT_ALPHA);
|
||||
for (U32 i = 0; i < NUM_RIGGED_PASSES; ++i)
|
||||
{
|
||||
renderRigged(avatarp, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -465,11 +507,11 @@ S32 LLDrawPoolAvatar::getNumDeferredPasses()
|
||||
{
|
||||
if (LLPipeline::sImpostorRender)
|
||||
{
|
||||
return 3;
|
||||
return 19;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 5;
|
||||
return 21;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -624,7 +666,7 @@ void LLDrawPoolAvatar::beginRigid()
|
||||
if (sVertexProgram != NULL)
|
||||
{ //eyeballs render with the specular shader
|
||||
sVertexProgram->bind();
|
||||
sVertexProgram->setMinimumAlpha(0.2f);
|
||||
sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha);
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -666,8 +708,9 @@ void LLDrawPoolAvatar::endDeferredImpostor()
|
||||
sVertexProgram->disableTexture(LLViewerShaderMgr::DEFERRED_NORMAL);
|
||||
sVertexProgram->disableTexture(LLViewerShaderMgr::SPECULAR_MAP);
|
||||
sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
|
||||
sVertexProgram->unbind();
|
||||
gGL.getTexUnit(0)->activate();
|
||||
gPipeline.unbindDeferredShader(*sVertexProgram);
|
||||
sVertexProgram = NULL;
|
||||
sDiffuseChannel = 0;
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::beginDeferredRigid()
|
||||
@@ -675,7 +718,7 @@ void LLDrawPoolAvatar::beginDeferredRigid()
|
||||
sVertexProgram = &gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
|
||||
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
|
||||
sVertexProgram->bind();
|
||||
sVertexProgram->setMinimumAlpha(0.2f);
|
||||
sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endDeferredRigid()
|
||||
@@ -733,7 +776,7 @@ void LLDrawPoolAvatar::beginSkinned()
|
||||
|
||||
if (LLGLSLShader::sNoFixedFunction)
|
||||
{
|
||||
sVertexProgram->setMinimumAlpha(0.2f);
|
||||
sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -853,6 +896,9 @@ void LLDrawPoolAvatar::beginRiggedGlow()
|
||||
{
|
||||
sDiffuseChannel = 0;
|
||||
sVertexProgram->bind();
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, LLPipeline::sRenderDeferred ? 2.2f : 1.1f);
|
||||
//F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
|
||||
//sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -871,7 +917,14 @@ void LLDrawPoolAvatar::beginRiggedFullbright()
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LLPipeline::sRenderDeferred)
|
||||
{
|
||||
sVertexProgram = &gDeferredSkinnedFullbrightProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectFullbrightProgram;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -890,6 +943,16 @@ void LLDrawPoolAvatar::beginRiggedFullbright()
|
||||
{
|
||||
sDiffuseChannel = 0;
|
||||
sVertexProgram->bind();
|
||||
if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred)
|
||||
{
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
|
||||
//F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
|
||||
//sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -956,7 +1019,14 @@ void LLDrawPoolAvatar::beginRiggedFullbrightShiny()
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LLPipeline::sRenderDeferred)
|
||||
{
|
||||
sVertexProgram = &gDeferredSkinnedFullbrightShinyProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectFullbrightShinyProgram;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -976,6 +1046,16 @@ void LLDrawPoolAvatar::beginRiggedFullbrightShiny()
|
||||
{
|
||||
sVertexProgram->bind();
|
||||
LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
|
||||
if (LLPipeline::sRenderingHUDs || !LLPipeline::sRenderDeferred)
|
||||
{
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 1.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram->uniform1f(LLShaderMgr::TEXTURE_GAMMA, 2.2f);
|
||||
//F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
|
||||
//sVertexProgram->uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f/2.2f));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1024,6 +1104,43 @@ void LLDrawPoolAvatar::endDeferredRiggedBump()
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::beginDeferredRiggedMaterial(S32 pass)
|
||||
{
|
||||
if (pass == 1 ||
|
||||
pass == 5 ||
|
||||
pass == 9 ||
|
||||
pass == 13)
|
||||
{ //skip alpha passes
|
||||
return;
|
||||
}
|
||||
sVertexProgram = &gDeferredMaterialProgram[pass+LLMaterial::SHADER_COUNT];
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
sVertexProgram = &(gDeferredMaterialWaterProgram[pass+LLMaterial::SHADER_COUNT]);
|
||||
}
|
||||
sVertexProgram->bind();
|
||||
normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP);
|
||||
specular_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::SPECULAR_MAP);
|
||||
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
|
||||
}
|
||||
void LLDrawPoolAvatar::endDeferredRiggedMaterial(S32 pass)
|
||||
{
|
||||
if (pass == 1 ||
|
||||
pass == 5 ||
|
||||
pass == 9 ||
|
||||
pass == 13)
|
||||
{
|
||||
return;
|
||||
}
|
||||
LLVertexBuffer::unbind();
|
||||
sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP);
|
||||
sVertexProgram->disableTexture(LLViewerShaderMgr::SPECULAR_MAP);
|
||||
sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
|
||||
sVertexProgram->unbind();
|
||||
normal_channel = -1;
|
||||
sDiffuseChannel = 0;
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
void LLDrawPoolAvatar::beginDeferredSkinned()
|
||||
{
|
||||
sShaderLevel = mVertexShaderLevel;
|
||||
@@ -1031,7 +1148,7 @@ void LLDrawPoolAvatar::beginDeferredSkinned()
|
||||
sRenderingSkinned = TRUE;
|
||||
|
||||
sVertexProgram->bind();
|
||||
sVertexProgram->setMinimumAlpha(0.2f);
|
||||
sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha);
|
||||
|
||||
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
|
||||
gGL.getTexUnit(0)->activate();
|
||||
@@ -1184,6 +1301,21 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
|
||||
else
|
||||
{
|
||||
renderRiggedSimple(avatarp);
|
||||
if (LLPipeline::sRenderDeferred)
|
||||
{ //render "simple" materials
|
||||
renderRigged(avatarp, RIGGED_MATERIAL);
|
||||
renderRigged(avatarp, RIGGED_MATERIAL_ALPHA_MASK);
|
||||
renderRigged(avatarp, RIGGED_MATERIAL_ALPHA_EMISSIVE);
|
||||
renderRigged(avatarp, RIGGED_NORMMAP);
|
||||
renderRigged(avatarp, RIGGED_NORMMAP_MASK);
|
||||
renderRigged(avatarp, RIGGED_NORMMAP_EMISSIVE);
|
||||
renderRigged(avatarp, RIGGED_SPECMAP);
|
||||
renderRigged(avatarp, RIGGED_SPECMAP_MASK);
|
||||
renderRigged(avatarp, RIGGED_SPECMAP_EMISSIVE);
|
||||
renderRigged(avatarp, RIGGED_NORMSPEC);
|
||||
renderRigged(avatarp, RIGGED_NORMSPEC_MASK);
|
||||
renderRigged(avatarp, RIGGED_NORMSPEC_EMISSIVE);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -1202,6 +1334,18 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_deferred_render && pass >= 5 && pass <= 21)
|
||||
{
|
||||
S32 p = pass-5;
|
||||
if (p != 1 &&
|
||||
p != 5 &&
|
||||
p != 9 &&
|
||||
p != 13)
|
||||
{
|
||||
renderDeferredRiggedMaterial(avatarp, p);
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (pass == 5)
|
||||
{
|
||||
renderRiggedShinySimple(avatarp);
|
||||
@@ -1214,11 +1358,26 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
|
||||
return;
|
||||
}
|
||||
|
||||
if (pass >= 7 && pass < 9)
|
||||
if (pass >= 7 && pass < 13)
|
||||
{
|
||||
if (pass == 7)
|
||||
{
|
||||
renderRiggedAlpha(avatarp);
|
||||
if (LLPipeline::sRenderDeferred && !is_post_deferred_render)
|
||||
{ //render transparent materials under water
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
gGL.setColorMask(true, true);
|
||||
gGL.blendFunc(LLRender::BF_SOURCE_ALPHA,
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA,
|
||||
LLRender::BF_ZERO,
|
||||
LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
|
||||
renderRigged(avatarp, RIGGED_MATERIAL_ALPHA);
|
||||
renderRigged(avatarp, RIGGED_SPECMAP_BLEND);
|
||||
renderRigged(avatarp, RIGGED_NORMMAP_BLEND);
|
||||
renderRigged(avatarp, RIGGED_NORMSPEC_BLEND);
|
||||
gGL.setSceneBlendType(LLRender::BT_ALPHA);
|
||||
gGL.setColorMask(true, false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1227,9 +1386,30 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
|
||||
renderRiggedFullbrightAlpha(avatarp);
|
||||
return;
|
||||
}
|
||||
if (LLPipeline::sRenderDeferred && is_post_deferred_render)
|
||||
{
|
||||
S32 p = 0;
|
||||
switch (pass)
|
||||
{
|
||||
case 9: p = 1; break;
|
||||
case 10: p = 5; break;
|
||||
case 11: p = 9; break;
|
||||
case 12: p = 13; break;
|
||||
}
|
||||
{
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
renderDeferredRiggedMaterial(avatarp, p);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if (pass == 9)
|
||||
{
|
||||
renderRiggedGlow(avatarp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (pass == 9)
|
||||
if (pass == 13)
|
||||
{
|
||||
renderRiggedGlow(avatarp);
|
||||
|
||||
@@ -1267,27 +1447,10 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
|
||||
}
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* face, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)
|
||||
void LLDrawPoolAvatar::getRiggedGeometry(LLFace* face, LLPointer<LLVertexBuffer>& buffer, U32 data_mask, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)
|
||||
{
|
||||
LLVector4a* weight = vol_face.mWeights;
|
||||
if (!weight)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
LLPointer<LLVertexBuffer> buffer = face->getVertexBuffer();
|
||||
LLDrawable* drawable = face->getDrawable();
|
||||
|
||||
U32 data_mask = face->getRiggedVertexBufferDataMask();
|
||||
|
||||
if (buffer.isNull() ||
|
||||
buffer->getTypeMask() != data_mask ||
|
||||
buffer->getNumVerts() != vol_face.mNumVertices ||
|
||||
buffer->getNumIndices() != vol_face.mNumIndices ||
|
||||
(drawable && drawable->isState(LLDrawable::REBUILD_ALL)))
|
||||
{
|
||||
face->setGeomIndex(0);
|
||||
face->setIndicesIndex(0);
|
||||
face->setGeomIndex(0);
|
||||
face->setIndicesIndex(0);
|
||||
|
||||
//rigged faces do not batch textures
|
||||
face->setTextureIndex(255);
|
||||
@@ -1334,12 +1497,55 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
|
||||
}
|
||||
else
|
||||
{
|
||||
face->setPoolType(LLDrawPool::POOL_AVATAR);
|
||||
face->setPoolType(LLDrawPool::POOL_AVATAR);
|
||||
}
|
||||
|
||||
//llinfos << "Rebuilt face " << face->getTEOffset() << " of " << face->getDrawable() << " at " << gFrameTimeSeconds << llendl;
|
||||
face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
|
||||
|
||||
buffer->flush();
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* face, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)
|
||||
{
|
||||
LLVector4a* weight = vol_face.mWeights;
|
||||
if (!weight)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
LLPointer<LLVertexBuffer> buffer = face->getVertexBuffer();
|
||||
LLDrawable* drawable = face->getDrawable();
|
||||
|
||||
U32 data_mask = face->getRiggedVertexBufferDataMask();
|
||||
|
||||
if (buffer.isNull() ||
|
||||
buffer->getTypeMask() != data_mask ||
|
||||
buffer->getNumVerts() != vol_face.mNumVertices ||
|
||||
buffer->getNumIndices() != vol_face.mNumIndices ||
|
||||
(drawable && drawable->isState(LLDrawable::REBUILD_ALL)))
|
||||
{
|
||||
if (drawable && drawable->isState(LLDrawable::REBUILD_ALL))
|
||||
{ //rebuild EVERY face in the drawable, not just this one, to avoid missing drawable wide rebuild issues
|
||||
for (S32 i = 0; i < drawable->getNumFaces(); ++i)
|
||||
{
|
||||
LLFace* facep = drawable->getFace(i);
|
||||
U32 face_data_mask = facep->getRiggedVertexBufferDataMask();
|
||||
if (face_data_mask)
|
||||
{
|
||||
LLPointer<LLVertexBuffer> cur_buffer = facep->getVertexBuffer();
|
||||
const LLVolumeFace& cur_vol_face = volume->getVolumeFace(i);
|
||||
getRiggedGeometry(facep, cur_buffer, face_data_mask, skin, volume, cur_vol_face);
|
||||
}
|
||||
}
|
||||
drawable->clearState(LLDrawable::REBUILD_ALL);
|
||||
|
||||
buffer = face->getVertexBuffer();
|
||||
}
|
||||
else
|
||||
{ //just rebuild this face
|
||||
getRiggedGeometry(face, buffer, data_mask, skin, volume, vol_face);
|
||||
}
|
||||
|
||||
face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
|
||||
|
||||
buffer->flush();
|
||||
}
|
||||
|
||||
if (sShaderLevel <= 0 && face->mLastSkinTime < avatar->getLastSkinTime())
|
||||
@@ -1426,11 +1632,6 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace*
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (drawable && (face->getTEOffset() == drawable->getNumFaces()-1))
|
||||
{
|
||||
drawable->clearState(LLDrawable::REBUILD_ALL);
|
||||
}
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
|
||||
@@ -1531,13 +1732,62 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
|
||||
gGL.diffuseColor4f(0,0,0,face->getTextureEntry()->getGlow());
|
||||
}*/
|
||||
|
||||
gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture());
|
||||
if (normal_channel > -1)
|
||||
const LLTextureEntry* te = face->getTextureEntry();
|
||||
LLMaterial* mat = te->getMaterialParams().get();
|
||||
|
||||
if (mat)
|
||||
{
|
||||
LLDrawPoolBump::bindBumpMap(face, normal_channel);
|
||||
gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture(LLRender::DIFFUSE_MAP));
|
||||
gGL.getTexUnit(normal_channel)->bind(face->getTexture(LLRender::NORMAL_MAP));
|
||||
gGL.getTexUnit(specular_channel)->bind(face->getTexture(LLRender::SPECULAR_MAP));
|
||||
|
||||
LLColor4 col = mat->getSpecularLightColor();
|
||||
F32 spec = mat->getSpecularLightExponent()/255.f;
|
||||
|
||||
F32 env = mat->getEnvironmentIntensity()/255.f;
|
||||
|
||||
if (mat->getSpecularID().isNull())
|
||||
{
|
||||
env = te->getShiny()*0.25f;
|
||||
col.set(env,env,env,0);
|
||||
spec = env;
|
||||
}
|
||||
|
||||
BOOL fullbright = te->getFullbright();
|
||||
|
||||
sVertexProgram->uniform1f(LLShaderMgr::EMISSIVE_BRIGHTNESS, fullbright ? 1.f : 0.f);
|
||||
sVertexProgram->uniform4f(LLShaderMgr::SPECULAR_COLOR, col.mV[0], col.mV[1], col.mV[2], spec);
|
||||
sVertexProgram->uniform1f(LLShaderMgr::ENVIRONMENT_INTENSITY, env);
|
||||
|
||||
if (mat->getDiffuseAlphaMode() == LLMaterial::DIFFUSE_ALPHA_MODE_MASK)
|
||||
{
|
||||
sVertexProgram->setMinimumAlpha(mat->getAlphaMaskCutoff()/255.f);
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram->setMinimumAlpha(0.f);
|
||||
}
|
||||
|
||||
for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i)
|
||||
{
|
||||
LLViewerTexture* tex = face->getTexture(i);
|
||||
if (tex)
|
||||
{
|
||||
tex->addTextureStats(avatar->getPixelArea());
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture());
|
||||
sVertexProgram->setMinimumAlpha(0.f);
|
||||
if (normal_channel > -1)
|
||||
{
|
||||
LLDrawPoolBump::bindBumpMap(face, normal_channel);
|
||||
}
|
||||
}
|
||||
|
||||
if (face->mTextureMatrix)
|
||||
if (face->mTextureMatrix && vobj->mTexAnimMode)
|
||||
{
|
||||
gGL.matrixMode(LLRender::MM_TEXTURE);
|
||||
gGL.loadMatrix((F32*) face->mTextureMatrix->mMatrix);
|
||||
@@ -1551,6 +1801,8 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
|
||||
buff->setBuffer(data_mask);
|
||||
buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
|
||||
}
|
||||
|
||||
gPipeline.addTrianglesDrawn(count, LLRender::TRIANGLES);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1565,6 +1817,11 @@ void LLDrawPoolAvatar::renderDeferredRiggedBump(LLVOAvatar* avatar)
|
||||
renderRigged(avatar, RIGGED_DEFERRED_BUMP);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::renderDeferredRiggedMaterial(LLVOAvatar* avatar, S32 pass)
|
||||
{
|
||||
renderRigged(avatar, pass);
|
||||
}
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_RIGGED_VBO("Rigged VBO");
|
||||
|
||||
void LLDrawPoolAvatar::updateRiggedVertexBuffers(LLVOAvatar* avatar)
|
||||
|
||||
Reference in New Issue
Block a user