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"
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
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
00131 void LLDrawPool::beginRenderPass( S32 pass )
00132 {
00133 }
00134
00135
00136 void LLDrawPool::endRenderPass( S32 pass )
00137 {
00138 }
00139
00140
00141
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
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
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
00225 BOOL LLFacePool::addFace(LLFace *facep)
00226 {
00227 addFaceReference(facep);
00228 return TRUE;
00229 }
00230
00231
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
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
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 }