PageRenderTime 32ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/indra/newview/lldynamictexture.cpp

https://bitbucket.org/lindenlab/viewer-beta/
C++ | 284 lines | 189 code | 31 blank | 64 comment | 33 complexity | c7c215b7361e29949df57d5f07107261 MD5 | raw file
Possible License(s): LGPL-2.1
  1. /**
  2. * @file lldynamictexture.cpp
  3. * @brief Implementation of LLViewerDynamicTexture class
  4. *
  5. * $LicenseInfo:firstyear=2001&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 "lldynamictexture.h"
  28. // Linden library includes
  29. #include "llglheaders.h"
  30. #include "llwindow.h" // getPosition()
  31. // Viewer includes
  32. #include "llviewerwindow.h"
  33. #include "llviewercamera.h"
  34. #include "llviewercontrol.h"
  35. #include "llviewertexture.h"
  36. #include "llvertexbuffer.h"
  37. #include "llviewerdisplay.h"
  38. #include "llrender.h"
  39. #include "pipeline.h"
  40. #include "llglslshader.h"
  41. // static
  42. LLViewerDynamicTexture::instance_list_t LLViewerDynamicTexture::sInstances[ LLViewerDynamicTexture::ORDER_COUNT ];
  43. S32 LLViewerDynamicTexture::sNumRenders = 0;
  44. //-----------------------------------------------------------------------------
  45. // LLViewerDynamicTexture()
  46. //-----------------------------------------------------------------------------
  47. LLViewerDynamicTexture::LLViewerDynamicTexture(S32 width, S32 height, S32 components, EOrder order, BOOL clamp) :
  48. LLViewerTexture(width, height, components, FALSE),
  49. mClamp(clamp)
  50. {
  51. llassert((1 <= components) && (components <= 4));
  52. if(gGLManager.mDebugGPU)
  53. {
  54. if(components == 3)
  55. {
  56. mComponents = 4 ; //convert to 32bits.
  57. }
  58. }
  59. generateGLTexture();
  60. llassert( 0 <= order && order < ORDER_COUNT );
  61. LLViewerDynamicTexture::sInstances[ order ].insert(this);
  62. }
  63. //-----------------------------------------------------------------------------
  64. // LLViewerDynamicTexture()
  65. //-----------------------------------------------------------------------------
  66. LLViewerDynamicTexture::~LLViewerDynamicTexture()
  67. {
  68. for( S32 order = 0; order < ORDER_COUNT; order++ )
  69. {
  70. LLViewerDynamicTexture::sInstances[order].erase(this); // will fail in all but one case.
  71. }
  72. }
  73. //virtual
  74. S8 LLViewerDynamicTexture::getType() const
  75. {
  76. return LLViewerTexture::DYNAMIC_TEXTURE ;
  77. }
  78. //-----------------------------------------------------------------------------
  79. // generateGLTexture()
  80. //-----------------------------------------------------------------------------
  81. void LLViewerDynamicTexture::generateGLTexture()
  82. {
  83. LLViewerTexture::generateGLTexture() ;
  84. generateGLTexture(-1, 0, 0, FALSE);
  85. }
  86. void LLViewerDynamicTexture::generateGLTexture(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes)
  87. {
  88. if (mComponents < 1 || mComponents > 4)
  89. {
  90. llerrs << "Bad number of components in dynamic texture: " << mComponents << llendl;
  91. }
  92. LLPointer<LLImageRaw> raw_image = new LLImageRaw(mFullWidth, mFullHeight, mComponents);
  93. if (internal_format >= 0)
  94. {
  95. setExplicitFormat(internal_format, primary_format, type_format, swap_bytes);
  96. }
  97. createGLTexture(0, raw_image, 0, TRUE, LLViewerTexture::DYNAMIC_TEX);
  98. setAddressMode((mClamp) ? LLTexUnit::TAM_CLAMP : LLTexUnit::TAM_WRAP);
  99. mGLTexturep->setGLTextureCreated(false);
  100. }
  101. //-----------------------------------------------------------------------------
  102. // render()
  103. //-----------------------------------------------------------------------------
  104. BOOL LLViewerDynamicTexture::render()
  105. {
  106. return FALSE;
  107. }
  108. //-----------------------------------------------------------------------------
  109. // preRender()
  110. //-----------------------------------------------------------------------------
  111. void LLViewerDynamicTexture::preRender(BOOL clear_depth)
  112. {
  113. {
  114. // force rendering to on-screen portion of frame buffer
  115. LLCoordScreen window_pos;
  116. gViewerWindow->getWindow()->getPosition( &window_pos );
  117. mOrigin.set(0, gViewerWindow->getWindowHeightRaw() - mFullHeight); // top left corner
  118. if (window_pos.mX < 0)
  119. {
  120. mOrigin.mX = -window_pos.mX;
  121. }
  122. if (window_pos.mY < 0)
  123. {
  124. mOrigin.mY += window_pos.mY;
  125. mOrigin.mY = llmax(mOrigin.mY, 0) ;
  126. }
  127. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  128. }
  129. // Set up camera
  130. LLViewerCamera* camera = LLViewerCamera::getInstance();
  131. mCamera.setOrigin(*camera);
  132. mCamera.setAxes(*camera);
  133. mCamera.setAspect(camera->getAspect());
  134. mCamera.setView(camera->getView());
  135. mCamera.setNear(camera->getNear());
  136. glViewport(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight);
  137. if (clear_depth)
  138. {
  139. glClear(GL_DEPTH_BUFFER_BIT);
  140. }
  141. }
  142. //-----------------------------------------------------------------------------
  143. // postRender()
  144. //-----------------------------------------------------------------------------
  145. void LLViewerDynamicTexture::postRender(BOOL success)
  146. {
  147. {
  148. if (success)
  149. {
  150. if(mGLTexturep.isNull())
  151. {
  152. generateGLTexture() ;
  153. }
  154. else if(!mGLTexturep->getHasGLTexture())
  155. {
  156. generateGLTexture() ;
  157. }
  158. else if(mGLTexturep->getDiscardLevel() != 0)//do not know how it happens, but regenerate one if it does.
  159. {
  160. generateGLTexture() ;
  161. }
  162. success = mGLTexturep->setSubImageFromFrameBuffer(0, 0, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight);
  163. }
  164. }
  165. // restore viewport
  166. gViewerWindow->setup2DViewport();
  167. // restore camera
  168. LLViewerCamera* camera = LLViewerCamera::getInstance();
  169. camera->setOrigin(mCamera);
  170. camera->setAxes(mCamera);
  171. camera->setAspect(mCamera.getAspect());
  172. camera->setView(mCamera.getView());
  173. camera->setNear(mCamera.getNear());
  174. }
  175. //-----------------------------------------------------------------------------
  176. // static
  177. // updateDynamicTextures()
  178. // Calls update on each dynamic texture. Calls each group in order: "first," then "middle," then "last."
  179. //-----------------------------------------------------------------------------
  180. BOOL LLViewerDynamicTexture::updateAllInstances()
  181. {
  182. sNumRenders = 0;
  183. if (gGLManager.mIsDisabled || LLPipeline::sMemAllocationThrottled)
  184. {
  185. return TRUE;
  186. }
  187. LLGLSLShader::bindNoShader();
  188. LLVertexBuffer::unbind();
  189. BOOL result = FALSE;
  190. BOOL ret = FALSE ;
  191. for( S32 order = 0; order < ORDER_COUNT; order++ )
  192. {
  193. for (instance_list_t::iterator iter = LLViewerDynamicTexture::sInstances[order].begin();
  194. iter != LLViewerDynamicTexture::sInstances[order].end(); ++iter)
  195. {
  196. LLViewerDynamicTexture *dynamicTexture = *iter;
  197. if (dynamicTexture->needsRender())
  198. {
  199. glClear(GL_DEPTH_BUFFER_BIT);
  200. gDepthDirty = TRUE;
  201. gGL.color4f(1,1,1,1);
  202. dynamicTexture->preRender(); // Must be called outside of startRender()
  203. result = FALSE;
  204. if (dynamicTexture->render())
  205. {
  206. ret = TRUE ;
  207. result = TRUE;
  208. sNumRenders++;
  209. }
  210. gGL.flush();
  211. LLVertexBuffer::unbind();
  212. dynamicTexture->postRender(result);
  213. }
  214. }
  215. }
  216. return ret;
  217. }
  218. //-----------------------------------------------------------------------------
  219. // static
  220. // destroyGL()
  221. //-----------------------------------------------------------------------------
  222. void LLViewerDynamicTexture::destroyGL()
  223. {
  224. for( S32 order = 0; order < ORDER_COUNT; order++ )
  225. {
  226. for (instance_list_t::iterator iter = LLViewerDynamicTexture::sInstances[order].begin();
  227. iter != LLViewerDynamicTexture::sInstances[order].end(); ++iter)
  228. {
  229. LLViewerDynamicTexture *dynamicTexture = *iter;
  230. dynamicTexture->destroyGLTexture() ;
  231. }
  232. }
  233. }
  234. //-----------------------------------------------------------------------------
  235. // static
  236. // restoreGL()
  237. //-----------------------------------------------------------------------------
  238. void LLViewerDynamicTexture::restoreGL()
  239. {
  240. if (gGLManager.mIsDisabled)
  241. {
  242. return ;
  243. }
  244. for( S32 order = 0; order < ORDER_COUNT; order++ )
  245. {
  246. for (instance_list_t::iterator iter = LLViewerDynamicTexture::sInstances[order].begin();
  247. iter != LLViewerDynamicTexture::sInstances[order].end(); ++iter)
  248. {
  249. LLViewerDynamicTexture *dynamicTexture = *iter;
  250. dynamicTexture->restoreGLTexture() ;
  251. }
  252. }
  253. }