lldrawpool.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 #include "lldrawpool.h"
00035 #include "llglimmediate.h"
00036 #include "llfasttimer.h"
00037 #include "llviewercontrol.h"
00038 
00039 #include "lldrawable.h"
00040 #include "lldrawpoolalpha.h"
00041 #include "lldrawpoolavatar.h"
00042 #include "lldrawpoolbump.h"
00043 #include "lldrawpoolclouds.h"
00044 #include "lldrawpoolground.h"
00045 #include "lldrawpoolsimple.h"
00046 #include "lldrawpoolsky.h"
00047 #include "lldrawpooltree.h"
00048 #include "lldrawpoolterrain.h"
00049 #include "lldrawpoolwater.h"
00050 #include "llface.h"
00051 #include "llviewerobjectlist.h" // For debug listing.
00052 #include "pipeline.h"
00053 #include "llspatialpartition.h"
00054 #include "llviewercamera.h"
00055 #include "lldrawpoolwlsky.h"
00056 
00057 S32 LLDrawPool::sNumDrawPools = 0;
00058 
00059 //=============================
00060 // Draw Pool Implementation
00061 //=============================
00062 LLDrawPool *LLDrawPool::createPool(const U32 type, LLViewerImage *tex0)
00063 {
00064         LLDrawPool *poolp = NULL;
00065         switch (type)
00066         {
00067         case POOL_SIMPLE:
00068                 poolp = new LLDrawPoolSimple();
00069                 break;
00070         case POOL_INVISIBLE:
00071                 poolp = new LLDrawPoolInvisible();
00072                 break;
00073         case POOL_GLOW:
00074                 poolp = new LLDrawPoolGlow();
00075                 break;
00076         case POOL_ALPHA:
00077                 poolp = new LLDrawPoolAlpha();
00078                 break;
00079         case POOL_AVATAR:
00080                 poolp = new LLDrawPoolAvatar();
00081                 break;
00082         case POOL_TREE:
00083                 poolp = new LLDrawPoolTree(tex0);
00084                 break;
00085         case POOL_TERRAIN:
00086                 poolp = new LLDrawPoolTerrain(tex0);
00087                 break;
00088         case POOL_SKY:
00089                 poolp = new LLDrawPoolSky();
00090                 break;
00091         case POOL_WATER:
00092                 poolp = new LLDrawPoolWater();
00093                 break;
00094         case POOL_GROUND:
00095                 poolp = new LLDrawPoolGround();
00096                 break;
00097         case POOL_BUMP:
00098                 poolp = new LLDrawPoolBump();
00099                 break;
00100         case POOL_WL_SKY:
00101                 poolp = new LLDrawPoolWLSky();
00102                 break;
00103         default:
00104                 llerrs << "Unknown draw pool type!" << llendl;
00105                 return NULL;
00106         }
00107 
00108         llassert(poolp->mType == type);
00109         return poolp;
00110 }
00111 
00112 LLDrawPool::LLDrawPool(const U32 type)
00113 {
00114         mType = type;
00115         sNumDrawPools++;
00116         mId = sNumDrawPools;
00117         mVertexShaderLevel = 0;
00118 }
00119 
00120 LLDrawPool::~LLDrawPool()
00121 {
00122 
00123 }
00124 
00125 LLViewerImage *LLDrawPool::getDebugTexture()
00126 {
00127         return NULL;
00128 }
00129 
00130 //virtual
00131 void LLDrawPool::beginRenderPass( S32 pass )
00132 {
00133 }
00134 
00135 //virtual
00136 void LLDrawPool::endRenderPass( S32 pass )
00137 {
00138 }
00139 
00140 //=============================
00141 // Face Pool Implementation
00142 //=============================
00143 LLFacePool::LLFacePool(const U32 type)
00144 : LLDrawPool(type)
00145 {
00146         resetDrawOrders();
00147 }
00148 
00149 LLFacePool::~LLFacePool()
00150 {
00151         destroy();
00152 }
00153 
00154 void LLFacePool::destroy()
00155 {
00156         if (!mReferences.empty())
00157         {
00158                 llinfos << mReferences.size() << " references left on deletion of draw pool!" << llendl;
00159         }
00160 }
00161 
00162 void LLFacePool::dirtyTextures(const std::set<LLViewerImage*>& textures)
00163 {
00164 }
00165 
00166 BOOL LLFacePool::moveFace(LLFace *face, LLDrawPool *poolp, BOOL copy_data)
00167 {
00168         return TRUE;
00169 }
00170 
00171 // static
00172 S32 LLFacePool::drawLoop(face_array_t& face_list)
00173 {
00174         S32 res = 0;
00175         if (!face_list.empty())
00176         {
00177                 for (std::vector<LLFace*>::iterator iter = face_list.begin();
00178                          iter != face_list.end(); iter++)
00179                 {
00180                         LLFace *facep = *iter;
00181                         res += facep->renderIndexed();
00182                 }
00183         }
00184         return res;
00185 }
00186 
00187 // static
00188 S32 LLFacePool::drawLoopSetTex(face_array_t& face_list, S32 stage)
00189 {
00190         S32 res = 0;
00191         if (!face_list.empty())
00192         {
00193                 for (std::vector<LLFace*>::iterator iter = face_list.begin();
00194                          iter != face_list.end(); iter++)
00195                 {
00196                         LLFace *facep = *iter;
00197                         facep->bindTexture(stage);
00198                         res += facep->renderIndexed();
00199                 }
00200         }
00201         return res;
00202 }
00203 
00204 void LLFacePool::drawLoop()
00205 {
00206         if (!mDrawFace.empty())
00207         {
00208                 drawLoop(mDrawFace);
00209         }
00210 }
00211 
00212 void LLFacePool::renderFaceSelected(LLFace *facep, 
00213                                                                         LLImageGL *image, 
00214                                                                         const LLColor4 &color,
00215                                                                         const S32 index_offset, const S32 index_count)
00216 {
00217 }
00218 
00219 void LLFacePool::enqueue(LLFace* facep)
00220 {
00221         mDrawFace.push_back(facep);
00222 }
00223 
00224 // virtual
00225 BOOL LLFacePool::addFace(LLFace *facep)
00226 {
00227         addFaceReference(facep);
00228         return TRUE;
00229 }
00230 
00231 // virtual
00232 BOOL LLFacePool::removeFace(LLFace *facep)
00233 {
00234         removeFaceReference(facep);
00235 
00236         vector_replace_with_last(mDrawFace, facep);
00237 
00238         return TRUE;
00239 }
00240 
00241 // Not absolutely sure if we should be resetting all of the chained pools as well - djs
00242 void LLFacePool::resetDrawOrders()
00243 {
00244         mDrawFace.resize(0);
00245 }
00246 
00247 LLViewerImage *LLFacePool::getTexture()
00248 {
00249         return NULL;
00250 }
00251 
00252 void LLFacePool::removeFaceReference(LLFace *facep)
00253 {
00254         if (facep->getReferenceIndex() != -1)
00255         {
00256                 if (facep->getReferenceIndex() != (S32)mReferences.size())
00257                 {
00258                         LLFace *back = mReferences.back();
00259                         mReferences[facep->getReferenceIndex()] = back;
00260                         back->setReferenceIndex(facep->getReferenceIndex());
00261                 }
00262                 mReferences.pop_back();
00263         }
00264         facep->setReferenceIndex(-1);
00265 }
00266 
00267 void LLFacePool::addFaceReference(LLFace *facep)
00268 {
00269         if (-1 == facep->getReferenceIndex())
00270         {
00271                 facep->setReferenceIndex(mReferences.size());
00272                 mReferences.push_back(facep);
00273         }
00274 }
00275 
00276 BOOL LLFacePool::verify() const
00277 {
00278         BOOL ok = TRUE;
00279         
00280         for (std::vector<LLFace*>::const_iterator iter = mDrawFace.begin();
00281                  iter != mDrawFace.end(); iter++)
00282         {
00283                 const LLFace* facep = *iter;
00284                 if (facep->getPool() != this)
00285                 {
00286                         llinfos << "Face in wrong pool!" << llendl;
00287                         facep->printDebugInfo();
00288                         ok = FALSE;
00289                 }
00290                 else if (!facep->verify())
00291                 {
00292                         ok = FALSE;
00293                 }
00294         }
00295 
00296         return ok;
00297 }
00298 
00299 void LLFacePool::printDebugInfo() const
00300 {
00301         llinfos << "Pool " << this << " Type: " << getType() << llendl;
00302 }
00303 
00304 BOOL LLFacePool::LLOverrideFaceColor::sOverrideFaceColor = FALSE;
00305 
00306 void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4& color)
00307 {
00308         glColor4fv(color.mV);
00309 }
00310 
00311 void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4U& color)
00312 {
00313         glColor4ubv(color.mV);
00314 }
00315 
00316 void LLFacePool::LLOverrideFaceColor::setColor(F32 r, F32 g, F32 b, F32 a)
00317 {
00318         glColor4f(r,g,b,a);
00319 }
00320 
00321 
00322 //=============================
00323 // Render Pass Implementation
00324 //=============================
00325 LLRenderPass::LLRenderPass(const U32 type)
00326 : LLDrawPool(type)
00327 {
00328 
00329 }
00330 
00331 LLRenderPass::~LLRenderPass()
00332 {
00333 
00334 }
00335 
00336 LLDrawPool* LLRenderPass::instancePool()
00337 {
00338 #if LL_RELEASE_FOR_DOWNLOAD
00339         llwarns << "Attempting to instance a render pass.  Invalid operation." << llendl;
00340 #else
00341         llerrs << "Attempting to instance a render pass.  Invalid operation." << llendl;
00342 #endif
00343         return NULL;
00344 }
00345 
00346 void LLRenderPass::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture)
00347 {                                       
00348         LLSpatialGroup::drawmap_elem_t& draw_info = group->mDrawMap[type];
00349         
00350         for (LLSpatialGroup::drawmap_elem_t::iterator k = draw_info.begin(); k != draw_info.end(); ++k) 
00351         {
00352                 LLDrawInfo *pparams = *k;
00353                 if (pparams) {
00354                         pushBatch(*pparams, mask, texture);
00355                 }
00356         }
00357 }
00358 
00359 void LLRenderPass::renderTexture(U32 type, U32 mask)
00360 {
00361         pushBatches(type, mask, TRUE);
00362 }
00363 
00364 void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture)
00365 {
00366         for (LLCullResult::drawinfo_list_t::iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i)        
00367         {
00368                 LLDrawInfo* pparams = *i;
00369                 if (pparams) 
00370                 {
00371                         pushBatch(*pparams, mask, texture);
00372                 }
00373         }
00374 }
00375 
00376 void LLRenderPass::applyModelMatrix(LLDrawInfo& params)
00377 {
00378         if (params.mModelMatrix != gGLLastMatrix)
00379         {
00380                 gGLLastMatrix = params.mModelMatrix;
00381                 glLoadMatrixd(gGLModelView);
00382                 if (params.mModelMatrix)
00383                 {
00384                         glMultMatrixf((GLfloat*) params.mModelMatrix->mMatrix);
00385                 }
00386                 gPipeline.mMatrixOpCount++;
00387         }
00388 }
00389 
00390 void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
00391 {
00392         applyModelMatrix(params);
00393 
00394         if (texture)
00395         {
00396                 if (params.mTexture.notNull())
00397                 {
00398                         params.mTexture->bind();
00399                         if (params.mTextureMatrix)
00400                         {
00401                                 glMatrixMode(GL_TEXTURE);
00402                                 glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
00403                                 gPipeline.mTextureMatrixOps++;
00404                         }
00405                         params.mTexture->addTextureStats(params.mVSize);
00406                 }
00407                 else
00408                 {
00409                         LLImageGL::unbindTexture(0);
00410                 }
00411         }
00412         
00413         if (params.mVertexBuffer.notNull())
00414         {
00415                 params.mVertexBuffer->setBuffer(mask);
00416                 params.mVertexBuffer->drawRange(LLVertexBuffer::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
00417                 gPipeline.addTrianglesDrawn(params.mCount/3);
00418         }
00419 
00420         if (params.mTextureMatrix && texture && params.mTexture.notNull())
00421         {
00422                 glLoadIdentity();
00423                 glMatrixMode(GL_MODELVIEW);
00424         }
00425 }
00426 
00427 void LLRenderPass::renderGroups(U32 type, U32 mask, BOOL texture)
00428 {
00429         gPipeline.renderGroups(this, type, mask, texture);
00430 }

Generated on Fri May 16 08:33:17 2008 for SecondLife by  doxygen 1.5.5