diff options
author | Dave Parks <davep@lindenlab.com> | 2010-05-02 00:28:30 -0500 |
---|---|---|
committer | Dave Parks <davep@lindenlab.com> | 2010-05-02 00:28:30 -0500 |
commit | 58defe76b0eed6f773b961e8ba5cd3aeb856467a (patch) | |
tree | 70c44e8bdf3860f46fd03bd42c3fe3a60f9b1175 | |
parent | dc15fc5ba0fcf9907d834b523e6622d800d7ed4e (diff) |
Rigged glow.
-rw-r--r-- | indra/newview/lldrawpoolavatar.cpp | 214 | ||||
-rw-r--r-- | indra/newview/lldrawpoolavatar.h | 13 | ||||
-rw-r--r-- | indra/newview/llface.h | 2 | ||||
-rw-r--r-- | indra/newview/llvovolume.cpp | 21 |
4 files changed, 212 insertions, 38 deletions
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 8227e8ede2..866aea42c4 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -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,60 +1328,57 @@ 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; - } + facep->mRiggedIndex.resize(LLDrawPoolAvatar::NUM_RIGGED_PASSES); + for (U32 i = 0; i < facep->mRiggedIndex.size(); ++i) + { + facep->mRiggedIndex[i] = -1; + } + } if (type >= NUM_RIGGED_PASSES) { llerrs << "Invalid rigged face type." << llendl; } - facep->setReferenceIndex(mRiggedFace[type].size()); + if (facep->mRiggedIndex[type] != -1) + { + llerrs << "Tried to add a rigged face that's referenced elsewhere." << llendl; + } + + + facep->mRiggedIndex[type] = mRiggedFace[type].size(); facep->mDrawPoolp = this; mRiggedFace[type].push_back(facep); } -void LLDrawPoolAvatar::removeRiggedFace(LLFace* facep, U32 type) +void LLDrawPoolAvatar::removeRiggedFace(LLFace* facep) { - 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) { - 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) { - type = i; - break; + 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; } } } - - if (type >= NUM_RIGGED_PASSES) - { - llerrs << "Could not find face for removal from current drawpool." << llendl; - } - - mRiggedFace[type].erase(mRiggedFace[type].begin()+index); - - for (S32 i = index; i < mRiggedFace[type].size(); ++i) - { //bump indexes of currently held faces down after removal - mRiggedFace[type][i]->setReferenceIndex(i); - } } LLVertexBufferAvatar::LLVertexBufferAvatar() diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h index d758bb07f0..59f9cf7ddb 100644 --- a/indra/newview/lldrawpoolavatar.h +++ b/indra/newview/lldrawpoolavatar.h @@ -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]; diff --git a/indra/newview/llface.h b/indra/newview/llface.h index 2b8fdf2e58..f9e9c3e078 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -260,6 +260,8 @@ private: S32 mTEOffset; S32 mReferenceIndex; + std::vector<S32> mRiggedIndex; + F32 mVSize; F32 mPixelArea; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 43252c553c..e263f8d937 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -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); + } } } |