diff options
| author | Brad Kittenbrink <brad@lindenlab.com> | 2008-02-27 18:58:14 +0000 |
|---|---|---|
| committer | Brad Kittenbrink <brad@lindenlab.com> | 2008-02-27 18:58:14 +0000 |
| commit | 6d52efe452aa8469e0343da1c7d108f3f52ab651 (patch) | |
| tree | a87be48e9840d7fc1f7ee514d7c7f994e71fdb3c /indra/newview/lldrawpool.cpp | |
| parent | 6027ad2630b8650cabcf00628ee9b0d25bedd67f (diff) | |
Merge of windlight into release (QAR-286). This includes all changes in
windlight14 which have passed QA (up through r79932).
svn merge -r 80831:80833 svn+ssh://svn.lindenlab.com/svn/linden/branches/merge_windlight14_r80620
Diffstat (limited to 'indra/newview/lldrawpool.cpp')
| -rw-r--r-- | indra/newview/lldrawpool.cpp | 240 |
1 files changed, 41 insertions, 199 deletions
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index 9875221495..c987f3e035 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -32,7 +32,7 @@ #include "llviewerprecompiledheaders.h" #include "lldrawpool.h" - +#include "llglimmediate.h" #include "llfasttimer.h" #include "llviewercontrol.h" @@ -44,17 +44,18 @@ #include "lldrawpoolground.h" #include "lldrawpoolsimple.h" #include "lldrawpoolsky.h" -#include "lldrawpoolstars.h" #include "lldrawpooltree.h" #include "lldrawpoolterrain.h" #include "lldrawpoolwater.h" #include "llface.h" #include "llviewerobjectlist.h" // For debug listing. #include "pipeline.h" +#include "llspatialpartition.h" +#include "llviewercamera.h" +#include "lldrawpoolwlsky.h" S32 LLDrawPool::sNumDrawPools = 0; - //============================= // Draw Pool Implementation //============================= @@ -66,15 +67,15 @@ LLDrawPool *LLDrawPool::createPool(const U32 type, LLViewerImage *tex0) case POOL_SIMPLE: poolp = new LLDrawPoolSimple(); break; + case POOL_INVISIBLE: + poolp = new LLDrawPoolInvisible(); + break; case POOL_GLOW: poolp = new LLDrawPoolGlow(); break; case POOL_ALPHA: poolp = new LLDrawPoolAlpha(); break; - case POOL_ALPHA_POST_WATER: - poolp = new LLDrawPoolAlphaPostWater(); - break; case POOL_AVATAR: poolp = new LLDrawPoolAvatar(); break; @@ -87,9 +88,6 @@ LLDrawPool *LLDrawPool::createPool(const U32 type, LLViewerImage *tex0) case POOL_SKY: poolp = new LLDrawPoolSky(); break; - case POOL_STARS: - poolp = new LLDrawPoolStars(); - break; case POOL_WATER: poolp = new LLDrawPoolWater(); break; @@ -99,6 +97,9 @@ LLDrawPool *LLDrawPool::createPool(const U32 type, LLViewerImage *tex0) case POOL_BUMP: poolp = new LLDrawPoolBump(); break; + case POOL_WL_SKY: + poolp = new LLDrawPoolWLSky(); + break; default: llerrs << "Unknown draw pool type!" << llendl; return NULL; @@ -196,7 +197,6 @@ S32 LLFacePool::drawLoop(face_array_t& face_list) iter != face_list.end(); iter++) { LLFace *facep = *iter; - //facep->enableLights(); res += facep->renderIndexed(); } } @@ -214,7 +214,6 @@ S32 LLFacePool::drawLoopSetTex(face_array_t& face_list, S32 stage) { LLFace *facep = *iter; facep->bindTexture(stage); - facep->enableLights(); res += facep->renderIndexed(); } } @@ -236,92 +235,6 @@ void LLFacePool::renderFaceSelected(LLFace *facep, { } -void LLFacePool::renderVisibility() -{ - if (mDrawFace.empty()) - { - return; - } - - // SJB: Note: This may be broken now. If you need it, fix it :) - - glLineWidth(1.0); - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - - glTranslatef(-0.4f,-0.3f,0); - - float table[7][3] = { - { 1,0,0 }, - { 0,1,0 }, - { 1,1,0 }, - { 0,0,1 }, - { 1,0,1 }, - { 0,1,1 }, - { 1,1,1 } - }; - - glColor4f(0,0,0,0.5); - glBegin(GL_POLYGON); - glVertex3f(-0.5f,-0.5f,1.0f); - glVertex3f(+0.5f,-0.5f,1.0f); - glVertex3f(+0.5f,+0.5f,1.0f); - glVertex3f(-0.5f,+0.5f,1.0f); - glVertex3f(-0.5f,-0.5f,1.0f); - glEnd(); - - for (std::vector<LLFace*>::iterator iter = mDrawFace.begin(); - iter != mDrawFace.end(); iter++) - { - LLFace *face = *iter; - - S32 geom_count = face->getGeomCount(); - for (S32 j=0;j<geom_count;j++) - { - LLVector3 p1; - LLVector3 p2; - - intptr_t p = ((intptr_t)face*13) % 7; - F32 r = table[p][0]; - F32 g = table[p][1]; - F32 b = table[p][2]; - - //p1.mV[1] = y; - //p2.mV[1] = y; - - p1.mV[2] = 1.0; - p2.mV[2] = 1.0; - - glColor4f(r,g,b,0.5f); - - glBegin(GL_LINE_STRIP); - glVertex3fv(p1.mV); - glVertex3fv(p2.mV); - glEnd(); - - } - } - - glColor4f(1,1,1,1); - glBegin(GL_LINE_STRIP); - glVertex3f(-0.5f,-0.5f,1.0f); - glVertex3f(+0.5f,-0.5f,1.0f); - glVertex3f(+0.5f,+0.5f,1.0f); - glVertex3f(-0.5f,+0.5f,1.0f); - glVertex3f(-0.5f,-0.5f,1.0f); - glEnd(); - - glPopMatrix(); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - -} - void LLFacePool::enqueue(LLFace* facep) { mDrawFace.push_back(facep); @@ -411,38 +324,17 @@ BOOL LLFacePool::LLOverrideFaceColor::sOverrideFaceColor = FALSE; void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4& color) { - if (mPool->getVertexShaderLevel() > 0 && mPool->getMaterialAttribIndex() > 0) - { - glVertexAttrib4fvARB(mPool->getMaterialAttribIndex(), color.mV); - } - else - { - glColor4fv(color.mV); - } + glColor4fv(color.mV); } void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4U& color) { - if (mPool->getVertexShaderLevel() > 0 && mPool->getMaterialAttribIndex() > 0) - { - glVertexAttrib4ubvARB(mPool->getMaterialAttribIndex(), color.mV); - } - else - { - glColor4ubv(color.mV); - } + glColor4ubv(color.mV); } void LLFacePool::LLOverrideFaceColor::setColor(F32 r, F32 g, F32 b, F32 a) { - if (mPool->getVertexShaderLevel() > 0 && mPool->getMaterialAttribIndex() > 0) - { - glVertexAttrib4fARB(mPool->getMaterialAttribIndex(), r,g,b,a); - } - else - { - glColor4f(r,g,b,a); - } + glColor4f(r,g,b,a); } @@ -483,51 +375,45 @@ void LLRenderPass::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL t } } -void LLRenderPass::renderInvisible(U32 mask) +void LLRenderPass::renderTexture(U32 type, U32 mask) +{ + pushBatches(type, mask, TRUE); +} + +void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture) { #if !LL_RELEASE_FOR_DOWNLOAD LLGLState::checkClientArrays(mask); #endif - - LLSpatialGroup::drawmap_elem_t& draw_info = gPipeline.mRenderMap[LLRenderPass::PASS_INVISIBLE]; - for (LLSpatialGroup::drawmap_elem_t::iterator i = draw_info.begin(); i != draw_info.end(); ++i) + for (LLCullResult::drawinfo_list_t::iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i) { - - LLDrawInfo *pparams = *i; - if (pparams && pparams->mVertexBuffer.notNull()) { - LLDrawInfo ¶ms = *pparams; - - params.mVertexBuffer->setBuffer(mask); - U32 *indices_pointer = - (U32 *) params.mVertexBuffer->getIndicesPointer(); - glDrawRangeElements(GL_TRIANGLES, params.mStart, params.mEnd, - params.mCount, GL_UNSIGNED_INT, - indices_pointer + params.mOffset); - gPipeline.mTrianglesDrawn += params.mCount / 3; + LLDrawInfo* pparams = *i; + if (pparams) + { + pushBatch(*pparams, mask, texture); } } } -void LLRenderPass::renderTexture(U32 type, U32 mask) +void LLRenderPass::applyModelMatrix(LLDrawInfo& params) { -#if !LL_RELEASE_FOR_DOWNLOAD - LLGLState::checkClientArrays(mask); -#endif - - LLSpatialGroup::drawmap_elem_t& draw_info = gPipeline.mRenderMap[type]; - - for (LLSpatialGroup::drawmap_elem_t::iterator i = draw_info.begin(); i != draw_info.end(); ++i) + if (params.mModelMatrix != gGLLastMatrix) { - LLDrawInfo* pparams = *i; - if (pparams) { - pushBatch(*pparams, mask, TRUE); + gGLLastMatrix = params.mModelMatrix; + glLoadMatrixd(gGLModelView); + if (params.mModelMatrix) + { + glMultMatrixf((GLfloat*) params.mModelMatrix->mMatrix); } + gPipeline.mMatrixOpCount++; } } void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) { + applyModelMatrix(params); + if (texture) { if (params.mTexture.notNull()) @@ -537,6 +423,7 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) { glMatrixMode(GL_TEXTURE); glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix); + gPipeline.mTextureMatrixOps++; } params.mTexture->addTextureStats(params.mVSize); } @@ -545,14 +432,14 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) LLImageGL::unbindTexture(0); } } - + if (params.mVertexBuffer.notNull()) { params.mVertexBuffer->setBuffer(mask); - U32* indices_pointer = (U32*) params.mVertexBuffer->getIndicesPointer(); + U16* indices_pointer = (U16*) params.mVertexBuffer->getIndicesPointer(); glDrawRangeElements(GL_TRIANGLES, params.mStart, params.mEnd, params.mCount, - GL_UNSIGNED_INT, indices_pointer+params.mOffset); - gPipeline.mTrianglesDrawn += params.mCount/3; + GL_UNSIGNED_SHORT, indices_pointer+params.mOffset); + gPipeline.addTrianglesDrawn(params.mCount/3); } if (params.mTextureMatrix && texture && params.mTexture.notNull()) @@ -562,52 +449,7 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture) } } -void LLRenderPass::renderActive(U32 type, U32 mask, BOOL texture) -{ -#if !LL_RELEASE_FOR_DOWNLOAD - LLGLState::checkClientArrays(mask); -#endif - - LLSpatialBridge* last_bridge = NULL; - glPushMatrix(); - - for (LLSpatialGroup::sg_vector_t::iterator i = gPipeline.mActiveGroups.begin(); i != gPipeline.mActiveGroups.end(); ++i) - { - LLSpatialGroup* group = *i; - if (!group->isDead() && - gPipeline.hasRenderType(group->mSpatialPartition->mDrawableType) && - group->mDrawMap.find(type) != group->mDrawMap.end()) - { - LLSpatialBridge* bridge = (LLSpatialBridge*) group->mSpatialPartition; - if (bridge != last_bridge) - { - glPopMatrix(); - glPushMatrix(); - glMultMatrixf((F32*) bridge->mDrawable->getRenderMatrix().mMatrix); - last_bridge = bridge; - } - - renderGroup(group,type,mask,texture); - } - } - - glPopMatrix(); -} - -void LLRenderPass::renderStatic(U32 type, U32 mask, BOOL texture) +void LLRenderPass::renderGroups(U32 type, U32 mask, BOOL texture) { -#if !LL_RELEASE_FOR_DOWNLOAD - LLGLState::checkClientArrays(mask); -#endif - - for (LLSpatialGroup::sg_vector_t::iterator i = gPipeline.mVisibleGroups.begin(); i != gPipeline.mVisibleGroups.end(); ++i) - { - LLSpatialGroup* group = *i; - if (!group->isDead() && - gPipeline.hasRenderType(group->mSpatialPartition->mDrawableType) && - group->mDrawMap.find(type) != group->mDrawMap.end()) - { - renderGroup(group,type,mask,texture); - } - } + gPipeline.renderGroups(this, type, mask, texture); } |
