00001
00032 #include "llviewerprecompiledheaders.h"
00033 #include "llfeaturemanager.h"
00034 #include "lldrawpoolwater.h"
00035
00036 #include "llviewercontrol.h"
00037 #include "lldir.h"
00038 #include "llerror.h"
00039 #include "m3math.h"
00040
00041 #include "llagent.h"
00042 #include "llcubemap.h"
00043 #include "lldrawable.h"
00044 #include "llface.h"
00045 #include "llsky.h"
00046 #include "llviewercamera.h"
00047 #include "llviewerimagelist.h"
00048 #include "llviewerregion.h"
00049 #include "llvosky.h"
00050 #include "llvowater.h"
00051 #include "llworld.h"
00052 #include "pipeline.h"
00053 #include "viewer.h"
00054 #include "llglslshader.h"
00055
00056 const LLUUID WATER_TEST("2bfd3884-7e27-69b9-ba3a-3e673f680004");
00057
00058 static float sTime;
00059
00060 BOOL LLDrawPoolWater::sSkipScreenCopy = FALSE;
00061
00062 LLDrawPoolWater::LLDrawPoolWater() :
00063 LLFacePool(POOL_WATER)
00064 {
00065 mHBTex[0] = gImageList.getImage(gSunTextureID, TRUE, TRUE);
00066 mHBTex[0]->bind();
00067 mHBTex[0]->setClamp(TRUE, TRUE);
00068
00069 mHBTex[1] = gImageList.getImage(gMoonTextureID, TRUE, TRUE);
00070 mHBTex[1]->bind();
00071 mHBTex[1]->setClamp(TRUE, TRUE);
00072
00073 mWaterImagep = gImageList.getImage(WATER_TEST);
00074 mWaterNormp = gImageList.getImage(LLUUID(gViewerArt.getString("water_normal.tga")));
00075
00076 restoreGL();
00077 }
00078
00079 LLDrawPoolWater::~LLDrawPoolWater()
00080 {
00081 }
00082
00083
00084 void LLDrawPoolWater::restoreGL()
00085 {
00086
00087 }
00088
00089 LLDrawPool *LLDrawPoolWater::instancePool()
00090 {
00091 llerrs << "Should never be calling instancePool on a water pool!" << llendl;
00092 return NULL;
00093 }
00094
00095
00096 void LLDrawPoolWater::prerender()
00097 {
00098 mVertexShaderLevel = (gSavedSettings.getBOOL("RenderRippleWater") && gGLManager.mHasCubeMap && gFeatureManagerp->isFeatureAvailable("RenderCubeMap")) ?
00099 LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_ENVIRONMENT) : 0;
00100
00101 }
00102
00103 extern LLColor4U MAX_WATER_COLOR;
00104
00105 void LLDrawPoolWater::render(S32 pass)
00106 {
00107 LLFastTimer ftm(LLFastTimer::FTM_RENDER_WATER);
00108 if (mDrawFace.empty() || LLDrawable::getCurrentFrame() <= 1)
00109 {
00110 return;
00111 }
00112
00113
00114 for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
00115 iter != mDrawFace.end(); iter++)
00116 {
00117 LLFace* facep = *iter;
00118 facep->mDistance = -facep->mCenterLocal.mV[2];
00119 }
00120
00121 std::sort(mDrawFace.begin(), mDrawFace.end(), LLFace::CompareDistanceGreater());
00122
00123 LLGLEnable blend(GL_BLEND);
00124
00125 if ((mVertexShaderLevel >= SHADER_LEVEL_RIPPLE))
00126 {
00127 shade();
00128 return;
00129 }
00130
00131 if ((mVertexShaderLevel > 0))
00132 {
00133 renderShaderSimple();
00134 return;
00135 }
00136
00137 LLVOSky *voskyp = gSky.mVOSkyp;
00138
00139 stop_glerror();
00140
00141 if (!gGLManager.mHasMultitexture)
00142 {
00143
00144 return;
00145 }
00146
00147 LLFace* refl_face = voskyp->getReflFace();
00148
00149 gPipeline.disableLights();
00150
00151 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
00152
00153 LLGLDisable cullFace(GL_CULL_FACE);
00154
00155 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00156 glEnableClientState(GL_VERTEX_ARRAY);
00157 glEnableClientState(GL_NORMAL_ARRAY);
00158
00159
00160 glActiveTextureARB(GL_TEXTURE1_ARB);
00161 mWaterImagep->addTextureStats(1024.f*1024.f);
00162 mWaterImagep->bind(1);
00163
00164 glClientActiveTextureARB(GL_TEXTURE1_ARB);
00165 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00166 glEnable(GL_TEXTURE_2D);
00167
00168 LLVector3 camera_up = gCamera->getUpAxis();
00169 F32 up_dot = camera_up * LLVector3::z_axis;
00170
00171 LLColor4 water_color;
00172 if (gCamera->cameraUnderWater())
00173 {
00174 water_color.setVec(1.f, 1.f, 1.f, 0.4f);
00175 }
00176 else
00177 {
00178 water_color.setVec(1.f, 1.f, 1.f, 0.5f*(1.f + up_dot));
00179 }
00180
00181 glColor4fv(water_color.mV);
00182
00183
00184 glEnable(GL_TEXTURE_GEN_S);
00185 glEnable(GL_TEXTURE_GEN_T);
00186 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00187 glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00188
00189
00190 F32 offset = fmod(gFrameTimeSeconds*2.f, 100.f);
00191 F32 tp0[4] = {16.f/256.f, 0.0f, 0.0f, offset*0.01f};
00192 F32 tp1[4] = {0.0f, 16.f/256.f, 0.0f, offset*0.01f};
00193 glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0);
00194 glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1);
00195
00196 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
00197 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE);
00198 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE);
00199
00200 glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB);
00201 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
00202 glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE);
00203 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
00204 glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS_ARB);
00205 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA);
00206
00207 glClientActiveTextureARB(GL_TEXTURE0_ARB);
00208 glActiveTextureARB(GL_TEXTURE0_ARB);
00209
00210 glClearStencil(1);
00211 glClear(GL_STENCIL_BUFFER_BIT);
00212 LLGLEnable gls_stencil(GL_STENCIL_TEST);
00213 glStencilOp(GL_KEEP, GL_REPLACE, GL_KEEP);
00214 glStencilFunc(GL_ALWAYS, 0, 0xFFFFFFFF);
00215
00216 for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
00217 iter != mDrawFace.end(); iter++)
00218 {
00219 LLFace *face = *iter;
00220 if (voskyp->isReflFace(face))
00221 {
00222 continue;
00223 }
00224 face->bindTexture();
00225 face->renderIndexed();
00226 mIndicesDrawn += face->getIndicesCount();
00227 }
00228
00229
00230 glClientActiveTextureARB(GL_TEXTURE1_ARB);
00231 glActiveTextureARB(GL_TEXTURE1_ARB);
00232 glDisable(GL_TEXTURE_2D);
00233 LLImageGL::unbindTexture(1, GL_TEXTURE_2D);
00234 glDisable(GL_TEXTURE_GEN_S);
00235 glDisable(GL_TEXTURE_GEN_T);
00236
00237
00238 glClientActiveTextureARB(GL_TEXTURE0_ARB);
00239 glActiveTextureARB(GL_TEXTURE0_ARB);
00240 LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
00241
00242 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00243 stop_glerror();
00244
00245 if (gSky.mVOSkyp->getCubeMap())
00246 {
00247 gSky.mVOSkyp->getCubeMap()->enable(0);
00248 gSky.mVOSkyp->getCubeMap()->bind();
00249
00250 glMatrixMode(GL_TEXTURE);
00251 glLoadIdentity();
00252 LLMatrix4 camera_mat = gCamera->getModelview();
00253 LLMatrix4 camera_rot(camera_mat.getMat3());
00254 camera_rot.invert();
00255
00256 glLoadMatrixf((F32 *)camera_rot.mMatrix);
00257
00258 glMatrixMode(GL_MODELVIEW);
00259 LLOverrideFaceColor overrid(this, 1.f, 1.f, 1.f, 0.5f*up_dot);
00260
00261 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
00275 iter != mDrawFace.end(); iter++)
00276 {
00277 LLFace *face = *iter;
00278 if (voskyp->isReflFace(face))
00279 {
00280
00281 continue;
00282 }
00283
00284 if (face->getGeomCount() > 0)
00285 {
00286 face->renderIndexed();
00287 mIndicesDrawn += face->getIndicesCount();
00288 }
00289 }
00290
00291 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
00292
00293 if (gSky.mVOSkyp->getCubeMap())
00294 {
00295 gSky.mVOSkyp->getCubeMap()->disable();
00296 }
00297 LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
00298 glEnable(GL_TEXTURE_2D);
00299 glMatrixMode(GL_TEXTURE);
00300 glLoadIdentity();
00301 glMatrixMode(GL_MODELVIEW);
00302
00303 }
00304
00305 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
00306
00307 if (refl_face)
00308 {
00309 glStencilFunc(GL_NOTEQUAL, 0, 0xFFFFFFFF);
00310 renderReflection(refl_face);
00311 }
00312
00313 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00314 glDisableClientState(GL_NORMAL_ARRAY);
00315
00316 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
00317 }
00318
00319
00320 void LLDrawPoolWater::renderShaderSimple()
00321 {
00322 LLVOSky *voskyp = gSky.mVOSkyp;
00323
00324 stop_glerror();
00325
00326 if (!gGLManager.mHasMultitexture)
00327 {
00328
00329 return;
00330 }
00331
00332 LLFace* refl_face = voskyp->getReflFace();
00333
00334 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
00335
00336 LLGLDisable cullFace(GL_CULL_FACE);
00337
00338 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00339 glEnableClientState(GL_VERTEX_ARRAY);
00340 glEnableClientState(GL_NORMAL_ARRAY);
00341
00342
00343 S32 bumpTex = gWaterProgram.enableTexture(LLShaderMgr::BUMP_MAP);
00344 mWaterImagep->addTextureStats(1024.f*1024.f);
00345 mWaterImagep->bind(bumpTex);
00346
00347 glClientActiveTextureARB(GL_TEXTURE1_ARB);
00348 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00349
00350 LLVector3 camera_up = gCamera->getUpAxis();
00351 F32 up_dot = camera_up * LLVector3::z_axis;
00352
00353 LLColor4 water_color;
00354 if (gCamera->cameraUnderWater())
00355 {
00356 water_color.setVec(1.f, 1.f, 1.f, 0.4f);
00357 }
00358 else
00359 {
00360 water_color.setVec(1.f, 1.f, 1.f, 0.5f*(1.f + up_dot));
00361 }
00362
00363 glColor4fv(water_color.mV);
00364
00365
00366 glActiveTextureARB(GL_TEXTURE1_ARB);
00367 glEnable(GL_TEXTURE_GEN_S);
00368 glEnable(GL_TEXTURE_GEN_T);
00369 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00370 glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00371
00372
00373 F32 offset = fmod(gFrameTimeSeconds*2.f, 100.f);
00374 F32 tp0[4] = {16.f/256.f, 0.0f, 0.0f, offset*0.01f};
00375 F32 tp1[4] = {0.0f, 16.f/256.f, 0.0f, offset*0.01f};
00376 glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0);
00377 glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1);
00378
00379 glClientActiveTextureARB(GL_TEXTURE0_ARB);
00380 glActiveTextureARB(GL_TEXTURE0_ARB);
00381
00382 glClearStencil(1);
00383 glClear(GL_STENCIL_BUFFER_BIT);
00384 LLGLEnable gls_stencil(GL_STENCIL_TEST);
00385 glStencilOp(GL_KEEP, GL_REPLACE, GL_KEEP);
00386 glStencilFunc(GL_ALWAYS, 0, 0xFFFFFFFF);
00387
00388 S32 envTex = -1;
00389
00390 if (gSky.mVOSkyp->getCubeMap())
00391 {
00392 envTex = gWaterProgram.enableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
00393 gSky.mVOSkyp->getCubeMap()->bind();
00394
00395 glMatrixMode(GL_TEXTURE);
00396 glLoadIdentity();
00397 LLMatrix4 camera_mat = gCamera->getModelview();
00398 LLMatrix4 camera_rot(camera_mat.getMat3());
00399 camera_rot.invert();
00400
00401 glLoadMatrixf((F32 *)camera_rot.mMatrix);
00402
00403 glMatrixMode(GL_MODELVIEW);
00404 }
00405
00406 S32 diffTex = gWaterProgram.enableTexture(LLShaderMgr::DIFFUSE_MAP);
00407
00408 gWaterProgram.bind();
00409
00410 for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
00411 iter != mDrawFace.end(); iter++)
00412 {
00413 LLFace *face = *iter;
00414 if (voskyp->isReflFace(face))
00415 {
00416 continue;
00417 }
00418 face->bindTexture(diffTex);
00419 face->renderIndexed();
00420 mIndicesDrawn += face->getIndicesCount();
00421 }
00422
00423 if (gSky.mVOSkyp->getCubeMap())
00424 {
00425 gWaterProgram.disableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
00426 glMatrixMode(GL_TEXTURE);
00427 glLoadIdentity();
00428 glMatrixMode(GL_MODELVIEW);
00429 }
00430
00431
00432 gWaterProgram.disableTexture(LLShaderMgr::BUMP_MAP);
00433 LLImageGL::unbindTexture(bumpTex, GL_TEXTURE_2D);
00434
00435 glActiveTextureARB(GL_TEXTURE1_ARB);
00436 glDisable(GL_TEXTURE_GEN_S);
00437 glDisable(GL_TEXTURE_GEN_T);
00438
00439 gWaterProgram.disableTexture(LLShaderMgr::DIFFUSE_MAP);
00440
00441
00442 LLImageGL::unbindTexture(diffTex, GL_TEXTURE_2D);
00443
00444 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00445 stop_glerror();
00446
00447 glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
00448
00449 glUseProgramObjectARB(0);
00450 gPipeline.disableLights();
00451
00452 glActiveTextureARB(GL_TEXTURE0_ARB);
00453 glClientActiveTextureARB(GL_TEXTURE0_ARB);
00454 glEnable(GL_TEXTURE_2D);
00455
00456 if (refl_face)
00457 {
00458 glStencilFunc(GL_NOTEQUAL, 0, 0xFFFFFFFF);
00459 renderReflection(refl_face);
00460 }
00461
00462 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00463 glDisableClientState(GL_NORMAL_ARRAY);
00464 }
00465
00466 void LLDrawPoolWater::renderReflection(LLFace* face)
00467 {
00468 LLVOSky *voskyp = gSky.mVOSkyp;
00469
00470 if (!voskyp)
00471 {
00472 return;
00473 }
00474
00475 if (!face->getGeomCount())
00476 {
00477 return;
00478 }
00479
00480 S8 dr = voskyp->getDrawRefl();
00481 if (dr < 0)
00482 {
00483 return;
00484 }
00485
00486 LLGLSNoFog noFog;
00487
00488 glEnableClientState(GL_VERTEX_ARRAY);
00489 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00490
00491 LLViewerImage::bindTexture(mHBTex[dr]);
00492
00493 LLOverrideFaceColor override(this, face->getFaceColor().mV);
00494 face->renderIndexed();
00495 mIndicesDrawn += face->getIndicesCount();
00496
00497 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00498 }
00499
00500 void LLDrawPoolWater::shade()
00501 {
00502
00503
00504 GLboolean mask[4];
00505 glGetBooleanv(GL_COLOR_WRITEMASK,mask);
00506 glColorMask(mask[0], mask[1], mask[2], GL_FALSE);
00507
00508
00509 static LLVector2 d1( 0.5f, -0.17f );
00510 static LLVector2 d2( 0.58f, -0.67f );
00511 static LLVector2 d3( 0.5f, 0.25f );
00512
00513 static LLVector3 wave1(1,0.42f,1);
00514 static LLVector3 wave2(0.58f,0.42f,0.17f);
00515 static LLVector3 wave3(0.42f,0.67f,0.33f);
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533 LLVOSky *voskyp = gSky.mVOSkyp;
00534
00535 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00536 glEnableClientState(GL_VERTEX_ARRAY);
00537 glEnableClientState(GL_NORMAL_ARRAY);
00538 LLGLDisable blend(GL_BLEND);
00539
00540 LLColor3 light_diffuse(0,0,0);
00541 F32 light_exp = 0.0f;
00542 LLVector3 light_dir;
00543
00544 if (gSky.getSunDirection().mV[2] > NIGHTTIME_ELEVATION_COS)
00545 {
00546 light_dir = gSky.getSunDirection();
00547 light_dir.normVec();
00548 light_diffuse = gSky.mVOSkyp->getSun().getColorCached();
00549 light_diffuse.normVec();
00550 light_exp = light_dir * LLVector3(light_dir.mV[0], light_dir.mV[1], 0);
00551 light_diffuse *= light_exp + 0.25f;
00552 }
00553 else
00554 {
00555 light_dir = gSky.getMoonDirection();
00556 light_dir.normVec();
00557 light_diffuse = gSky.mVOSkyp->getMoon().getColorCached();
00558 light_diffuse.normVec();
00559 light_diffuse *= 0.5f;
00560 light_exp = light_dir * LLVector3(light_dir.mV[0], light_dir.mV[1], 0);
00561 }
00562
00563 light_exp *= light_exp;
00564 light_exp *= light_exp;
00565 light_exp *= light_exp;
00566 light_exp *= light_exp;
00567 light_exp *= light_exp;
00568 light_exp *= 512.f;
00569 light_exp = light_exp > 32.f ? light_exp : 32.f;
00570
00571 sTime = (F32)LLFrameTimer::getElapsedSeconds()*0.5f;
00572
00573 LLCubeMap* skyMap = gSky.mVOSkyp->getCubeMap();
00574
00575 gWaterProgram.enableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
00576 skyMap->bind();
00577
00578
00579 S32 bumpTex = gWaterProgram.enableTexture(LLShaderMgr::BUMP_MAP);
00580 mWaterNormp->addTextureStats(1024.f*1024.f);
00581 mWaterNormp->bind(bumpTex);
00582
00583 gWaterProgram.enableTexture(LLShaderMgr::WATER_SCREENTEX);
00584
00585 gWaterProgram.bind();
00586
00587 if (!sSkipScreenCopy)
00588 {
00589 gPipeline.bindScreenToTexture();
00590 }
00591 else
00592 {
00593 glBindTexture(GL_TEXTURE_2D, 0);
00594 }
00595
00596 glUniform2fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_FBSCALE], 1,
00597 gPipeline.mScreenScale.mV);
00598
00599 S32 diffTex = gWaterProgram.enableTexture(LLShaderMgr::DIFFUSE_MAP);
00600
00601 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
00602
00603 glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_TIME], sTime);
00604 glUniform3fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_SPECULAR], 1, light_diffuse.mV);
00605 glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_SPECULAR_EXP], light_exp);
00606 glUniform3fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_EYEVEC], 1, (GLfloat *)(gCamera->getOrigin().mV));
00607 glUniform2fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_WAVE_DIR1], 1, d1.mV);
00608 glUniform2fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_WAVE_DIR2], 1, d2.mV);
00609 glUniform3fvARB(gWaterProgram.mUniform[LLShaderMgr::WATER_LIGHT_DIR], 1, light_dir.mV);
00610
00611 LLColor4 water_color;
00612 LLVector3 camera_up = gCamera->getUpAxis();
00613 F32 up_dot = camera_up * LLVector3::z_axis;
00614 if (gCamera->cameraUnderWater())
00615 {
00616 water_color.setVec(1.f, 1.f, 1.f, 0.4f);
00617 glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_REFSCALE], 0.25f);
00618 }
00619 else
00620 {
00621 water_color.setVec(1.f, 1.f, 1.f, 0.5f*(1.f + up_dot));
00622 glUniform1fARB(gWaterProgram.mUniform[LLShaderMgr::WATER_REFSCALE], 0.01f);
00623 }
00624 if (water_color.mV[3] > 0.9f)
00625 {
00626 water_color.mV[3] = 0.9f;
00627 }
00628
00629 glColor4fv(water_color.mV);
00630
00631 {
00632 LLGLDisable cullface(GL_CULL_FACE);
00633 for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
00634 iter != mDrawFace.end(); iter++)
00635 {
00636 LLFace *face = *iter;
00637
00638 if (voskyp->isReflFace(face))
00639 {
00640 continue;
00641 }
00642
00643 face->bindTexture(diffTex);
00644 face->renderIndexed();
00645 mIndicesDrawn += face->getIndicesCount();
00646 }
00647 }
00648
00649 gWaterProgram.disableTexture(LLShaderMgr::ENVIRONMENT_MAP, GL_TEXTURE_CUBE_MAP_ARB);
00650 gWaterProgram.disableTexture(LLShaderMgr::WATER_SCREENTEX);
00651 gWaterProgram.disableTexture(LLShaderMgr::BUMP_MAP);
00652 gWaterProgram.disableTexture(LLShaderMgr::DIFFUSE_MAP);
00653
00654 glActiveTextureARB(GL_TEXTURE0_ARB);
00655 glEnable(GL_TEXTURE_2D);
00656 glUseProgramObjectARB(0);
00657
00658 glClientActiveTextureARB(GL_TEXTURE0_ARB);
00659 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00660
00661
00662 glGetBooleanv(GL_COLOR_WRITEMASK,mask);
00663 glColorMask(mask[0], mask[1], mask[2], GL_FALSE);
00664
00665 }
00666
00667 void LLDrawPoolWater::renderForSelect()
00668 {
00669
00670 return;
00671 }
00672
00673
00674 void LLDrawPoolWater::renderFaceSelected(LLFace *facep,
00675 LLImageGL *image,
00676 const LLColor4 &color,
00677 const S32 index_offset, const S32 index_count)
00678 {
00679
00680 return;
00681 }
00682
00683
00684 LLViewerImage *LLDrawPoolWater::getDebugTexture()
00685 {
00686 return LLViewerImage::sSmokeImagep;
00687 }
00688
00689 LLColor3 LLDrawPoolWater::getDebugColor() const
00690 {
00691 return LLColor3(0.f, 1.f, 1.f);
00692 }