Rigged glow.
parent
dc15fc5ba0
commit
58defe76b0
|
|
@ -364,7 +364,7 @@ S32 LLDrawPoolAvatar::getNumPasses()
|
|||
}
|
||||
else if (getVertexShaderLevel() > 0)
|
||||
{
|
||||
return 7;
|
||||
return 10;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -419,6 +419,15 @@ void LLDrawPoolAvatar::beginRenderPass(S32 pass)
|
|||
case 6:
|
||||
beginRiggedFullbrightShiny();
|
||||
break;
|
||||
case 7:
|
||||
beginRiggedAlpha();
|
||||
break;
|
||||
case 8:
|
||||
beginRiggedFullbrightAlpha();
|
||||
break;
|
||||
case 9:
|
||||
beginRiggedGlow();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -455,6 +464,15 @@ void LLDrawPoolAvatar::endRenderPass(S32 pass)
|
|||
case 6:
|
||||
endRiggedFullbrightShiny();
|
||||
break;
|
||||
case 7:
|
||||
endRiggedAlpha();
|
||||
break;
|
||||
case 8:
|
||||
endRiggedFullbrightAlpha();
|
||||
break;
|
||||
case 9:
|
||||
endRiggedGlow();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -656,6 +674,55 @@ void LLDrawPoolAvatar::endRiggedSimple()
|
|||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::beginRiggedAlpha()
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectSimpleProgram;
|
||||
diffuse_channel = 0;
|
||||
sVertexProgram->bind();
|
||||
LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endRiggedAlpha()
|
||||
{
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
LLVertexBuffer::unbind();
|
||||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
}
|
||||
|
||||
|
||||
void LLDrawPoolAvatar::beginRiggedFullbrightAlpha()
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectFullbrightProgram;
|
||||
diffuse_channel = 0;
|
||||
sVertexProgram->bind();
|
||||
LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endRiggedFullbrightAlpha()
|
||||
{
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
LLVertexBuffer::unbind();
|
||||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::beginRiggedGlow()
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectFullbrightProgram;
|
||||
diffuse_channel = 0;
|
||||
sVertexProgram->bind();
|
||||
LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endRiggedGlow()
|
||||
{
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
LLVertexBuffer::unbind();
|
||||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::beginRiggedFullbright()
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectFullbrightProgram;
|
||||
|
|
@ -888,6 +955,48 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
|
|||
return;
|
||||
}
|
||||
|
||||
if (pass >= 7 && pass <= 9)
|
||||
{
|
||||
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);
|
||||
|
||||
|
||||
if (pass == 7)
|
||||
{
|
||||
renderRiggedAlpha(avatarp);
|
||||
return;
|
||||
}
|
||||
|
||||
if (pass == 8)
|
||||
{
|
||||
renderRiggedFullbrightAlpha(avatarp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (pass == 9)
|
||||
{
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
LLGLDisable test(GL_ALPHA_TEST);
|
||||
gGL.flush();
|
||||
|
||||
LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
|
||||
glPolygonOffset(-1.0f, -1.0f);
|
||||
gGL.setSceneBlendType(LLRender::BT_ADD);
|
||||
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
|
||||
gGL.setColorMask(false, true);
|
||||
|
||||
renderRiggedGlow(avatarp);
|
||||
gGL.setColorMask(true, false);
|
||||
gGL.setSceneBlendType(LLRender::BT_ALPHA);
|
||||
}
|
||||
|
||||
|
||||
if (sShaderLevel > 0)
|
||||
{
|
||||
|
|
@ -958,7 +1067,7 @@ void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLFace* face, const LLMeshSk
|
|||
}
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, const U32 data_mask)
|
||||
void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, const U32 data_mask, bool glow)
|
||||
{
|
||||
for (U32 i = 0; i < mRiggedFace[type].size(); ++i)
|
||||
{
|
||||
|
|
@ -1031,6 +1140,11 @@ void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, const U32 data
|
|||
S32 offset = face->getIndicesStart();
|
||||
U32 count = face->getIndicesCount();
|
||||
|
||||
if (glow)
|
||||
{
|
||||
glColor4f(0,0,0,face->getTextureEntry()->getGlow());
|
||||
}
|
||||
|
||||
gGL.getTexUnit(0)->bind(face->getTexture());
|
||||
buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
|
||||
}
|
||||
|
|
@ -1081,6 +1195,39 @@ void LLDrawPoolAvatar::renderRiggedFullbrightShiny(LLVOAvatar* avatar)
|
|||
renderRigged(avatar, RIGGED_FULLBRIGHT_SHINY, data_mask);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::renderRiggedAlpha(LLVOAvatar* avatar)
|
||||
{
|
||||
const U32 data_mask = LLVertexBuffer::MAP_VERTEX |
|
||||
LLVertexBuffer::MAP_NORMAL |
|
||||
LLVertexBuffer::MAP_TEXCOORD0 |
|
||||
LLVertexBuffer::MAP_COLOR |
|
||||
LLVertexBuffer::MAP_WEIGHT4;
|
||||
|
||||
renderRigged(avatar, RIGGED_ALPHA, data_mask);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::renderRiggedFullbrightAlpha(LLVOAvatar* avatar)
|
||||
{
|
||||
const U32 data_mask = LLVertexBuffer::MAP_VERTEX |
|
||||
LLVertexBuffer::MAP_TEXCOORD0 |
|
||||
LLVertexBuffer::MAP_COLOR |
|
||||
LLVertexBuffer::MAP_WEIGHT4;
|
||||
|
||||
renderRigged(avatar, RIGGED_FULLBRIGHT_ALPHA, data_mask);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::renderRiggedGlow(LLVOAvatar* avatar)
|
||||
{
|
||||
const U32 data_mask = LLVertexBuffer::MAP_VERTEX |
|
||||
LLVertexBuffer::MAP_TEXCOORD0 |
|
||||
LLVertexBuffer::MAP_WEIGHT4;
|
||||
|
||||
renderRigged(avatar, RIGGED_GLOW, data_mask, true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// renderForSelect()
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
@ -1181,59 +1328,56 @@ LLColor3 LLDrawPoolAvatar::getDebugColor() const
|
|||
|
||||
void LLDrawPoolAvatar::addRiggedFace(LLFace* facep, U32 type)
|
||||
{
|
||||
if (facep->getReferenceIndex() != -1)
|
||||
if (facep->mRiggedIndex.empty())
|
||||
{
|
||||
llerrs << "Tried to add a rigged face that's referenced elsewhere." << llendl;
|
||||
}
|
||||
|
||||
if (type >= NUM_RIGGED_PASSES)
|
||||
{
|
||||
llerrs << "Invalid rigged face type." << llendl;
|
||||
}
|
||||
|
||||
facep->setReferenceIndex(mRiggedFace[type].size());
|
||||
facep->mDrawPoolp = this;
|
||||
mRiggedFace[type].push_back(facep);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::removeRiggedFace(LLFace* facep, U32 type)
|
||||
{
|
||||
S32 index = facep->getReferenceIndex();
|
||||
if (index == -1)
|
||||
{
|
||||
llerrs << "Tried to remove rigged face with invalid index." << llendl;
|
||||
}
|
||||
|
||||
if (type > RIGGED_UNKNOWN)
|
||||
{
|
||||
llerrs << "Invalid rigged face type." << llendl;
|
||||
}
|
||||
|
||||
facep->setReferenceIndex(-1);
|
||||
facep->mDrawPoolp = NULL;
|
||||
|
||||
if (type == RIGGED_UNKNOWN)
|
||||
{
|
||||
for (U32 i = 0; i < NUM_RIGGED_PASSES; ++i)
|
||||
facep->mRiggedIndex.resize(LLDrawPoolAvatar::NUM_RIGGED_PASSES);
|
||||
for (U32 i = 0; i < facep->mRiggedIndex.size(); ++i)
|
||||
{
|
||||
if (mRiggedFace[i].size() > index && mRiggedFace[i][index] == facep)
|
||||
{
|
||||
type = i;
|
||||
break;
|
||||
}
|
||||
facep->mRiggedIndex[i] = -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (type >= NUM_RIGGED_PASSES)
|
||||
{
|
||||
llerrs << "Could not find face for removal from current drawpool." << llendl;
|
||||
llerrs << "Invalid rigged face type." << llendl;
|
||||
}
|
||||
|
||||
mRiggedFace[type].erase(mRiggedFace[type].begin()+index);
|
||||
if (facep->mRiggedIndex[type] != -1)
|
||||
{
|
||||
llerrs << "Tried to add a rigged face that's referenced elsewhere." << llendl;
|
||||
}
|
||||
|
||||
for (S32 i = index; i < mRiggedFace[type].size(); ++i)
|
||||
{ //bump indexes of currently held faces down after removal
|
||||
mRiggedFace[type][i]->setReferenceIndex(i);
|
||||
|
||||
facep->mRiggedIndex[type] = mRiggedFace[type].size();
|
||||
facep->mDrawPoolp = this;
|
||||
mRiggedFace[type].push_back(facep);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::removeRiggedFace(LLFace* facep)
|
||||
{
|
||||
|
||||
facep->mDrawPoolp = NULL;
|
||||
|
||||
for (U32 i = 0; i < NUM_RIGGED_PASSES; ++i)
|
||||
{
|
||||
S32 index = facep->mRiggedIndex[i];
|
||||
|
||||
if (index > -1)
|
||||
{
|
||||
if (mRiggedFace[i].size() > index && mRiggedFace[i][index] == facep)
|
||||
{
|
||||
facep->mRiggedIndex[i] = -1;
|
||||
mRiggedFace[i].erase(mRiggedFace[i].begin()+index);
|
||||
for (U32 j = index; j < mRiggedFace[i].size(); ++j)
|
||||
{ //bump indexes down for faces referenced after erased face
|
||||
mRiggedFace[i][j]->mRiggedIndex[i] = j;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
llerrs << "Face reference data corrupt for rigged type " << i << llendl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -100,6 +100,9 @@ public:
|
|||
void beginRiggedFullbright();
|
||||
void beginRiggedFullbrightShiny();
|
||||
void beginRiggedShinySimple();
|
||||
void beginRiggedAlpha();
|
||||
void beginRiggedFullbrightAlpha();
|
||||
void beginRiggedGlow();
|
||||
|
||||
void endRigid();
|
||||
void endImpostor();
|
||||
|
|
@ -108,6 +111,9 @@ public:
|
|||
void endRiggedFullbright();
|
||||
void endRiggedFullbrightShiny();
|
||||
void endRiggedShinySimple();
|
||||
void endRiggedAlpha();
|
||||
void endRiggedFullbrightAlpha();
|
||||
void endRiggedGlow();
|
||||
|
||||
void beginDeferredImpostor();
|
||||
void beginDeferredRigid();
|
||||
|
|
@ -125,11 +131,14 @@ public:
|
|||
const LLVolumeFace& vol_face,
|
||||
U32 data_mask);
|
||||
|
||||
void renderRigged(LLVOAvatar* avatar, U32 type, const U32 data_mask);
|
||||
void renderRigged(LLVOAvatar* avatar, U32 type, const U32 data_mask, bool glow = false);
|
||||
void renderRiggedSimple(LLVOAvatar* avatar);
|
||||
void renderRiggedAlpha(LLVOAvatar* avatar);
|
||||
void renderRiggedFullbrightAlpha(LLVOAvatar* avatar);
|
||||
void renderRiggedFullbright(LLVOAvatar* avatar);
|
||||
void renderRiggedShinySimple(LLVOAvatar* avatar);
|
||||
void renderRiggedFullbrightShiny(LLVOAvatar* avatar);
|
||||
void renderRiggedGlow(LLVOAvatar* avatar);
|
||||
|
||||
/*virtual*/ LLViewerTexture *getDebugTexture();
|
||||
/*virtual*/ LLColor3 getDebugColor() const; // For AGP debug display
|
||||
|
|
@ -151,7 +160,7 @@ public:
|
|||
|
||||
|
||||
void addRiggedFace(LLFace* facep, U32 type);
|
||||
void removeRiggedFace(LLFace* facep, U32 type = RIGGED_UNKNOWN);
|
||||
void removeRiggedFace(LLFace* facep);
|
||||
|
||||
std::vector<LLFace*> mRiggedFace[NUM_RIGGED_PASSES];
|
||||
|
||||
|
|
|
|||
|
|
@ -260,6 +260,8 @@ private:
|
|||
S32 mTEOffset;
|
||||
|
||||
S32 mReferenceIndex;
|
||||
std::vector<S32> mRiggedIndex;
|
||||
|
||||
F32 mVSize;
|
||||
F32 mPixelArea;
|
||||
|
||||
|
|
|
|||
|
|
@ -3545,7 +3545,21 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
|||
}
|
||||
|
||||
//add face to new pool
|
||||
if (te->getShiny())
|
||||
LLViewerTexture* tex = facep->getTexture();
|
||||
U32 type = gPipeline.getPoolTypeFromTE(te, tex);
|
||||
|
||||
if (type == LLDrawPool::POOL_ALPHA)
|
||||
{
|
||||
if (te->getFullbright())
|
||||
{
|
||||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_FULLBRIGHT_ALPHA);
|
||||
}
|
||||
else
|
||||
{
|
||||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_ALPHA);
|
||||
}
|
||||
}
|
||||
else if (te->getShiny())
|
||||
{
|
||||
if (te->getFullbright())
|
||||
{
|
||||
|
|
@ -3567,6 +3581,11 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
|||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_SIMPLE);
|
||||
}
|
||||
}
|
||||
|
||||
if (te->getGlow())
|
||||
{
|
||||
pool->addRiggedFace(facep, LLDrawPoolAvatar::RIGGED_GLOW);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue