PageRenderTime 38ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/indra/newview/lldrawpooltree.cpp

https://bitbucket.org/lindenlab/viewer-beta/
C++ | 211 lines | 137 code | 36 blank | 38 comment | 8 complexity | 4b9d739f07dd4feb1dc47c66d717fa14 MD5 | raw file
Possible License(s): LGPL-2.1
  1. /**
  2. * @file lldrawpooltree.cpp
  3. * @brief LLDrawPoolTree class implementation
  4. *
  5. * $LicenseInfo:firstyear=2002&license=viewerlgpl$
  6. * Second Life Viewer Source Code
  7. * Copyright (C) 2010, Linden Research, Inc.
  8. *
  9. * This library is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation;
  12. * version 2.1 of the License only.
  13. *
  14. * This library is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with this library; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. *
  23. * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
  24. * $/LicenseInfo$
  25. */
  26. #include "llviewerprecompiledheaders.h"
  27. #include "lldrawpooltree.h"
  28. #include "lldrawable.h"
  29. #include "llface.h"
  30. #include "llsky.h"
  31. #include "llvotree.h"
  32. #include "pipeline.h"
  33. #include "llviewercamera.h"
  34. #include "llviewershadermgr.h"
  35. #include "llrender.h"
  36. #include "llviewercontrol.h"
  37. S32 LLDrawPoolTree::sDiffTex = 0;
  38. static LLGLSLShader* shader = NULL;
  39. static LLFastTimer::DeclareTimer FTM_SHADOW_TREE("Tree Shadow");
  40. LLDrawPoolTree::LLDrawPoolTree(LLViewerTexture *texturep) :
  41. LLFacePool(POOL_TREE),
  42. mTexturep(texturep)
  43. {
  44. mTexturep->setAddressMode(LLTexUnit::TAM_WRAP);
  45. }
  46. LLDrawPool *LLDrawPoolTree::instancePool()
  47. {
  48. return new LLDrawPoolTree(mTexturep);
  49. }
  50. void LLDrawPoolTree::prerender()
  51. {
  52. mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_OBJECT);
  53. }
  54. void LLDrawPoolTree::beginRenderPass(S32 pass)
  55. {
  56. LLFastTimer t(FTM_RENDER_TREES);
  57. if (LLPipeline::sUnderWaterRender)
  58. {
  59. shader = &gTreeWaterProgram;
  60. }
  61. else
  62. {
  63. shader = &gTreeProgram;
  64. }
  65. if (gPipeline.canUseVertexShaders())
  66. {
  67. shader->bind();
  68. shader->setMinimumAlpha(0.5f);
  69. gGL.diffuseColor4f(1,1,1,1);
  70. }
  71. else
  72. {
  73. gPipeline.enableLightsDynamic();
  74. gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
  75. }
  76. }
  77. void LLDrawPoolTree::render(S32 pass)
  78. {
  79. LLFastTimer t(LLPipeline::sShadowRender ? FTM_SHADOW_TREE : FTM_RENDER_TREES);
  80. if (mDrawFace.empty())
  81. {
  82. return;
  83. }
  84. LLGLState test(GL_ALPHA_TEST, LLGLSLShader::sNoFixedFunction ? 0 : 1);
  85. LLOverrideFaceColor color(this, 1.f, 1.f, 1.f, 1.f);
  86. gGL.getTexUnit(sDiffTex)->bind(mTexturep);
  87. for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
  88. iter != mDrawFace.end(); iter++)
  89. {
  90. LLFace *face = *iter;
  91. LLVertexBuffer* buff = face->getVertexBuffer();
  92. if(buff)
  93. {
  94. buff->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
  95. buff->drawRange(LLRender::TRIANGLES, 0, buff->getNumVerts()-1, buff->getNumIndices(), 0);
  96. gPipeline.addTrianglesDrawn(buff->getNumIndices());
  97. }
  98. }
  99. }
  100. void LLDrawPoolTree::endRenderPass(S32 pass)
  101. {
  102. LLFastTimer t(FTM_RENDER_TREES);
  103. if (gPipeline.canUseWindLightShadersOnObjects())
  104. {
  105. shader->unbind();
  106. }
  107. if (mVertexShaderLevel <= 0)
  108. {
  109. gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
  110. }
  111. }
  112. //============================================
  113. // deferred implementation
  114. //============================================
  115. void LLDrawPoolTree::beginDeferredPass(S32 pass)
  116. {
  117. LLFastTimer t(FTM_RENDER_TREES);
  118. shader = &gDeferredTreeProgram;
  119. shader->bind();
  120. shader->setMinimumAlpha(0.5f);
  121. }
  122. void LLDrawPoolTree::renderDeferred(S32 pass)
  123. {
  124. render(pass);
  125. }
  126. void LLDrawPoolTree::endDeferredPass(S32 pass)
  127. {
  128. LLFastTimer t(FTM_RENDER_TREES);
  129. shader->unbind();
  130. }
  131. //============================================
  132. // shadow implementation
  133. //============================================
  134. void LLDrawPoolTree::beginShadowPass(S32 pass)
  135. {
  136. LLFastTimer t(FTM_SHADOW_TREE);
  137. glPolygonOffset(gSavedSettings.getF32("RenderDeferredTreeShadowOffset"),
  138. gSavedSettings.getF32("RenderDeferredTreeShadowBias"));
  139. gDeferredTreeShadowProgram.bind();
  140. gDeferredTreeShadowProgram.setMinimumAlpha(0.5f);
  141. }
  142. void LLDrawPoolTree::renderShadow(S32 pass)
  143. {
  144. render(pass);
  145. }
  146. void LLDrawPoolTree::endShadowPass(S32 pass)
  147. {
  148. LLFastTimer t(FTM_SHADOW_TREE);
  149. glPolygonOffset(gSavedSettings.getF32("RenderDeferredSpotShadowOffset"),
  150. gSavedSettings.getF32("RenderDeferredSpotShadowBias"));
  151. gDeferredTreeShadowProgram.unbind();
  152. }
  153. BOOL LLDrawPoolTree::verify() const
  154. {
  155. /* BOOL ok = TRUE;
  156. if (!ok)
  157. {
  158. printDebugInfo();
  159. }
  160. return ok;*/
  161. return TRUE;
  162. }
  163. LLViewerTexture *LLDrawPoolTree::getTexture()
  164. {
  165. return mTexturep;
  166. }
  167. LLViewerTexture *LLDrawPoolTree::getDebugTexture()
  168. {
  169. return mTexturep;
  170. }
  171. LLColor3 LLDrawPoolTree::getDebugColor() const
  172. {
  173. return LLColor3(1.f, 0.f, 1.f);
  174. }