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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lldrawpoolwater.cpp
  3.  * @brief LLDrawPoolWater 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 "llfeaturemanager.h"
  34. #include "lldrawpoolwater.h"
  35. #include "llviewercontrol.h"
  36. #include "lldir.h"
  37. #include "llerror.h"
  38. #include "m3math.h"
  39. #include "llrender.h"
  40. #include "llagent.h" // for gAgent for getRegion for getWaterHeight
  41. #include "llcubemap.h"
  42. #include "lldrawable.h"
  43. #include "llface.h"
  44. #include "llsky.h"
  45. #include "llviewertexturelist.h"
  46. #include "llviewerregion.h"
  47. #include "llvosky.h"
  48. #include "llvowater.h"
  49. #include "llworld.h"
  50. #include "pipeline.h"
  51. #include "llviewershadermgr.h"
  52. #include "llwaterparammanager.h"
  53. const LLUUID WATER_TEST("2bfd3884-7e27-69b9-ba3a-3e673f680004");
  54. static float sTime;
  55. BOOL deferred_render = FALSE;
  56. BOOL LLDrawPoolWater::sSkipScreenCopy = FALSE;
  57. BOOL LLDrawPoolWater::sNeedsReflectionUpdate = TRUE;
  58. BOOL LLDrawPoolWater::sNeedsDistortionUpdate = TRUE;
  59. LLColor4 LLDrawPoolWater::sWaterFogColor = LLColor4(0.2f, 0.5f, 0.5f, 0.f);
  60. LLVector3 LLDrawPoolWater::sLightDir;
  61. LLDrawPoolWater::LLDrawPoolWater() :
  62. LLFacePool(POOL_WATER)
  63. {
  64. mHBTex[0] = LLViewerTextureManager::getFetchedTexture(gSunTextureID, TRUE, LLViewerTexture::BOOST_UI);
  65. gGL.getTexUnit(0)->bind(mHBTex[0]) ;
  66. mHBTex[0]->setAddressMode(LLTexUnit::TAM_CLAMP);
  67. mHBTex[1] = LLViewerTextureManager::getFetchedTexture(gMoonTextureID, TRUE, LLViewerTexture::BOOST_UI);
  68. gGL.getTexUnit(0)->bind(mHBTex[1]);
  69. mHBTex[1]->setAddressMode(LLTexUnit::TAM_CLAMP);
  70. mWaterImagep = LLViewerTextureManager::getFetchedTexture(WATER_TEST);
  71. mWaterImagep->setNoDelete() ;
  72. mWaterNormp = LLViewerTextureManager::getFetchedTexture(DEFAULT_WATER_NORMAL);
  73. mWaterNormp->setNoDelete() ;
  74. restoreGL();
  75. }
  76. LLDrawPoolWater::~LLDrawPoolWater()
  77. {
  78. }
  79. //static
  80. void LLDrawPoolWater::restoreGL()
  81. {
  82. }
  83. LLDrawPool *LLDrawPoolWater::instancePool()
  84. {
  85. llerrs << "Should never be calling instancePool on a water pool!" << llendl;
  86. return NULL;
  87. }
  88. void LLDrawPoolWater::prerender()
  89. {
  90. mVertexShaderLevel = (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps) ?
  91. LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_WATER) : 0;
  92. // got rid of modulation by light color since it got a little too
  93. // green at sunset and sl-57047 (underwater turns black at 8:00)
  94. sWaterFogColor = LLWaterParamManager::instance()->getFogColor();
  95. sWaterFogColor.mV[3] = 0;
  96. }
  97. S32 LLDrawPoolWater::getNumPasses()
  98. {
  99. if (LLViewerCamera::getInstance()->getOrigin().mV[2] < 1024.f)
  100. {
  101. return 1;
  102. }
  103. return 0;
  104. }
  105. void LLDrawPoolWater::beginPostDeferredPass(S32 pass)
  106. {
  107. beginRenderPass(pass);
  108. deferred_render = TRUE;
  109. }
  110. void LLDrawPoolWater::endPostDeferredPass(S32 pass)
  111. {
  112. endRenderPass(pass);
  113. deferred_render = FALSE;
  114. }
  115. //===============================
  116. //DEFERRED IMPLEMENTATION
  117. //===============================
  118. void LLDrawPoolWater::renderDeferred(S32 pass)
  119. {
  120. LLFastTimer t(FTM_RENDER_WATER);
  121. deferred_render = TRUE;
  122. shade();
  123. deferred_render = FALSE;
  124. }
  125. //=========================================
  126. void LLDrawPoolWater::render(S32 pass)
  127. {
  128. LLFastTimer ftm(FTM_RENDER_WATER);
  129. if (mDrawFace.empty() || LLDrawable::getCurrentFrame() <= 1)
  130. {
  131. return;
  132. }
  133. //do a quick 'n dirty depth sort
  134. for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
  135.  iter != mDrawFace.end(); iter++)
  136. {
  137. LLFace* facep = *iter;
  138. facep->mDistance = -facep->mCenterLocal.mV[2];
  139. }
  140. std::sort(mDrawFace.begin(), mDrawFace.end(), LLFace::CompareDistanceGreater());
  141. LLGLEnable blend(GL_BLEND);
  142. if ((mVertexShaderLevel > 0) && !sSkipScreenCopy)
  143. {
  144. shade();
  145. return;
  146. }
  147. LLVOSky *voskyp = gSky.mVOSkyp;
  148. stop_glerror();
  149. if (!gGLManager.mHasMultitexture)
  150. {
  151. // Ack!  No multitexture!  Bail!
  152. return;
  153. }
  154. LLFace* refl_face = voskyp->getReflFace();
  155. gPipeline.disableLights();
  156. LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
  157. LLGLDisable cullFace(GL_CULL_FACE);
  158. // Set up second pass first
  159. mWaterImagep->addTextureStats(1024.f*1024.f);
  160. gGL.getTexUnit(1)->activate();
  161. gGL.getTexUnit(1)->enable(LLTexUnit::TT_TEXTURE);
  162. gGL.getTexUnit(1)->bind(mWaterImagep) ;
  163. LLVector3 camera_up = LLViewerCamera::getInstance()->getUpAxis();
  164. F32 up_dot = camera_up * LLVector3::z_axis;
  165. LLColor4 water_color;
  166. if (LLViewerCamera::getInstance()->cameraUnderWater())
  167. {
  168. water_color.setVec(1.f, 1.f, 1.f, 0.4f);
  169. }
  170. else
  171. {
  172. water_color.setVec(1.f, 1.f, 1.f, 0.5f*(1.f + up_dot));
  173. }
  174. glColor4fv(water_color.mV);
  175. // Automatically generate texture coords for detail map
  176. glEnable(GL_TEXTURE_GEN_S); //texture unit 1
  177. glEnable(GL_TEXTURE_GEN_T); //texture unit 1
  178. glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  179. glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  180. // Slowly move over time.
  181. F32 offset = fmod(gFrameTimeSeconds*2.f, 100.f);
  182. F32 tp0[4] = {16.f/256.f, 0.0f, 0.0f, offset*0.01f};
  183. F32 tp1[4] = {0.0f, 16.f/256.f, 0.0f, offset*0.01f};
  184. glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0);
  185. glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1);
  186. gGL.getTexUnit(1)->setTextureColorBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_COLOR, LLTexUnit::TBS_PREV_COLOR);
  187. gGL.getTexUnit(1)->setTextureAlphaBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_ALPHA);
  188. gGL.getTexUnit(0)->activate();
  189. glClearStencil(1);
  190. glClear(GL_STENCIL_BUFFER_BIT);
  191. LLGLEnable gls_stencil(GL_STENCIL_TEST);
  192. glStencilOp(GL_KEEP, GL_REPLACE, GL_KEEP);
  193. glStencilFunc(GL_ALWAYS, 0, 0xFFFFFFFF);
  194. for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
  195.  iter != mDrawFace.end(); iter++)
  196. {
  197. LLFace *face = *iter;
  198. if (voskyp->isReflFace(face))
  199. {
  200. continue;
  201. }
  202. gGL.getTexUnit(0)->bind(face->getTexture());
  203. face->renderIndexed();
  204. }
  205. // Now, disable texture coord generation on texture state 1
  206. gGL.getTexUnit(1)->activate();
  207. gGL.getTexUnit(1)->unbind(LLTexUnit::TT_TEXTURE);
  208. gGL.getTexUnit(1)->disable();
  209. glDisable(GL_TEXTURE_GEN_S); //texture unit 1
  210. glDisable(GL_TEXTURE_GEN_T); //texture unit 1
  211. // Disable texture coordinate and color arrays
  212. gGL.getTexUnit(0)->activate();
  213. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  214. stop_glerror();
  215. if (gSky.mVOSkyp->getCubeMap())
  216. {
  217. gSky.mVOSkyp->getCubeMap()->enable(0);
  218. gSky.mVOSkyp->getCubeMap()->bind();
  219. glMatrixMode(GL_TEXTURE);
  220. glLoadIdentity();
  221. LLMatrix4 camera_mat = LLViewerCamera::getInstance()->getModelview();
  222. LLMatrix4 camera_rot(camera_mat.getMat3());
  223. camera_rot.invert();
  224. glLoadMatrixf((F32 *)camera_rot.mMatrix);
  225. glMatrixMode(GL_MODELVIEW);
  226. LLOverrideFaceColor overrid(this, 1.f, 1.f, 1.f,  0.5f*up_dot);
  227. gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
  228. for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
  229.  iter != mDrawFace.end(); iter++)
  230. {
  231. LLFace *face = *iter;
  232. if (voskyp->isReflFace(face))
  233. {
  234. //refl_face = face;
  235. continue;
  236. }
  237. if (face->getGeomCount() > 0)
  238. {
  239. face->renderIndexed();
  240. }
  241. }
  242. gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
  243. gSky.mVOSkyp->getCubeMap()->disable();
  244. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  245. gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
  246. glMatrixMode(GL_TEXTURE);
  247. glLoadIdentity();
  248. glMatrixMode(GL_MODELVIEW);
  249. }
  250. glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
  251.     if (refl_face)
  252. {
  253. glStencilFunc(GL_NOTEQUAL, 0, 0xFFFFFFFF);
  254. renderReflection(refl_face);
  255. }
  256. gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
  257. }
  258. void LLDrawPoolWater::renderReflection(LLFace* face)
  259. {
  260. LLVOSky *voskyp = gSky.mVOSkyp;
  261. if (!voskyp)
  262. {
  263. return;
  264. }
  265. if (!face->getGeomCount())
  266. {
  267. return;
  268. }
  269. S8 dr = voskyp->getDrawRefl();
  270. if (dr < 0)
  271. {
  272. return;
  273. }
  274. LLGLSNoFog noFog;
  275. gGL.getTexUnit(0)->bind(mHBTex[dr]);
  276. LLOverrideFaceColor override(this, face->getFaceColor().mV);
  277. face->renderIndexed();
  278. }
  279. void LLDrawPoolWater::shade()
  280. {
  281. if (!deferred_render)
  282. {
  283. gGL.setColorMask(true, true);
  284. }
  285. LLVOSky *voskyp = gSky.mVOSkyp;
  286. if(voskyp == NULL) 
  287. {
  288. return;
  289. }
  290. LLGLDisable blend(GL_BLEND);
  291. LLColor3 light_diffuse(0,0,0);
  292. F32 light_exp = 0.0f;
  293. LLVector3 light_dir;
  294. LLColor3 light_color;
  295. if (gSky.getSunDirection().mV[2] > LLSky::NIGHTTIME_ELEVATION_COS)   
  296.     {   
  297.         light_dir  = gSky.getSunDirection();   
  298.         light_dir.normVec(); 
  299. light_color = gSky.getSunDiffuseColor();
  300. if(gSky.mVOSkyp) {
  301.         light_diffuse = gSky.mVOSkyp->getSun().getColorCached();   
  302. light_diffuse.normVec();   
  303. }
  304.         light_exp = light_dir * LLVector3(light_dir.mV[0], light_dir.mV[1], 0);   
  305.         light_diffuse *= light_exp + 0.25f;   
  306.     }   
  307.     else    
  308.     {   
  309.         light_dir       = gSky.getMoonDirection();   
  310.         light_dir.normVec();   
  311. light_color = gSky.getMoonDiffuseColor();
  312.         light_diffuse   = gSky.mVOSkyp->getMoon().getColorCached();   
  313.         light_diffuse.normVec();   
  314.         light_diffuse *= 0.5f;   
  315.         light_exp = light_dir * LLVector3(light_dir.mV[0], light_dir.mV[1], 0);   
  316.     }
  317. light_exp *= light_exp;
  318. light_exp *= light_exp;
  319. light_exp *= light_exp;
  320. light_exp *= light_exp;
  321. light_exp *= 256.f;
  322. light_exp = light_exp > 32.f ? light_exp : 32.f;
  323. LLGLSLShader* shader;
  324. F32 eyedepth = LLViewerCamera::getInstance()->getOrigin().mV[2] - gAgent.getRegion()->getWaterHeight();
  325. if (deferred_render)
  326. {
  327. shader = &gDeferredWaterProgram;
  328. }
  329. else if (eyedepth < 0.f && LLPipeline::sWaterReflections)
  330. {
  331. shader = &gUnderWaterProgram;
  332. }
  333. else
  334. {
  335. shader = &gWaterProgram;
  336. }
  337. if (deferred_render)
  338. {
  339. gPipeline.bindDeferredShader(*shader);
  340. }
  341. else
  342. {
  343. shader->bind();
  344. }
  345. sTime = (F32)LLFrameTimer::getElapsedSeconds()*0.5f;
  346. S32 reftex = shader->enableTexture(LLViewerShaderMgr::WATER_REFTEX);
  347. if (reftex > -1)
  348. {
  349. gGL.getTexUnit(reftex)->activate();
  350. gGL.getTexUnit(reftex)->bind(&gPipeline.mWaterRef);
  351. gGL.getTexUnit(0)->activate();
  352. }
  353. //bind normal map
  354. S32 bumpTex = shader->enableTexture(LLViewerShaderMgr::BUMP_MAP);
  355. LLWaterParamManager * param_mgr = LLWaterParamManager::instance();
  356. // change mWaterNormp if needed
  357. if (mWaterNormp->getID() != param_mgr->getNormalMapID())
  358. {
  359. mWaterNormp = LLViewerTextureManager::getFetchedTexture(param_mgr->getNormalMapID());
  360. }
  361. mWaterNormp->addTextureStats(1024.f*1024.f);
  362. gGL.getTexUnit(bumpTex)->bind(mWaterNormp) ;
  363. if (gSavedSettings.getBOOL("RenderWaterMipNormal"))
  364. {
  365. mWaterNormp->setFilteringOption(LLTexUnit::TFO_ANISOTROPIC);
  366. }
  367. else 
  368. {
  369. mWaterNormp->setFilteringOption(LLTexUnit::TFO_POINT);
  370. }
  371. S32 screentex = shader->enableTexture(LLViewerShaderMgr::WATER_SCREENTEX);
  372. if (screentex > -1)
  373. {
  374. shader->uniform4fv(LLViewerShaderMgr::WATER_FOGCOLOR, 1, sWaterFogColor.mV);
  375. shader->uniform1f(LLViewerShaderMgr::WATER_FOGDENSITY, 
  376. param_mgr->getFogDensity());
  377. gPipeline.mWaterDis.bindTexture(0, screentex);
  378. }
  379. stop_glerror();
  380. gGL.getTexUnit(screentex)->bind(&gPipeline.mWaterDis);
  381. if (mVertexShaderLevel == 1)
  382. {
  383. sWaterFogColor.mV[3] = param_mgr->mDensitySliderValue;
  384. shader->uniform4fv(LLViewerShaderMgr::WATER_FOGCOLOR, 1, sWaterFogColor.mV);
  385. }
  386. F32 screenRes[] = 
  387. {
  388. 1.f/gGLViewport[2],
  389. 1.f/gGLViewport[3]
  390. };
  391. shader->uniform2fv("screenRes", 1, screenRes);
  392. stop_glerror();
  393. S32 diffTex = shader->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  394. stop_glerror();
  395. light_dir.normVec();
  396. sLightDir = light_dir;
  397. light_diffuse *= 6.f;
  398. //shader->uniformMatrix4fv("inverse_ref", 1, GL_FALSE, (GLfloat*) gGLObliqueProjectionInverse.mMatrix);
  399. shader->uniform1f(LLViewerShaderMgr::WATER_WATERHEIGHT, eyedepth);
  400. shader->uniform1f(LLViewerShaderMgr::WATER_TIME, sTime);
  401. shader->uniform3fv(LLViewerShaderMgr::WATER_EYEVEC, 1, LLViewerCamera::getInstance()->getOrigin().mV);
  402. shader->uniform3fv(LLViewerShaderMgr::WATER_SPECULAR, 1, light_diffuse.mV);
  403. shader->uniform1f(LLViewerShaderMgr::WATER_SPECULAR_EXP, light_exp);
  404. shader->uniform2fv(LLViewerShaderMgr::WATER_WAVE_DIR1, 1, param_mgr->getWave1Dir().mV);
  405. shader->uniform2fv(LLViewerShaderMgr::WATER_WAVE_DIR2, 1, param_mgr->getWave2Dir().mV);
  406. shader->uniform3fv(LLViewerShaderMgr::WATER_LIGHT_DIR, 1, light_dir.mV);
  407. shader->uniform3fv("normScale", 1, param_mgr->getNormalScale().mV);
  408. shader->uniform1f("fresnelScale", param_mgr->getFresnelScale());
  409. shader->uniform1f("fresnelOffset", param_mgr->getFresnelOffset());
  410. shader->uniform1f("blurMultiplier", param_mgr->getBlurMultiplier());
  411. F32 sunAngle = llmax(0.f, light_dir.mV[2]);
  412. F32 scaledAngle = 1.f - sunAngle;
  413. shader->uniform1f("sunAngle", sunAngle);
  414. shader->uniform1f("scaledAngle", scaledAngle);
  415. shader->uniform1f("sunAngle2", 0.1f + 0.2f*sunAngle);
  416. LLColor4 water_color;
  417. LLVector3 camera_up = LLViewerCamera::getInstance()->getUpAxis();
  418. F32 up_dot = camera_up * LLVector3::z_axis;
  419. if (LLViewerCamera::getInstance()->cameraUnderWater())
  420. {
  421. water_color.setVec(1.f, 1.f, 1.f, 0.4f);
  422. shader->uniform1f(LLViewerShaderMgr::WATER_REFSCALE, param_mgr->getScaleBelow());
  423. }
  424. else
  425. {
  426. water_color.setVec(1.f, 1.f, 1.f, 0.5f*(1.f + up_dot));
  427. shader->uniform1f(LLViewerShaderMgr::WATER_REFSCALE, param_mgr->getScaleAbove());
  428. }
  429. if (water_color.mV[3] > 0.9f)
  430. {
  431. water_color.mV[3] = 0.9f;
  432. }
  433. glColor4fv(water_color.mV);
  434. {
  435. LLGLDisable cullface(GL_CULL_FACE);
  436. for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
  437. iter != mDrawFace.end(); iter++)
  438. {
  439. LLFace *face = *iter;
  440. if (voskyp->isReflFace(face))
  441. {
  442. continue;
  443. }
  444. LLVOWater* water = (LLVOWater*) face->getViewerObject();
  445. gGL.getTexUnit(diffTex)->bind(face->getTexture());
  446. sNeedsReflectionUpdate = TRUE;
  447. if (water->getUseTexture())
  448. {
  449. sNeedsDistortionUpdate = TRUE;
  450. face->renderIndexed();
  451. }
  452. else
  453. { //smash background faces to far clip plane
  454. if (water->getIsEdgePatch())
  455. {
  456. if (deferred_render)
  457. {
  458. face->renderIndexed();
  459. }
  460. else
  461. {
  462. LLGLClampToFarClip far_clip(glh_get_current_projection());
  463. face->renderIndexed();
  464. }
  465. }
  466. else
  467. {
  468. sNeedsDistortionUpdate = TRUE;
  469. face->renderIndexed();
  470. }
  471. }
  472. }
  473. }
  474. shader->disableTexture(LLViewerShaderMgr::ENVIRONMENT_MAP, LLTexUnit::TT_CUBE_MAP);
  475. shader->disableTexture(LLViewerShaderMgr::WATER_SCREENTEX);
  476. shader->disableTexture(LLViewerShaderMgr::BUMP_MAP);
  477. shader->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  478. shader->disableTexture(LLViewerShaderMgr::WATER_REFTEX);
  479. shader->disableTexture(LLViewerShaderMgr::WATER_SCREENDEPTH);
  480. if (deferred_render)
  481. {
  482. gPipeline.unbindDeferredShader(*shader);
  483. }
  484. else
  485. {
  486. shader->unbind();
  487. }
  488. gGL.getTexUnit(0)->activate();
  489. gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
  490. if (!deferred_render)
  491. {
  492. gGL.setColorMask(true, false);
  493. }
  494. }
  495. void LLDrawPoolWater::renderForSelect()
  496. {
  497. // Can't select water!
  498. return;
  499. }
  500. LLViewerTexture *LLDrawPoolWater::getDebugTexture()
  501. {
  502. return LLViewerFetchedTexture::sSmokeImagep;
  503. }
  504. LLColor3 LLDrawPoolWater::getDebugColor() const
  505. {
  506. return LLColor3(0.f, 1.f, 1.f);
  507. }