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

游戏引擎

开发平台:

C++ Builder

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