lldrawpool.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:10k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lldrawpool.cpp
  3.  * @brief LLDrawPool class implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "lldrawpool.h"
  34. #include "llrender.h"
  35. #include "llfasttimer.h"
  36. #include "llviewercontrol.h"
  37. #include "lldrawable.h"
  38. #include "lldrawpoolalpha.h"
  39. #include "lldrawpoolavatar.h"
  40. #include "lldrawpoolbump.h"
  41. #include "lldrawpoolclouds.h"
  42. #include "lldrawpoolground.h"
  43. #include "lldrawpoolsimple.h"
  44. #include "lldrawpoolsky.h"
  45. #include "lldrawpooltree.h"
  46. #include "lldrawpoolterrain.h"
  47. #include "lldrawpoolwater.h"
  48. #include "llface.h"
  49. #include "llviewerobjectlist.h" // For debug listing.
  50. #include "pipeline.h"
  51. #include "llspatialpartition.h"
  52. #include "llviewercamera.h"
  53. #include "lldrawpoolwlsky.h"
  54. S32 LLDrawPool::sNumDrawPools = 0;
  55. //=============================
  56. // Draw Pool Implementation
  57. //=============================
  58. LLDrawPool *LLDrawPool::createPool(const U32 type, LLViewerTexture *tex0)
  59. {
  60. LLDrawPool *poolp = NULL;
  61. switch (type)
  62. {
  63. case POOL_SIMPLE:
  64. poolp = new LLDrawPoolSimple();
  65. break;
  66. case POOL_GRASS:
  67. poolp = new LLDrawPoolGrass();
  68. break;
  69. case POOL_FULLBRIGHT:
  70. poolp = new LLDrawPoolFullbright();
  71. break;
  72. case POOL_INVISIBLE:
  73. poolp = new LLDrawPoolInvisible();
  74. break;
  75. case POOL_GLOW:
  76. poolp = new LLDrawPoolGlow();
  77. break;
  78. case POOL_ALPHA:
  79. poolp = new LLDrawPoolAlpha();
  80. break;
  81. case POOL_AVATAR:
  82. poolp = new LLDrawPoolAvatar();
  83. break;
  84. case POOL_TREE:
  85. poolp = new LLDrawPoolTree(tex0);
  86. break;
  87. case POOL_TERRAIN:
  88. poolp = new LLDrawPoolTerrain(tex0);
  89. break;
  90. case POOL_SKY:
  91. poolp = new LLDrawPoolSky();
  92. break;
  93. case POOL_WATER:
  94. poolp = new LLDrawPoolWater();
  95. break;
  96. case POOL_GROUND:
  97. poolp = new LLDrawPoolGround();
  98. break;
  99. case POOL_BUMP:
  100. poolp = new LLDrawPoolBump();
  101. break;
  102. case POOL_WL_SKY:
  103. poolp = new LLDrawPoolWLSky();
  104. break;
  105. default:
  106. llerrs << "Unknown draw pool type!" << llendl;
  107. return NULL;
  108. }
  109. llassert(poolp->mType == type);
  110. return poolp;
  111. }
  112. LLDrawPool::LLDrawPool(const U32 type)
  113. {
  114. mType = type;
  115. sNumDrawPools++;
  116. mId = sNumDrawPools;
  117. mVertexShaderLevel = 0;
  118. }
  119. LLDrawPool::~LLDrawPool()
  120. {
  121. }
  122. LLViewerTexture *LLDrawPool::getDebugTexture()
  123. {
  124. return NULL;
  125. }
  126. //virtual
  127. void LLDrawPool::beginRenderPass( S32 pass )
  128. {
  129. }
  130. //virtual 
  131. S32  LLDrawPool::getNumPasses()
  132. {
  133. return 1;
  134. }
  135. //virtual 
  136. void LLDrawPool::beginDeferredPass(S32 pass)
  137. {
  138. }
  139. //virtual 
  140. void LLDrawPool::endDeferredPass(S32 pass)
  141. {
  142. }
  143. //virtual 
  144. S32 LLDrawPool::getNumDeferredPasses()
  145. {
  146. return 0;
  147. }
  148. //virtual 
  149. void LLDrawPool::renderDeferred(S32 pass)
  150. {
  151. }
  152. //virtual 
  153. void LLDrawPool::beginPostDeferredPass(S32 pass)
  154. {
  155. }
  156. //virtual 
  157. void LLDrawPool::endPostDeferredPass(S32 pass)
  158. {
  159. }
  160. //virtual 
  161. S32 LLDrawPool::getNumPostDeferredPasses()
  162. {
  163. return 0;
  164. }
  165. //virtual 
  166. void LLDrawPool::renderPostDeferred(S32 pass)
  167. {
  168. }
  169. //virtual
  170. void LLDrawPool::endRenderPass( S32 pass )
  171. {
  172. }
  173. //virtual 
  174. void LLDrawPool::beginShadowPass(S32 pass)
  175. {
  176. }
  177. //virtual 
  178. void LLDrawPool::endShadowPass(S32 pass)
  179. {
  180. }
  181. //virtual 
  182. S32 LLDrawPool::getNumShadowPasses()
  183. {
  184. return 0;
  185. }
  186. //virtual 
  187. void LLDrawPool::renderShadow(S32 pass)
  188. {
  189. }
  190. //=============================
  191. // Face Pool Implementation
  192. //=============================
  193. LLFacePool::LLFacePool(const U32 type)
  194. : LLDrawPool(type)
  195. {
  196. resetDrawOrders();
  197. }
  198. LLFacePool::~LLFacePool()
  199. {
  200. destroy();
  201. }
  202. void LLFacePool::destroy()
  203. {
  204. if (!mReferences.empty())
  205. {
  206. llinfos << mReferences.size() << " references left on deletion of draw pool!" << llendl;
  207. }
  208. }
  209. void LLFacePool::dirtyTextures(const std::set<LLViewerFetchedTexture*>& textures)
  210. {
  211. }
  212. BOOL LLFacePool::moveFace(LLFace *face, LLDrawPool *poolp, BOOL copy_data)
  213. {
  214. return TRUE;
  215. }
  216. // static
  217. S32 LLFacePool::drawLoop(face_array_t& face_list)
  218. {
  219. S32 res = 0;
  220. if (!face_list.empty())
  221. {
  222. for (std::vector<LLFace*>::iterator iter = face_list.begin();
  223.  iter != face_list.end(); iter++)
  224. {
  225. LLFace *facep = *iter;
  226. res += facep->renderIndexed();
  227. }
  228. }
  229. return res;
  230. }
  231. // static
  232. S32 LLFacePool::drawLoopSetTex(face_array_t& face_list, S32 stage)
  233. {
  234. S32 res = 0;
  235. if (!face_list.empty())
  236. {
  237. for (std::vector<LLFace*>::iterator iter = face_list.begin();
  238.  iter != face_list.end(); iter++)
  239. {
  240. LLFace *facep = *iter;
  241. gGL.getTexUnit(stage)->bind(facep->getTexture(), TRUE) ;
  242. gGL.getTexUnit(0)->activate();
  243. res += facep->renderIndexed();
  244. }
  245. }
  246. return res;
  247. }
  248. void LLFacePool::drawLoop()
  249. {
  250. if (!mDrawFace.empty())
  251. {
  252. drawLoop(mDrawFace);
  253. }
  254. }
  255. void LLFacePool::enqueue(LLFace* facep)
  256. {
  257. mDrawFace.push_back(facep);
  258. }
  259. // virtual
  260. BOOL LLFacePool::addFace(LLFace *facep)
  261. {
  262. addFaceReference(facep);
  263. return TRUE;
  264. }
  265. // virtual
  266. BOOL LLFacePool::removeFace(LLFace *facep)
  267. {
  268. removeFaceReference(facep);
  269. vector_replace_with_last(mDrawFace, facep);
  270. return TRUE;
  271. }
  272. // Not absolutely sure if we should be resetting all of the chained pools as well - djs
  273. void LLFacePool::resetDrawOrders()
  274. {
  275. mDrawFace.resize(0);
  276. }
  277. LLViewerTexture *LLFacePool::getTexture()
  278. {
  279. return NULL;
  280. }
  281. void LLFacePool::removeFaceReference(LLFace *facep)
  282. {
  283. if (facep->getReferenceIndex() != -1)
  284. {
  285. if (facep->getReferenceIndex() != (S32)mReferences.size())
  286. {
  287. LLFace *back = mReferences.back();
  288. mReferences[facep->getReferenceIndex()] = back;
  289. back->setReferenceIndex(facep->getReferenceIndex());
  290. }
  291. mReferences.pop_back();
  292. }
  293. facep->setReferenceIndex(-1);
  294. }
  295. void LLFacePool::addFaceReference(LLFace *facep)
  296. {
  297. if (-1 == facep->getReferenceIndex())
  298. {
  299. facep->setReferenceIndex(mReferences.size());
  300. mReferences.push_back(facep);
  301. }
  302. }
  303. BOOL LLFacePool::verify() const
  304. {
  305. BOOL ok = TRUE;
  306. for (std::vector<LLFace*>::const_iterator iter = mDrawFace.begin();
  307.  iter != mDrawFace.end(); iter++)
  308. {
  309. const LLFace* facep = *iter;
  310. if (facep->getPool() != this)
  311. {
  312. llinfos << "Face in wrong pool!" << llendl;
  313. facep->printDebugInfo();
  314. ok = FALSE;
  315. }
  316. else if (!facep->verify())
  317. {
  318. ok = FALSE;
  319. }
  320. }
  321. return ok;
  322. }
  323. void LLFacePool::printDebugInfo() const
  324. {
  325. llinfos << "Pool " << this << " Type: " << getType() << llendl;
  326. }
  327. BOOL LLFacePool::LLOverrideFaceColor::sOverrideFaceColor = FALSE;
  328. void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4& color)
  329. {
  330. glColor4fv(color.mV);
  331. }
  332. void LLFacePool::LLOverrideFaceColor::setColor(const LLColor4U& color)
  333. {
  334. glColor4ubv(color.mV);
  335. }
  336. void LLFacePool::LLOverrideFaceColor::setColor(F32 r, F32 g, F32 b, F32 a)
  337. {
  338. glColor4f(r,g,b,a);
  339. }
  340. //=============================
  341. // Render Pass Implementation
  342. //=============================
  343. LLRenderPass::LLRenderPass(const U32 type)
  344. : LLDrawPool(type)
  345. {
  346. }
  347. LLRenderPass::~LLRenderPass()
  348. {
  349. }
  350. LLDrawPool* LLRenderPass::instancePool()
  351. {
  352. #if LL_RELEASE_FOR_DOWNLOAD
  353. llwarns << "Attempting to instance a render pass.  Invalid operation." << llendl;
  354. #else
  355. llerrs << "Attempting to instance a render pass.  Invalid operation." << llendl;
  356. #endif
  357. return NULL;
  358. }
  359. void LLRenderPass::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture)
  360. {
  361. LLSpatialGroup::drawmap_elem_t& draw_info = group->mDrawMap[type];
  362. for (LLSpatialGroup::drawmap_elem_t::iterator k = draw_info.begin(); k != draw_info.end(); ++k)
  363. {
  364. LLDrawInfo *pparams = *k;
  365. if (pparams) {
  366. pushBatch(*pparams, mask, texture);
  367. }
  368. }
  369. }
  370. void LLRenderPass::renderTexture(U32 type, U32 mask)
  371. {
  372. pushBatches(type, mask, TRUE);
  373. }
  374. void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture)
  375. {
  376. llpushcallstacks ;
  377. for (LLCullResult::drawinfo_list_t::iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i)
  378. {
  379. LLDrawInfo* pparams = *i;
  380. if (pparams) 
  381. {
  382. pushBatch(*pparams, mask, texture);
  383. }
  384. }
  385. }
  386. void LLRenderPass::applyModelMatrix(LLDrawInfo& params)
  387. {
  388. if (params.mModelMatrix != gGLLastMatrix)
  389. {
  390. gGLLastMatrix = params.mModelMatrix;
  391. glLoadMatrixd(gGLModelView);
  392. if (params.mModelMatrix)
  393. {
  394. glMultMatrixf((GLfloat*) params.mModelMatrix->mMatrix);
  395. }
  396. gPipeline.mMatrixOpCount++;
  397. }
  398. }
  399. void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
  400. {
  401. applyModelMatrix(params);
  402. if (texture)
  403. {
  404. if (params.mTexture.notNull())
  405. {
  406. gGL.getTexUnit(0)->bind(params.mTexture, TRUE) ;
  407. if (params.mTextureMatrix)
  408. {
  409. glMatrixMode(GL_TEXTURE);
  410. glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
  411. gPipeline.mTextureMatrixOps++;
  412. }
  413. }
  414. else
  415. {
  416. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  417. }
  418. }
  419. if (params.mVertexBuffer.notNull())
  420. {
  421. if (params.mGroup)
  422. {
  423. params.mGroup->rebuildMesh();
  424. }
  425. params.mVertexBuffer->setBuffer(mask);
  426. params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
  427. gPipeline.addTrianglesDrawn(params.mCount/3);
  428. }
  429. if (params.mTextureMatrix && texture && params.mTexture.notNull())
  430. {
  431. glLoadIdentity();
  432. glMatrixMode(GL_MODELVIEW);
  433. }
  434. }
  435. void LLRenderPass::renderGroups(U32 type, U32 mask, BOOL texture)
  436. {
  437. gPipeline.renderGroups(this, type, mask, texture);
  438. }