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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lldrawpoolterrain.cpp
  3.  * @brief LLDrawPoolTerrain 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 "lldrawpoolterrain.h"
  34. #include "llfasttimer.h"
  35. #include "llagent.h"
  36. #include "llviewercontrol.h"
  37. #include "lldrawable.h"
  38. #include "llface.h"
  39. #include "llsky.h"
  40. #include "llsurface.h"
  41. #include "llsurfacepatch.h"
  42. #include "llviewerregion.h"
  43. #include "llvlcomposition.h"
  44. #include "llviewerparcelmgr.h" // for gRenderParcelOwnership
  45. #include "llviewerparceloverlay.h"
  46. #include "llvosurfacepatch.h"
  47. #include "llviewercamera.h"
  48. #include "llviewertexturelist.h" // To get alpha gradients
  49. #include "llworld.h"
  50. #include "pipeline.h"
  51. #include "llviewershadermgr.h"
  52. #include "llrender.h"
  53. const F32 DETAIL_SCALE = 1.f/16.f;
  54. int DebugDetailMap = 0;
  55. S32 LLDrawPoolTerrain::sDetailMode = 1;
  56. F32 LLDrawPoolTerrain::sDetailScale = DETAIL_SCALE;
  57. static LLGLSLShader* sShader = NULL;
  58. static LLFastTimer::DeclareTimer FTM_SHADOW_TERRAIN("Terrain Shadow");
  59. LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
  60. LLFacePool(POOL_TERRAIN),
  61. mTexturep(texturep)
  62. {
  63. // Hack!
  64. sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale");
  65. sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
  66. mAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga", 
  67. TRUE, LLViewerTexture::BOOST_UI, 
  68. LLViewerTexture::FETCHED_TEXTURE,
  69. GL_ALPHA8, GL_ALPHA,
  70. LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb"));
  71. //gGL.getTexUnit(0)->bind(mAlphaRampImagep.get());
  72. mAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP);
  73. m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c", 
  74. TRUE, LLViewerTexture::BOOST_UI, 
  75. LLViewerTexture::FETCHED_TEXTURE,
  76. GL_ALPHA8, GL_ALPHA,
  77. LLUUID("38b86f85-2575-52a9-a531-23108d8da837"));
  78. //gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());
  79. m2DAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP);
  80. mTexturep->setBoostLevel(LLViewerTexture::BOOST_TERRAIN);
  81. //gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  82. }
  83. LLDrawPoolTerrain::~LLDrawPoolTerrain()
  84. {
  85. llassert( gPipeline.findPool( getType(), getTexture() ) == NULL );
  86. }
  87. LLDrawPool *LLDrawPoolTerrain::instancePool()
  88. {
  89. return new LLDrawPoolTerrain(mTexturep);
  90. }
  91. U32 LLDrawPoolTerrain::getVertexDataMask() 
  92. if (LLPipeline::sShadowRender)
  93. {
  94. return LLVertexBuffer::MAP_VERTEX;
  95. }
  96. else
  97. {
  98. return VERTEX_DATA_MASK; 
  99. }
  100. }
  101. void LLDrawPoolTerrain::prerender()
  102. {
  103. mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_ENVIRONMENT);
  104. if (mVertexShaderLevel > 0)
  105. {
  106. sDetailMode = 1;
  107. }
  108. else
  109. {
  110. sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
  111. }
  112. }
  113. void LLDrawPoolTerrain::beginRenderPass( S32 pass )
  114. {
  115. LLFastTimer t(FTM_RENDER_TERRAIN);
  116. LLFacePool::beginRenderPass(pass);
  117. sShader = LLPipeline::sUnderWaterRender ? 
  118. &gTerrainWaterProgram :
  119. &gTerrainProgram;
  120. if (mVertexShaderLevel > 1 && sShader->mShaderLevel > 0)
  121. {
  122. sShader->bind();
  123. }
  124. }
  125. void LLDrawPoolTerrain::endRenderPass( S32 pass )
  126. {
  127. LLFastTimer t(FTM_RENDER_TERRAIN);
  128. LLFacePool::endRenderPass(pass);
  129. if (mVertexShaderLevel > 1 && sShader->mShaderLevel > 0) {
  130. sShader->unbind();
  131. }
  132. }
  133. //static
  134. S32 LLDrawPoolTerrain::getDetailMode()
  135. {
  136. return sDetailMode;
  137. }
  138. void LLDrawPoolTerrain::render(S32 pass)
  139. {
  140. LLFastTimer t(FTM_RENDER_TERRAIN);
  141. if (mDrawFace.empty())
  142. {
  143. return;
  144. }
  145. // Hack! Get the region that this draw pool is rendering from!
  146. LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion();
  147. LLVLComposition *compp = regionp->getComposition();
  148. for (S32 i = 0; i < 4; i++)
  149. {
  150. compp->mDetailTextures[i]->setBoostLevel(LLViewerTexture::BOOST_TERRAIN);
  151. compp->mDetailTextures[i]->addTextureStats(1024.f*1024.f); // assume large pixel area
  152. }
  153. if (!gGLManager.mHasMultitexture)
  154. {
  155. // No multitexture, render simple land.
  156. renderSimple(); // Render without multitexture
  157. return;
  158. }
  159. // Render simplified land if video card can't do sufficient multitexturing
  160. if (!gGLManager.mHasARBEnvCombine || (gGLManager.mNumTextureUnits < 2))
  161. {
  162. renderSimple(); // Render without multitexture
  163. return;
  164. }
  165. LLGLSPipeline gls;
  166. LLOverrideFaceColor override(this, 1.f, 1.f, 1.f, 1.f);
  167. if (mVertexShaderLevel > 1 && sShader->mShaderLevel > 0)
  168. {
  169. gPipeline.enableLightsDynamic();
  170. renderFullShader();
  171. }
  172. else
  173. {
  174. gPipeline.enableLightsStatic();
  175. if (sDetailMode == 0){
  176. renderSimple();
  177. } else if (gGLManager.mNumTextureUnits < 4){
  178. renderFull2TU();
  179. } else {
  180. renderFull4TU();
  181. }
  182. }
  183. // Special-case for land ownership feedback
  184. if (gSavedSettings.getBOOL("ShowParcelOwners"))
  185. {
  186. if (mVertexShaderLevel > 1)
  187. { //use fullbright shader for highlighting
  188. LLGLSLShader* old_shader = sShader;
  189. sShader->unbind();
  190. sShader = &gObjectFullbrightProgram;
  191. sShader->bind();
  192. renderOwnership();
  193. sShader = old_shader;
  194. sShader->bind();
  195. }
  196. else
  197. {
  198. gPipeline.disableLights();
  199. renderOwnership();
  200. }
  201. }
  202. }
  203. void LLDrawPoolTerrain::beginDeferredPass(S32 pass)
  204. {
  205. LLFastTimer t(FTM_RENDER_TERRAIN);
  206. LLFacePool::beginRenderPass(pass);
  207. sShader = &gDeferredTerrainProgram;
  208. sShader->bind();
  209. }
  210. void LLDrawPoolTerrain::endDeferredPass(S32 pass)
  211. {
  212. LLFastTimer t(FTM_RENDER_TERRAIN);
  213. LLFacePool::endRenderPass(pass);
  214. sShader->unbind();
  215. }
  216. void LLDrawPoolTerrain::renderDeferred(S32 pass)
  217. {
  218. LLFastTimer t(FTM_RENDER_TERRAIN);
  219. if (mDrawFace.empty())
  220. {
  221. return;
  222. }
  223. renderFullShader();
  224. }
  225. void LLDrawPoolTerrain::beginShadowPass(S32 pass)
  226. {
  227. LLFastTimer t(FTM_SHADOW_TERRAIN);
  228. LLFacePool::beginRenderPass(pass);
  229. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  230. gDeferredShadowProgram.bind();
  231. }
  232. void LLDrawPoolTerrain::endShadowPass(S32 pass)
  233. {
  234. LLFastTimer t(FTM_SHADOW_TERRAIN);
  235. LLFacePool::endRenderPass(pass);
  236. gDeferredShadowProgram.unbind();
  237. }
  238. void LLDrawPoolTerrain::renderShadow(S32 pass)
  239. {
  240. LLFastTimer t(FTM_SHADOW_TERRAIN);
  241. if (mDrawFace.empty())
  242. {
  243. return;
  244. }
  245. //LLGLEnable offset(GL_POLYGON_OFFSET);
  246. //glCullFace(GL_FRONT);
  247. drawLoop();
  248. //glCullFace(GL_BACK);
  249. }
  250. void LLDrawPoolTerrain::renderFullShader()
  251. {
  252. // Hack! Get the region that this draw pool is rendering from!
  253. LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion();
  254. LLVLComposition *compp = regionp->getComposition();
  255. LLViewerTexture *detail_texture0p = compp->mDetailTextures[0];
  256. LLViewerTexture *detail_texture1p = compp->mDetailTextures[1];
  257. LLViewerTexture *detail_texture2p = compp->mDetailTextures[2];
  258. LLViewerTexture *detail_texture3p = compp->mDetailTextures[3];
  259. LLVector3d region_origin_global = gAgent.getRegion()->getOriginGlobal();
  260. F32 offset_x = (F32)fmod(region_origin_global.mdV[VX], 1.0/(F64)sDetailScale)*sDetailScale;
  261. F32 offset_y = (F32)fmod(region_origin_global.mdV[VY], 1.0/(F64)sDetailScale)*sDetailScale;
  262. LLVector4 tp0, tp1;
  263. tp0.setVec(sDetailScale, 0.0f, 0.0f, offset_x);
  264. tp1.setVec(0.0f, sDetailScale, 0.0f, offset_y);
  265. //
  266. // detail texture 0
  267. //
  268. S32 detail0 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL0);
  269. gGL.getTexUnit(detail0)->bind(detail_texture0p);
  270. gGL.getTexUnit(0)->activate();
  271. glEnable(GL_TEXTURE_GEN_S);
  272. glEnable(GL_TEXTURE_GEN_T);
  273. glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  274. glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  275. glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
  276. glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
  277. glMatrixMode(GL_TEXTURE);
  278. glLoadIdentity();
  279. glMatrixMode(GL_MODELVIEW);
  280. //
  281. // detail texture 1
  282. //
  283. S32 detail1 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL1); 
  284. gGL.getTexUnit(detail1)->bind(detail_texture1p);
  285. /// ALPHA TEXTURE COORDS 0:
  286. gGL.getTexUnit(1)->activate();
  287. glMatrixMode(GL_TEXTURE);
  288. glLoadIdentity();
  289. glMatrixMode(GL_MODELVIEW);
  290. // detail texture 2
  291. //
  292. S32 detail2 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL2);
  293. gGL.getTexUnit(detail2)->bind(detail_texture2p);
  294. gGL.getTexUnit(2)->activate();
  295. /// ALPHA TEXTURE COORDS 1:
  296. glMatrixMode(GL_TEXTURE);
  297. glLoadIdentity();
  298. glTranslatef(-2.f, 0.f, 0.f);
  299. glMatrixMode(GL_MODELVIEW);
  300. //
  301. // detail texture 3
  302. //
  303. S32 detail3 = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_DETAIL3);
  304. gGL.getTexUnit(detail3)->bind(detail_texture3p);
  305. /// ALPHA TEXTURE COORDS 2:
  306. gGL.getTexUnit(3)->activate();
  307. glMatrixMode(GL_TEXTURE);
  308. glLoadIdentity();
  309. glTranslatef(-1.f, 0.f, 0.f);
  310. glMatrixMode(GL_MODELVIEW);
  311. //
  312. // Alpha Ramp 
  313. //
  314. S32 alpha_ramp = sShader->enableTexture(LLViewerShaderMgr::TERRAIN_ALPHARAMP);
  315. gGL.getTexUnit(alpha_ramp)->bind(m2DAlphaRampImagep);
  316. // GL_BLEND disabled by default
  317. drawLoop();
  318. // Disable multitexture
  319. sShader->disableTexture(LLViewerShaderMgr::TERRAIN_ALPHARAMP);
  320. sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL0);
  321. sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL1);
  322. sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL2);
  323. sShader->disableTexture(LLViewerShaderMgr::TERRAIN_DETAIL3);
  324. gGL.getTexUnit(alpha_ramp)->unbind(LLTexUnit::TT_TEXTURE);
  325. gGL.getTexUnit(4)->disable();
  326. gGL.getTexUnit(4)->activate();
  327. glDisable(GL_TEXTURE_GEN_S);
  328. glDisable(GL_TEXTURE_GEN_T);
  329. glMatrixMode(GL_TEXTURE);
  330. glLoadIdentity();
  331. glMatrixMode(GL_MODELVIEW);
  332. gGL.getTexUnit(detail3)->unbind(LLTexUnit::TT_TEXTURE);
  333. gGL.getTexUnit(3)->disable();
  334. gGL.getTexUnit(3)->activate();
  335. glDisable(GL_TEXTURE_GEN_S);
  336. glDisable(GL_TEXTURE_GEN_T);
  337. glMatrixMode(GL_TEXTURE);
  338. glLoadIdentity();
  339. glMatrixMode(GL_MODELVIEW);
  340. gGL.getTexUnit(detail2)->unbind(LLTexUnit::TT_TEXTURE);
  341. gGL.getTexUnit(2)->disable();
  342. gGL.getTexUnit(2)->activate();
  343. glDisable(GL_TEXTURE_GEN_S);
  344. glDisable(GL_TEXTURE_GEN_T);
  345. glMatrixMode(GL_TEXTURE);
  346. glLoadIdentity();
  347. glMatrixMode(GL_MODELVIEW);
  348. gGL.getTexUnit(detail1)->unbind(LLTexUnit::TT_TEXTURE);
  349. gGL.getTexUnit(1)->disable();
  350. gGL.getTexUnit(1)->activate();
  351. glDisable(GL_TEXTURE_GEN_S);
  352. glDisable(GL_TEXTURE_GEN_T);
  353. glMatrixMode(GL_TEXTURE);
  354. glLoadIdentity();
  355. glMatrixMode(GL_MODELVIEW);
  356. //----------------------------------------------------------------------------
  357. // Restore Texture Unit 0 defaults
  358. gGL.getTexUnit(detail0)->unbind(LLTexUnit::TT_TEXTURE);
  359. gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
  360. gGL.getTexUnit(0)->activate();
  361. glDisable(GL_TEXTURE_GEN_S);
  362. glDisable(GL_TEXTURE_GEN_T);
  363. glMatrixMode(GL_TEXTURE);
  364. glLoadIdentity();
  365. glMatrixMode(GL_MODELVIEW);
  366. }
  367. void LLDrawPoolTerrain::renderFull4TU()
  368. {
  369. // Hack! Get the region that this draw pool is rendering from!
  370. LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion();
  371. LLVLComposition *compp = regionp->getComposition();
  372. LLViewerTexture *detail_texture0p = compp->mDetailTextures[0];
  373. LLViewerTexture *detail_texture1p = compp->mDetailTextures[1];
  374. LLViewerTexture *detail_texture2p = compp->mDetailTextures[2];
  375. LLViewerTexture *detail_texture3p = compp->mDetailTextures[3];
  376. LLVector3d region_origin_global = gAgent.getRegion()->getOriginGlobal();
  377. F32 offset_x = (F32)fmod(region_origin_global.mdV[VX], 1.0/(F64)sDetailScale)*sDetailScale;
  378. F32 offset_y = (F32)fmod(region_origin_global.mdV[VY], 1.0/(F64)sDetailScale)*sDetailScale;
  379. LLVector4 tp0, tp1;
  380. tp0.setVec(sDetailScale, 0.0f, 0.0f, offset_x);
  381. tp1.setVec(0.0f, sDetailScale, 0.0f, offset_y);
  382. gGL.blendFunc(LLRender::BF_ONE_MINUS_SOURCE_ALPHA, LLRender::BF_SOURCE_ALPHA);
  383. //----------------------------------------------------------------------------
  384. // Pass 1/1
  385. //
  386. // Stage 0: detail texture 0
  387. //
  388. gGL.getTexUnit(0)->activate();
  389. gGL.getTexUnit(0)->bind(detail_texture0p);
  390. glEnable(GL_TEXTURE_GEN_S);
  391. glEnable(GL_TEXTURE_GEN_T);
  392. glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  393. glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  394. glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
  395. glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
  396. gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);
  397. //
  398. // Stage 1: Generate alpha ramp for detail0/detail1 transition
  399. //
  400. gGL.getTexUnit(1)->bind(m2DAlphaRampImagep.get());
  401. gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
  402. gGL.getTexUnit(1)->activate();
  403. // Care about alpha only
  404. gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
  405. gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
  406. //
  407. // Stage 2: Interpolate detail1 with existing based on ramp
  408. //
  409. gGL.getTexUnit(2)->bind(detail_texture1p);
  410. gGL.getTexUnit(2)->enable(LLTexUnit::TT_TEXTURE);
  411. gGL.getTexUnit(2)->activate();
  412. glEnable(GL_TEXTURE_GEN_S);
  413. glEnable(GL_TEXTURE_GEN_T);
  414. glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  415. glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  416. glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
  417. glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
  418. gGL.getTexUnit(2)->setTextureColorBlend(LLTexUnit::TBO_LERP_PREV_ALPHA, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_TEX_COLOR);
  419. //
  420. // Stage 3: Modulate with primary (vertex) color for lighting
  421. //
  422. gGL.getTexUnit(3)->bind(detail_texture1p);
  423. gGL.getTexUnit(3)->enable(LLTexUnit::TT_TEXTURE);
  424. gGL.getTexUnit(3)->activate();
  425. // Set alpha texture and do lighting modulation
  426. gGL.getTexUnit(3)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_VERT_COLOR);
  427. gGL.getTexUnit(0)->activate();
  428. // GL_BLEND disabled by default
  429. drawLoop();
  430. //----------------------------------------------------------------------------
  431. // Second pass
  432. // Stage 0: Write detail3 into base
  433. //
  434. gGL.getTexUnit(0)->activate();
  435. gGL.getTexUnit(0)->bind(detail_texture3p);
  436. glEnable(GL_TEXTURE_GEN_S);
  437. glEnable(GL_TEXTURE_GEN_T);
  438. glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  439. glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  440. glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
  441. glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
  442. gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_COLOR);
  443. //
  444. // Stage 1: Generate alpha ramp for detail2/detail3 transition
  445. //
  446. gGL.getTexUnit(1)->bind(m2DAlphaRampImagep);
  447. gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
  448. gGL.getTexUnit(1)->activate();
  449. // Set the texture matrix
  450. glMatrixMode(GL_TEXTURE);
  451. glLoadIdentity();
  452. glTranslatef(-2.f, 0.f, 0.f);
  453. // Care about alpha only
  454. gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
  455. gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
  456. //
  457. // Stage 2: Interpolate detail2 with existing based on ramp
  458. //
  459. gGL.getTexUnit(2)->bind(detail_texture2p);
  460. gGL.getTexUnit(2)->enable(LLTexUnit::TT_TEXTURE);
  461. gGL.getTexUnit(2)->activate();
  462. glEnable(GL_TEXTURE_GEN_S);
  463. glEnable(GL_TEXTURE_GEN_T);
  464. glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  465. glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  466. glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
  467. glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
  468. gGL.getTexUnit(2)->setTextureColorBlend(LLTexUnit::TBO_LERP_PREV_ALPHA, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
  469. //
  470. // Stage 3: Generate alpha ramp for detail1/detail2 transition
  471. //
  472. gGL.getTexUnit(3)->bind(m2DAlphaRampImagep);
  473. gGL.getTexUnit(3)->enable(LLTexUnit::TT_TEXTURE);
  474. gGL.getTexUnit(3)->activate();
  475. // Set the texture matrix
  476. glMatrixMode(GL_TEXTURE);
  477. glLoadIdentity();
  478. glTranslatef(-1.f, 0.f, 0.f);
  479.   
  480. // Set alpha texture and do lighting modulation
  481. gGL.getTexUnit(3)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_PREV_COLOR, LLTexUnit::TBS_VERT_COLOR);
  482. gGL.getTexUnit(3)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
  483. gGL.getTexUnit(0)->activate();
  484. {
  485. LLGLEnable blend(GL_BLEND);
  486. drawLoop();
  487. }
  488. LLVertexBuffer::unbind();
  489. // Disable multitexture
  490. gGL.getTexUnit(3)->unbind(LLTexUnit::TT_TEXTURE);
  491. gGL.getTexUnit(3)->disable();
  492. gGL.getTexUnit(3)->activate();
  493. glMatrixMode(GL_TEXTURE);
  494. glLoadIdentity();
  495. glMatrixMode(GL_MODELVIEW);
  496. gGL.getTexUnit(2)->unbind(LLTexUnit::TT_TEXTURE);
  497. gGL.getTexUnit(2)->disable();
  498. gGL.getTexUnit(2)->activate();
  499. glDisable(GL_TEXTURE_GEN_S);
  500. glDisable(GL_TEXTURE_GEN_T);
  501. glMatrixMode(GL_TEXTURE);
  502. glLoadIdentity();
  503. glMatrixMode(GL_MODELVIEW);
  504. gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
  505. gGL.getTexUnit(1)->disable();
  506. gGL.getTexUnit(1)->activate();
  507.  
  508. glMatrixMode(GL_TEXTURE);
  509. glLoadIdentity();
  510. glMatrixMode(GL_MODELVIEW);
  511. // Restore blend state
  512. gGL.setSceneBlendType(LLRender::BT_ALPHA);
  513. //----------------------------------------------------------------------------
  514. // Restore Texture Unit 0 defaults
  515. gGL.getTexUnit(0)->activate();
  516. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  517. glDisable(GL_TEXTURE_GEN_S);
  518. glDisable(GL_TEXTURE_GEN_T);
  519. glMatrixMode(GL_TEXTURE);
  520. glLoadIdentity();
  521. glMatrixMode(GL_MODELVIEW);
  522. gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
  523. }
  524. void LLDrawPoolTerrain::renderFull2TU()
  525. {
  526. // Hack! Get the region that this draw pool is rendering from!
  527. LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion();
  528. LLVLComposition *compp = regionp->getComposition();
  529. LLViewerTexture *detail_texture0p = compp->mDetailTextures[0];
  530. LLViewerTexture *detail_texture1p = compp->mDetailTextures[1];
  531. LLViewerTexture *detail_texture2p = compp->mDetailTextures[2];
  532. LLViewerTexture *detail_texture3p = compp->mDetailTextures[3];
  533. LLVector3d region_origin_global = gAgent.getRegion()->getOriginGlobal();
  534. F32 offset_x = (F32)fmod(region_origin_global.mdV[VX], 1.0/(F64)sDetailScale)*sDetailScale;
  535. F32 offset_y = (F32)fmod(region_origin_global.mdV[VY], 1.0/(F64)sDetailScale)*sDetailScale;
  536. LLVector4 tp0, tp1;
  537. tp0.setVec(sDetailScale, 0.0f, 0.0f, offset_x);
  538. tp1.setVec(0.0f, sDetailScale, 0.0f, offset_y);
  539. gGL.blendFunc(LLRender::BF_ONE_MINUS_SOURCE_ALPHA, LLRender::BF_SOURCE_ALPHA);
  540. //----------------------------------------------------------------------------
  541. // Pass 1/4
  542. //
  543. // Stage 0: Render detail 0 into base
  544. //
  545. gGL.getTexUnit(0)->bind(detail_texture0p);
  546. glEnable(GL_TEXTURE_GEN_S);
  547. glEnable(GL_TEXTURE_GEN_T);
  548. glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  549. glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  550. glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
  551. glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
  552. gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR);
  553. drawLoop();
  554. //----------------------------------------------------------------------------
  555. // Pass 2/4
  556. //
  557. // Stage 0: Generate alpha ramp for detail0/detail1 transition
  558. //
  559. gGL.getTexUnit(0)->bind(m2DAlphaRampImagep);
  560. glDisable(GL_TEXTURE_GEN_S);
  561. glDisable(GL_TEXTURE_GEN_T);
  562. // Care about alpha only
  563. gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
  564. gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
  565. //
  566. // Stage 1: Write detail1
  567. //
  568. gGL.getTexUnit(1)->bind(detail_texture1p);
  569. gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
  570. gGL.getTexUnit(1)->activate();
  571. glEnable(GL_TEXTURE_GEN_S);
  572. glEnable(GL_TEXTURE_GEN_T);
  573. glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  574. glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  575. glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
  576. glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
  577. gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR);
  578. gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_ALPHA);
  579. gGL.getTexUnit(0)->activate();
  580. {
  581. LLGLEnable blend(GL_BLEND);
  582. drawLoop();
  583. }
  584. //----------------------------------------------------------------------------
  585. // Pass 3/4
  586. //
  587. // Stage 0: Generate alpha ramp for detail1/detail2 transition
  588. //
  589. gGL.getTexUnit(0)->bind(m2DAlphaRampImagep);
  590. // Set the texture matrix
  591. glMatrixMode(GL_TEXTURE);
  592. glLoadIdentity();
  593. glTranslatef(-1.f, 0.f, 0.f);
  594. // Care about alpha only
  595. gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
  596. gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
  597. //
  598. // Stage 1: Write detail2
  599. //
  600. gGL.getTexUnit(1)->bind(detail_texture2p);
  601. gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
  602. gGL.getTexUnit(1)->activate();
  603. glEnable(GL_TEXTURE_GEN_S);
  604. glEnable(GL_TEXTURE_GEN_T);
  605. glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  606. glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  607. glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
  608. glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
  609. gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR);
  610. gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_ALPHA);
  611. {
  612. LLGLEnable blend(GL_BLEND);
  613. drawLoop();
  614. }
  615. //----------------------------------------------------------------------------
  616. // Pass 4/4
  617. //
  618. // Stage 0: Generate alpha ramp for detail2/detail3 transition
  619. //
  620. gGL.getTexUnit(0)->activate();
  621. gGL.getTexUnit(0)->bind(m2DAlphaRampImagep);
  622. // Set the texture matrix
  623. glMatrixMode(GL_TEXTURE);
  624. glLoadIdentity();
  625. glTranslatef(-2.f, 0.f, 0.f);
  626. // Care about alpha only
  627. gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR);
  628. gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_TEX_ALPHA);
  629. // Stage 1: Write detail3
  630. gGL.getTexUnit(1)->bind(detail_texture3p);
  631. gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
  632. gGL.getTexUnit(1)->activate();
  633. glEnable(GL_TEXTURE_GEN_S);
  634. glEnable(GL_TEXTURE_GEN_T);
  635. glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  636. glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  637. glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
  638. glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
  639. gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR);
  640. gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_ALPHA);
  641. gGL.getTexUnit(0)->activate();
  642. {
  643. LLGLEnable blend(GL_BLEND);
  644. drawLoop();
  645. }
  646. // Restore blend state
  647. gGL.setSceneBlendType(LLRender::BT_ALPHA);
  648. // Disable multitexture
  649. gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
  650. gGL.getTexUnit(1)->disable();
  651. gGL.getTexUnit(1)->activate();
  652. glDisable(GL_TEXTURE_GEN_S);
  653. glDisable(GL_TEXTURE_GEN_T);
  654. glMatrixMode(GL_TEXTURE);
  655. glLoadIdentity();
  656. glMatrixMode(GL_MODELVIEW);
  657. //----------------------------------------------------------------------------
  658. // Restore Texture Unit 0 defaults
  659. gGL.getTexUnit(0)->activate();
  660. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  661. glDisable(GL_TEXTURE_GEN_S);
  662. glDisable(GL_TEXTURE_GEN_T);
  663. glMatrixMode(GL_TEXTURE);
  664. glLoadIdentity();
  665. glMatrixMode(GL_MODELVIEW);
  666. gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
  667. }
  668. void LLDrawPoolTerrain::renderSimple()
  669. {
  670. LLVector4 tp0, tp1;
  671. //----------------------------------------------------------------------------
  672. // Pass 1/1
  673. // Stage 0: Base terrain texture pass
  674. mTexturep->addTextureStats(1024.f*1024.f);
  675. gGL.getTexUnit(0)->activate();
  676. gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
  677. gGL.getTexUnit(0)->bind(mTexturep);
  678. LLVector3 origin_agent = mDrawFace[0]->getDrawable()->getVObj()->getRegion()->getOriginAgent();
  679. F32 tscale = 1.f/256.f;
  680. tp0.setVec(tscale, 0.f, 0.0f, -1.f*(origin_agent.mV[0]/256.f));
  681. tp1.setVec(0.f, tscale, 0.0f, -1.f*(origin_agent.mV[1]/256.f));
  682. glEnable(GL_TEXTURE_GEN_S);
  683. glEnable(GL_TEXTURE_GEN_T);
  684. glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  685. glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  686. glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
  687. glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
  688. gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_VERT_COLOR);
  689. drawLoop();
  690. //----------------------------------------------------------------------------
  691. // Restore Texture Unit 0 defaults
  692. gGL.getTexUnit(0)->activate();
  693. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  694. glDisable(GL_TEXTURE_GEN_S);
  695. glDisable(GL_TEXTURE_GEN_T);
  696. glMatrixMode(GL_TEXTURE);
  697. glLoadIdentity();
  698. glMatrixMode(GL_MODELVIEW);
  699. gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
  700. }
  701. //============================================================================
  702. void LLDrawPoolTerrain::renderOwnership()
  703. {
  704. LLGLSPipelineAlpha gls_pipeline_alpha;
  705. llassert(!mDrawFace.empty());
  706. // Each terrain pool is associated with a single region.
  707. // We need to peek back into the viewer's data to find out
  708. // which ownership overlay texture to use.
  709. LLFace *facep = mDrawFace[0];
  710. LLDrawable *drawablep = facep->getDrawable();
  711. const LLViewerObject *objectp = drawablep->getVObj();
  712. const LLVOSurfacePatch *vo_surface_patchp = (LLVOSurfacePatch *)objectp;
  713. LLSurfacePatch *surface_patchp = vo_surface_patchp->getPatch();
  714. LLSurface *surfacep = surface_patchp->getSurface();
  715. LLViewerRegion *regionp = surfacep->getRegion();
  716. LLViewerParcelOverlay *overlayp = regionp->getParcelOverlay();
  717. LLViewerTexture *texturep = overlayp->getTexture();
  718. gGL.getTexUnit(0)->bind(texturep);
  719. // *NOTE: Because the region is 256 meters wide, but has 257 pixels, the 
  720. // texture coordinates for pixel 256x256 is not 1,1. This makes the
  721. // ownership map not line up with the selection. We address this with
  722. // a texture matrix multiply.
  723. glMatrixMode(GL_TEXTURE);
  724. glPushMatrix();
  725. const F32 TEXTURE_FUDGE = 257.f / 256.f;
  726. glScalef( TEXTURE_FUDGE, TEXTURE_FUDGE, 1.f );
  727. for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
  728.  iter != mDrawFace.end(); iter++)
  729. {
  730. LLFace *facep = *iter;
  731. facep->renderIndexed(LLVertexBuffer::MAP_VERTEX |
  732. LLVertexBuffer::MAP_TEXCOORD0);
  733. }
  734. glMatrixMode(GL_TEXTURE);
  735. glPopMatrix();
  736. glMatrixMode(GL_MODELVIEW);
  737. }
  738. void LLDrawPoolTerrain::renderForSelect()
  739. {
  740. if (mDrawFace.empty())
  741. {
  742. return;
  743. }
  744. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  745. for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
  746.  iter != mDrawFace.end(); iter++)
  747. {
  748. LLFace *facep = *iter;
  749. if (!facep->getDrawable()->isDead() && (facep->getDrawable()->getVObj()->mGLName))
  750. {
  751. facep->renderForSelect(LLVertexBuffer::MAP_VERTEX);
  752. }
  753. }
  754. }
  755. void LLDrawPoolTerrain::dirtyTextures(const std::set<LLViewerFetchedTexture*>& textures)
  756. {
  757. LLViewerFetchedTexture* tex = LLViewerTextureManager::staticCastToFetchedTexture(mTexturep) ;
  758. if (tex && textures.find(tex) != textures.end())
  759. {
  760. for (std::vector<LLFace*>::iterator iter = mReferences.begin();
  761.  iter != mReferences.end(); iter++)
  762. {
  763. LLFace *facep = *iter;
  764. gPipeline.markTextured(facep->getDrawable());
  765. }
  766. }
  767. }
  768. LLViewerTexture *LLDrawPoolTerrain::getTexture()
  769. {
  770. return mTexturep;
  771. }
  772. LLViewerTexture *LLDrawPoolTerrain::getDebugTexture()
  773. {
  774. return mTexturep;
  775. }
  776. LLColor3 LLDrawPoolTerrain::getDebugColor() const
  777. {
  778. return LLColor3(0.f, 0.f, 1.f);
  779. }