lldrawpoolwater.cpp

Go to the documentation of this file.
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"            // for gAgent for getRegion for getWaterHeight
00042 #include "llcubemap.h"
00043 #include "lldrawable.h"
00044 #include "llface.h"
00045 #include "llsky.h"
00046 #include "llviewercamera.h" // to get OGL_TO_CFR_ROTATION
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"                     // gSunTextureID, gMoonTextureID
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 //static
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         //do a quick 'n dirty depth sort
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                 // Ack!  No multitexture!  Bail!
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         // Set up second pass first
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); // Texture unit 1
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         // Automatically generate texture coords for detail map
00184         glEnable(GL_TEXTURE_GEN_S); //texture unit 1
00185         glEnable(GL_TEXTURE_GEN_T); //texture unit 1
00186         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00187         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00188 
00189         // Slowly move over time.
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         // Now, disable texture coord generation on texture state 1
00230         glClientActiveTextureARB(GL_TEXTURE1_ARB);
00231         glActiveTextureARB(GL_TEXTURE1_ARB);
00232         glDisable(GL_TEXTURE_2D); // Texture unit 1
00233         LLImageGL::unbindTexture(1, GL_TEXTURE_2D);
00234         glDisable(GL_TEXTURE_GEN_S); //texture unit 1
00235         glDisable(GL_TEXTURE_GEN_T); //texture unit 1
00236 
00237         // Disable texture coordinate and color arrays
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                 /*glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,                GL_COMBINE_ARB);
00264                 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_ADD);
00265                 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,         GL_REPLACE);
00266 
00267                 glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_PREVIOUS_ARB);
00268                 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00269                 glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,           GL_TEXTURE);
00270                 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,          GL_SRC_COLOR);
00271                 glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,         GL_PREVIOUS_ARB);
00272                 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,        GL_SRC_ALPHA);*/
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                                 //refl_face = face;
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                 // Ack!  No multitexture!  Bail!
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         // Set up second pass first
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         // Automatically generate texture coords for detail map
00366         glActiveTextureARB(GL_TEXTURE1_ARB);
00367         glEnable(GL_TEXTURE_GEN_S); //texture unit 1
00368         glEnable(GL_TEXTURE_GEN_T); //texture unit 1
00369         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00370         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00371 
00372         // Slowly move over time.
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         // Now, disable texture coord generation on texture state 1
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); //texture unit 1
00437         glDisable(GL_TEXTURE_GEN_T); //texture unit 1
00438 
00439         gWaterProgram.disableTexture(LLShaderMgr::DIFFUSE_MAP);
00440         
00441         // Disable texture coordinate and color arrays
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                 //********UMICH 3D LAB********
00503                 // protect the color mask change for correct anaglyph render
00504                 GLboolean mask[4];
00505                 glGetBooleanv(GL_COLOR_WRITEMASK,mask);
00506                 glColorMask(mask[0], mask[1], mask[2], GL_FALSE);
00507                 //********UMICH 3D LAB********
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         /*static LLVector2 d1( 0.83f, -1 );
00518         static LLVector2 d2( 0.58f, 1 );
00519         static LLVector2 d3( 1, -0.88f );
00520 
00521         static LLVector4 wave1(0.75f,0.08f,0.5f,0.67f);
00522         static LLVector4 wave2(0.17f,0.33f,0.53f,0.62f);
00523         static LLVector4 wave3(0.17f,0.6f,0.67f,1);*/
00524 
00525         /*LLDebugVarMessageBox::show("Wave Direction 1", &d1, LLVector2(1,1), LLVector2(0.01f, 0.01f));
00526         LLDebugVarMessageBox::show("Wave Direction 2", &d2, LLVector2(1,1), LLVector2(0.01f, 0.01f));
00527         LLDebugVarMessageBox::show("Wave Direction 3", &d3, LLVector2(1,1), LLVector2(0.01f, 0.01f));
00528 
00529         LLDebugVarMessageBox::show("Wave 1", &wave1, LLVector3(2,1,4), LLVector3(0.01f, 0.01f, 0.01f));
00530         LLDebugVarMessageBox::show("Wave 2", &wave2, LLVector3(2,1,4), LLVector3(0.01f, 0.01f, 0.01f));
00531         LLDebugVarMessageBox::show("Wave 3", &wave3, LLVector3(2,1,4), LLVector3(0.01f, 0.01f, 0.01f));*/
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         //bind normal map
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         //********UMICH 3D LAB********
00661         // protect the color mask change for correct anaglyph render
00662         glGetBooleanv(GL_COLOR_WRITEMASK,mask);
00663         glColorMask(mask[0], mask[1], mask[2], GL_FALSE);
00664         //********UMICH 3D LAB********
00665 }
00666 
00667 void LLDrawPoolWater::renderForSelect()
00668 {
00669         // Can't select water!
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         // Can't select water
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 }

Generated on Thu Jul 1 06:08:27 2010 for Second Life Viewer by  doxygen 1.4.7