lldrawpoolterrain.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 #include "lldrawpoolterrain.h"
00035 
00036 #include "llfasttimer.h"
00037 
00038 #include "llagent.h"
00039 #include "llviewercontrol.h"
00040 #include "lldrawable.h"
00041 #include "llface.h"
00042 #include "llsky.h"
00043 #include "llsurface.h"
00044 #include "llsurfacepatch.h"
00045 #include "llviewerregion.h"
00046 #include "llvlcomposition.h"
00047 #include "llviewerparcelmgr.h"          // for gRenderParcelOwnership
00048 #include "llviewerparceloverlay.h"
00049 #include "llvosurfacepatch.h"
00050 #include "llviewercamera.h"
00051 #include "llviewerimagelist.h" // To get alpha gradients
00052 #include "llworld.h"
00053 #include "pipeline.h"
00054 #include "llglslshader.h"
00055 
00056 const F32 DETAIL_SCALE = 1.f/16.f;
00057 int DebugDetailMap = 0;
00058 
00059 S32 LLDrawPoolTerrain::sDetailMode = 1;
00060 F32 LLDrawPoolTerrain::sDetailScale = DETAIL_SCALE;
00061 
00062 LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerImage *texturep) :
00063         LLFacePool(POOL_TERRAIN),
00064         mTexturep(texturep)
00065 {
00066         // Hack!
00067         sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale");
00068         sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
00069         mAlphaRampImagep = gImageList.getImageFromUUID(LLUUID(gViewerArt.getString("alpha_gradient.tga")),
00070                                                                                                    TRUE, TRUE, GL_ALPHA8, GL_ALPHA);
00071         mAlphaRampImagep->bind(0);
00072         mAlphaRampImagep->setClamp(TRUE, TRUE);
00073 
00074         m2DAlphaRampImagep = gImageList.getImageFromUUID(LLUUID(gViewerArt.getString("alpha_gradient_2d.tga")),
00075                                                                                                          TRUE, TRUE, GL_ALPHA8, GL_ALPHA);
00076         m2DAlphaRampImagep->bind(0);
00077         m2DAlphaRampImagep->setClamp(TRUE, TRUE);
00078         
00079         mTexturep->setBoostLevel(LLViewerImage::BOOST_TERRAIN);
00080         
00081         LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
00082 }
00083 
00084 LLDrawPoolTerrain::~LLDrawPoolTerrain()
00085 {
00086         llassert( gPipeline.findPool( getType(), getTexture() ) == NULL );
00087 }
00088 
00089 
00090 LLDrawPool *LLDrawPoolTerrain::instancePool()
00091 {
00092         return new LLDrawPoolTerrain(mTexturep);
00093 }
00094 
00095 
00096 void LLDrawPoolTerrain::prerender()
00097 {
00098 #if 0 // 1.9.2
00099         mVertexShaderLevel = gPipeline.getVertexShaderLevel(LLPipeline::SHADER_ENVIRONMENT);
00100 #endif
00101         sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
00102 }
00103 
00104 //static
00105 S32 LLDrawPoolTerrain::getDetailMode()
00106 {
00107         return sDetailMode;
00108 }
00109 
00110 void LLDrawPoolTerrain::render(S32 pass)
00111 {
00112         LLFastTimer t(LLFastTimer::FTM_RENDER_TERRAIN);
00113         
00114         if (mDrawFace.empty())
00115         {
00116                 return;
00117         }
00118 
00119         // Hack! Get the region that this draw pool is rendering from!
00120         LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion();
00121         LLVLComposition *compp = regionp->getComposition();
00122         for (S32 i = 0; i < 4; i++)
00123         {
00124                 compp->mDetailTextures[i]->setBoostLevel(LLViewerImage::BOOST_TERRAIN);
00125                 compp->mDetailTextures[i]->addTextureStats(1024.f*1024.f); // assume large pixel area
00126         }
00127 
00128         if (!gGLManager.mHasMultitexture)
00129         {
00130                 // No mulititexture, render simple land.
00131                 renderSimple(); // Render without multitexture
00132                 return;
00133         }
00134         // Render simplified land if video card can't do sufficient multitexturing
00135         if (!gGLManager.mHasARBEnvCombine || (gGLManager.mNumTextureUnits < 2))
00136         {
00137                 renderSimple(); // Render without multitexture
00138                 return;
00139         }
00140 
00141         LLGLSPipeline gls;
00142         LLOverrideFaceColor override(this, 1.f, 1.f, 1.f, 1.f);
00143 
00144         if (mVertexShaderLevel > 0)
00145         {
00146                 gPipeline.enableLightsDynamic(1.f);
00147                 renderFull4TUShader();
00148         }
00149         else
00150         {
00151                 gPipeline.enableLightsStatic(1.f);
00152                 switch (sDetailMode)
00153                 {
00154                   case 0:
00155                         renderSimple();
00156                         break;
00157                   default:
00158                         if (gGLManager.mNumTextureUnits < 4)
00159                         {
00160                                 renderFull2TU();
00161                         }
00162                         else
00163                         {
00164                                 renderFull4TU();
00165                         }
00166                         break;
00167                 }
00168         }
00169 
00170         // Special-case for land ownership feedback
00171         if (gSavedSettings.getBOOL("ShowParcelOwners"))
00172         {
00173                 gPipeline.disableLights();
00174                 if ((mVertexShaderLevel > 0))
00175                 {
00176                         gHighlightProgram.bind();
00177                         gHighlightProgram.vertexAttrib4f(LLShaderMgr::MATERIAL_COLOR,1,1,1,1);
00178                         renderOwnership();
00179                         gTerrainProgram.bind();
00180                 }
00181                 else
00182                 {
00183                         renderOwnership();
00184                 }
00185         }
00186 }
00187 
00188 
00189 void LLDrawPoolTerrain::renderFull4TUShader()
00190 {
00191         glEnableClientState(GL_VERTEX_ARRAY);
00192         glEnableClientState(GL_NORMAL_ARRAY);
00193 
00194         if (gPipeline.getLightingDetail() >= 2)
00195         {
00196                 glEnableClientState(GL_COLOR_ARRAY);
00197         }
00198         
00199         glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
00200         
00201         // Hack! Get the region that this draw pool is rendering from!
00202         LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion();
00203         LLVLComposition *compp = regionp->getComposition();
00204         LLViewerImage *detail_texture0p = compp->mDetailTextures[0];
00205         LLViewerImage *detail_texture1p = compp->mDetailTextures[1];
00206         LLViewerImage *detail_texture2p = compp->mDetailTextures[2];
00207         LLViewerImage *detail_texture3p = compp->mDetailTextures[3];
00208 
00209         static F32 dp = 0.f;
00210         static LLFrameTimer timer;
00211         dp += timer.getElapsedTimeAndResetF32();
00212 
00213         LLVector3d region_origin_global = gAgent.getRegion()->getOriginGlobal();
00214 
00215         F32 offset_x = (F32)fmod(region_origin_global.mdV[VX], 1.0/(F64)sDetailScale)*sDetailScale;
00216         F32 offset_y = (F32)fmod(region_origin_global.mdV[VY], 1.0/(F64)sDetailScale)*sDetailScale;
00217 
00218         LLVector4 tp0, tp1;
00219         
00220         tp0.setVec(sDetailScale, 0.0f, 0.0f, offset_x);
00221         tp1.setVec(0.0f, sDetailScale, 0.0f, offset_y);
00222 
00223         //----------------------------------------------------------------------------
00224         // Pass 1/1
00225 
00226         //
00227         // Stage 0: detail texture 0
00228         //
00229         
00230         S32 detailTex0 = gTerrainProgram.enableTexture(LLShaderMgr::TERRAIN_DETAIL0);
00231         S32 detailTex1 = gTerrainProgram.enableTexture(LLShaderMgr::TERRAIN_DETAIL1);
00232         S32 rampTex = gTerrainProgram.enableTexture(LLShaderMgr::TERRAIN_ALPHARAMP);
00233         
00234         LLViewerImage::bindTexture(detail_texture0p,detailTex0);
00235 
00236         glClientActiveTextureARB(GL_TEXTURE0_ARB);
00237         glActiveTextureARB(GL_TEXTURE0_ARB);
00238         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00239         glEnable(GL_TEXTURE_GEN_S);
00240         glEnable(GL_TEXTURE_GEN_T);
00241         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00242         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00243 
00244         glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
00245         glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
00246 
00247         //
00248         // Stage 1: Generate alpha ramp for detail0/detail1 transition
00249         //
00250         LLViewerImage::bindTexture(m2DAlphaRampImagep,rampTex);
00251 
00252         glClientActiveTextureARB(GL_TEXTURE1_ARB);
00253         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00254 
00255         //
00256         // Stage 2: Interpolate detail1 with existing based on ramp
00257         //
00258         LLViewerImage::bindTexture(detail_texture1p,detailTex1);
00259         
00260         glClientActiveTextureARB(GL_TEXTURE2_ARB);
00261         glActiveTextureARB(GL_TEXTURE2_ARB);
00262         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00263         glEnable(GL_TEXTURE_GEN_S);
00264         glEnable(GL_TEXTURE_GEN_T);
00265         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00266         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00267         glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
00268         glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
00269 
00270         //
00271         // Stage 3: Modulate with primary color for lighting
00272         //
00273         //LLViewerImage::bindTexture(detail_texture1p,3); // bind any texture
00274         //glEnable(GL_TEXTURE_2D); // Texture unit 3
00275         glClientActiveTextureARB(GL_TEXTURE3_ARB);
00276         glActiveTextureARB(GL_TEXTURE3_ARB);
00277         // GL_BLEND disabled by default
00278         drawLoop();
00279 
00280         //----------------------------------------------------------------------------
00281         // Second pass
00282 
00283         //
00284         // Stage 0: Write detail3 into base
00285         //
00286         LLViewerImage::bindTexture(detail_texture2p,detailTex0);
00287         
00288         glClientActiveTextureARB(GL_TEXTURE0_ARB);
00289         glActiveTextureARB(GL_TEXTURE0_ARB);
00290         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00291         glEnable(GL_TEXTURE_GEN_S);
00292         glEnable(GL_TEXTURE_GEN_T);
00293         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00294         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00295         glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
00296         glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
00297 
00298         //
00299         // Stage 1: Generate alpha ramp for detail2/detail3 transition
00300         //
00301         LLViewerImage::bindTexture(m2DAlphaRampImagep,rampTex);
00302         
00303         glClientActiveTextureARB(GL_TEXTURE1_ARB);
00304         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00305         glActiveTextureARB(GL_TEXTURE1_ARB);
00306 
00307         // Set the texture matrix
00308         glMatrixMode(GL_TEXTURE);
00309         glLoadIdentity();
00310         glTranslatef(-2.f, 0.f, 0.f);
00311 
00312         //
00313         // Stage 2: Interpolate detail2 with existing based on ramp
00314         //
00315         LLViewerImage::bindTexture(detail_texture3p,detailTex1);
00316         
00317         glClientActiveTextureARB(GL_TEXTURE2_ARB);
00318         glActiveTextureARB(GL_TEXTURE2_ARB);
00319         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00320         glEnable(GL_TEXTURE_GEN_S);
00321         glEnable(GL_TEXTURE_GEN_T);
00322         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00323         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00324         glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
00325         glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
00326 
00327         //
00328         // Stage 3: Generate alpha ramp for detail1/detail2 transition
00329         //
00330         //LLViewerImage::bindTexture(m2DAlphaRampImagep,3);
00331         
00332         //glEnable(GL_TEXTURE_2D); // Texture unit 3
00333         
00334         glClientActiveTextureARB(GL_TEXTURE3_ARB);
00335         glActiveTextureARB(GL_TEXTURE3_ARB);
00336         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00337 
00338         // Set the texture matrix
00339         glMatrixMode(GL_TEXTURE);
00340         glLoadIdentity();
00341         glTranslatef(-1.f, 0.f, 0.f);
00342 
00343         {
00344                 LLGLEnable blend(GL_BLEND);
00345                 drawLoop();
00346         }
00347 
00348         // Disable multitexture
00349         gTerrainProgram.disableTexture(LLShaderMgr::TERRAIN_ALPHARAMP);
00350         gTerrainProgram.disableTexture(LLShaderMgr::TERRAIN_DETAIL0);
00351         gTerrainProgram.disableTexture(LLShaderMgr::TERRAIN_DETAIL1);
00352         
00353         glClientActiveTextureARB(GL_TEXTURE3_ARB);
00354         glActiveTextureARB(GL_TEXTURE3_ARB);
00355         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00356         glMatrixMode(GL_TEXTURE);
00357         glLoadIdentity();
00358         glMatrixMode(GL_MODELVIEW);
00359 
00360         glClientActiveTextureARB(GL_TEXTURE2_ARB);
00361         glActiveTextureARB(GL_TEXTURE2_ARB);
00362         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00363         glDisable(GL_TEXTURE_GEN_S);
00364         glDisable(GL_TEXTURE_GEN_T);
00365         glMatrixMode(GL_TEXTURE);
00366         glLoadIdentity();
00367         glMatrixMode(GL_MODELVIEW);
00368 
00369         glClientActiveTextureARB(GL_TEXTURE1_ARB);
00370         glActiveTextureARB(GL_TEXTURE1_ARB);
00371         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00372         glMatrixMode(GL_TEXTURE);
00373         glLoadIdentity();
00374         glMatrixMode(GL_MODELVIEW);
00375 
00376         // Restore blend state
00377         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00378         
00379         //----------------------------------------------------------------------------
00380         // Restore Texture Unit 0 defaults
00381         
00382         glClientActiveTextureARB(GL_TEXTURE0_ARB);
00383         glActiveTextureARB(GL_TEXTURE0_ARB);
00384         glDisable(GL_TEXTURE_GEN_S);
00385         glDisable(GL_TEXTURE_GEN_T);
00386         glEnable(GL_TEXTURE_2D);
00387         glMatrixMode(GL_TEXTURE);
00388         glLoadIdentity();
00389         glMatrixMode(GL_MODELVIEW);
00390 
00391         // Restore non Texture Unit specific defaults
00392         glDisableClientState(GL_NORMAL_ARRAY);
00393         glDisableClientState(GL_COLOR_ARRAY);
00394         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
00395 }
00396 
00397 void LLDrawPoolTerrain::renderFull4TU()
00398 {
00399         glEnableClientState(GL_VERTEX_ARRAY);
00400         glEnableClientState(GL_NORMAL_ARRAY);
00401 
00402         // Hack! Get the region that this draw pool is rendering from!
00403         LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion();
00404         LLVLComposition *compp = regionp->getComposition();
00405         LLViewerImage *detail_texture0p = compp->mDetailTextures[0];
00406         LLViewerImage *detail_texture1p = compp->mDetailTextures[1];
00407         LLViewerImage *detail_texture2p = compp->mDetailTextures[2];
00408         LLViewerImage *detail_texture3p = compp->mDetailTextures[3];
00409 
00410         LLVector3d region_origin_global = gAgent.getRegion()->getOriginGlobal();
00411         F32 offset_x = (F32)fmod(region_origin_global.mdV[VX], 1.0/(F64)sDetailScale)*sDetailScale;
00412         F32 offset_y = (F32)fmod(region_origin_global.mdV[VY], 1.0/(F64)sDetailScale)*sDetailScale;
00413 
00414         LLVector4 tp0, tp1;
00415         
00416         tp0.setVec(sDetailScale, 0.0f, 0.0f, offset_x);
00417         tp1.setVec(0.0f, sDetailScale, 0.0f, offset_y);
00418 
00419         glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
00420         
00421         //----------------------------------------------------------------------------
00422         // Pass 1/1
00423 
00424         //
00425         // Stage 0: detail texture 0
00426         //
00427         glActiveTextureARB(GL_TEXTURE0_ARB);
00428         LLViewerImage::bindTexture(detail_texture0p,0);
00429         glClientActiveTextureARB(GL_TEXTURE0_ARB);
00430 
00431         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00432         glEnable(GL_TEXTURE_GEN_S);
00433         glEnable(GL_TEXTURE_GEN_T);
00434         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00435         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00436 
00437         glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
00438         glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
00439 
00440         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00441         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_REPLACE);
00442 
00443         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_TEXTURE);
00444         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00445 
00446         //
00447         // Stage 1: Generate alpha ramp for detail0/detail1 transition
00448         //
00449         glActiveTextureARB(GL_TEXTURE1_ARB);
00450         LLViewerImage::bindTexture(m2DAlphaRampImagep,1);
00451 
00452         glEnable(GL_TEXTURE_2D); // Texture unit 1
00453         glClientActiveTextureARB(GL_TEXTURE1_ARB);
00454         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00455 
00456         // Care about alpha only
00457         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00458         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_REPLACE);
00459         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,         GL_REPLACE);
00460 
00461         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_PREVIOUS);
00462         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00463         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,         GL_TEXTURE);
00464         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,        GL_SRC_ALPHA);
00465 
00466         //
00467         // Stage 2: Interpolate detail1 with existing based on ramp
00468         //
00469         glActiveTextureARB(GL_TEXTURE2_ARB);
00470         LLViewerImage::bindTexture(detail_texture1p,2);
00471         glEnable(GL_TEXTURE_2D); // Texture unit 2
00472         glClientActiveTextureARB(GL_TEXTURE2_ARB);
00473 
00474         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00475         glEnable(GL_TEXTURE_GEN_S);
00476         glEnable(GL_TEXTURE_GEN_T);
00477         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00478         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00479         glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
00480         glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
00481 
00482         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00483         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_INTERPOLATE);
00484 
00485         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_PREVIOUS_ARB);
00486         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00487         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,           GL_TEXTURE);
00488         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,          GL_SRC_COLOR);
00489         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB,           GL_PREVIOUS_ARB);
00490         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB,          GL_SRC_ALPHA);
00491 
00492         //
00493         // Stage 3: Modulate with primary (vertex) color for lighting
00494         //
00495         glActiveTextureARB(GL_TEXTURE3_ARB);
00496         LLViewerImage::bindTexture(detail_texture1p,3); // bind any texture
00497         glEnable(GL_TEXTURE_2D); // Texture unit 3
00498         glClientActiveTextureARB(GL_TEXTURE3_ARB);
00499 
00500         // Set alpha texture and do lighting modulation
00501         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00502         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_MODULATE);
00503 
00504         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_PREVIOUS);
00505         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00506         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,           GL_PRIMARY_COLOR_ARB);
00507         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,          GL_SRC_COLOR);
00508 
00509         // GL_BLEND disabled by default
00510         drawLoop();
00511 
00512         //----------------------------------------------------------------------------
00513         // Second pass
00514 
00515         // Stage 0: Write detail3 into base
00516         //
00517         glActiveTextureARB(GL_TEXTURE0_ARB);
00518         LLViewerImage::bindTexture(detail_texture3p,0);
00519         glClientActiveTextureARB(GL_TEXTURE0_ARB);
00520 
00521         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00522         glEnable(GL_TEXTURE_GEN_S);
00523         glEnable(GL_TEXTURE_GEN_T);
00524         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00525         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00526         glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
00527         glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
00528 
00529         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00530         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_REPLACE);
00531 
00532         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_TEXTURE);
00533         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00534 
00535 
00536         //
00537         // Stage 1: Generate alpha ramp for detail2/detail3 transition
00538         //
00539         glActiveTextureARB(GL_TEXTURE1_ARB);
00540         LLViewerImage::bindTexture(m2DAlphaRampImagep,1);
00541 
00542         glEnable(GL_TEXTURE_2D); // Texture unit 1
00543         glClientActiveTextureARB(GL_TEXTURE1_ARB);
00544 
00545         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00546 
00547         // Set the texture matrix
00548         glMatrixMode(GL_TEXTURE);
00549         glLoadIdentity();
00550         glTranslatef(-2.f, 0.f, 0.f);
00551 
00552         // Care about alpha only
00553         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00554         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_REPLACE);
00555         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,         GL_REPLACE);
00556 
00557         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_PREVIOUS);
00558         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00559         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,         GL_TEXTURE);
00560         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,        GL_SRC_ALPHA);
00561 
00562 
00563         //
00564         // Stage 2: Interpolate detail2 with existing based on ramp
00565         //
00566         glActiveTextureARB(GL_TEXTURE2_ARB);
00567         LLViewerImage::bindTexture(detail_texture2p,2);
00568         glEnable(GL_TEXTURE_2D); // Texture unit 2
00569         glClientActiveTextureARB(GL_TEXTURE2_ARB);
00570 
00571         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00572         glEnable(GL_TEXTURE_GEN_S);
00573         glEnable(GL_TEXTURE_GEN_T);
00574         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00575         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00576         glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
00577         glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
00578 
00579         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00580         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_INTERPOLATE);
00581 
00582         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_PREVIOUS_ARB);
00583         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00584         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,           GL_TEXTURE);
00585         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,          GL_SRC_COLOR);
00586         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB,           GL_PREVIOUS_ARB);
00587         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB,          GL_ONE_MINUS_SRC_ALPHA);
00588         
00589 
00590         //
00591         // Stage 3: Generate alpha ramp for detail1/detail2 transition
00592         //
00593         glActiveTextureARB(GL_TEXTURE3_ARB);
00594         LLViewerImage::bindTexture(m2DAlphaRampImagep,3);
00595 
00596         glEnable(GL_TEXTURE_2D); // Texture unit 3
00597         glClientActiveTextureARB(GL_TEXTURE3_ARB);
00598 
00599         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00600 
00601         // Set the texture matrix
00602         glMatrixMode(GL_TEXTURE);
00603         glLoadIdentity();
00604         glTranslatef(-1.f, 0.f, 0.f);
00605   
00606         // Set alpha texture and do lighting modulation
00607         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00608         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_MODULATE);
00609         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,         GL_REPLACE);
00610 
00611         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_PREVIOUS);
00612         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00613         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,           GL_PRIMARY_COLOR_ARB);
00614         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,          GL_SRC_COLOR);
00615         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,         GL_TEXTURE);
00616         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,        GL_SRC_ALPHA);
00617 
00618 
00619         {
00620                 LLGLEnable blend(GL_BLEND);
00621                 drawLoop();
00622         }
00623 
00624         // Disable multitexture
00625         LLImageGL::unbindTexture(3, GL_TEXTURE_2D);
00626         glClientActiveTextureARB(GL_TEXTURE3_ARB);
00627         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00628         glDisable(GL_TEXTURE_2D); // Texture unit 3
00629         glMatrixMode(GL_TEXTURE);
00630         glLoadIdentity();
00631         glMatrixMode(GL_MODELVIEW);
00632 
00633         LLImageGL::unbindTexture(2, GL_TEXTURE_2D);
00634         glClientActiveTextureARB(GL_TEXTURE2_ARB);
00635         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00636         glDisable(GL_TEXTURE_2D); // Texture unit 2
00637         glDisable(GL_TEXTURE_GEN_S);
00638         glDisable(GL_TEXTURE_GEN_T);
00639         glMatrixMode(GL_TEXTURE);
00640         glLoadIdentity();
00641         glMatrixMode(GL_MODELVIEW);
00642 
00643         LLImageGL::unbindTexture(1, GL_TEXTURE_2D);
00644         glClientActiveTextureARB(GL_TEXTURE1_ARB);
00645         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00646         glDisable(GL_TEXTURE_2D); // Texture unit 1
00647         glMatrixMode(GL_TEXTURE);
00648         glLoadIdentity();
00649         glMatrixMode(GL_MODELVIEW);
00650 
00651         // Restore blend state
00652         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00653         
00654         //----------------------------------------------------------------------------
00655         // Restore Texture Unit 0 defaults
00656         
00657         LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
00658         glClientActiveTextureARB(GL_TEXTURE0_ARB);
00659         glActiveTextureARB(GL_TEXTURE0_ARB);
00660         glDisable(GL_TEXTURE_GEN_S);
00661         glDisable(GL_TEXTURE_GEN_T);
00662         glMatrixMode(GL_TEXTURE);
00663         glLoadIdentity();
00664         glMatrixMode(GL_MODELVIEW);
00665 
00666         // Restore non Texture Unit specific defaults
00667         glDisableClientState(GL_NORMAL_ARRAY);
00668         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
00669 }
00670 
00671 void LLDrawPoolTerrain::renderFull2TU()
00672 {
00673         glEnableClientState(GL_VERTEX_ARRAY);
00674         glEnableClientState(GL_NORMAL_ARRAY);
00675 
00676         // Hack! Get the region that this draw pool is rendering from!
00677         LLViewerRegion *regionp = mDrawFace[0]->getDrawable()->getVObj()->getRegion();
00678         LLVLComposition *compp = regionp->getComposition();
00679         LLViewerImage *detail_texture0p = compp->mDetailTextures[0];
00680         LLViewerImage *detail_texture1p = compp->mDetailTextures[1];
00681         LLViewerImage *detail_texture2p = compp->mDetailTextures[2];
00682         LLViewerImage *detail_texture3p = compp->mDetailTextures[3];
00683 
00684         LLVector3d region_origin_global = gAgent.getRegion()->getOriginGlobal();
00685         F32 offset_x = (F32)fmod(region_origin_global.mdV[VX], 1.0/(F64)sDetailScale)*sDetailScale;
00686         F32 offset_y = (F32)fmod(region_origin_global.mdV[VY], 1.0/(F64)sDetailScale)*sDetailScale;
00687 
00688         LLVector4 tp0, tp1;
00689         
00690         tp0.setVec(sDetailScale, 0.0f, 0.0f, offset_x);
00691         tp1.setVec(0.0f, sDetailScale, 0.0f, offset_y);
00692 
00693         glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
00694         
00695         //----------------------------------------------------------------------------
00696         // Pass 1/4
00697 
00698         //
00699         // Stage 0: Render detail 0 into base
00700         //
00701         LLViewerImage::bindTexture(detail_texture0p,0);
00702         glClientActiveTextureARB(GL_TEXTURE0_ARB);
00703 
00704         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00705         glEnable(GL_TEXTURE_GEN_S);
00706         glEnable(GL_TEXTURE_GEN_T);
00707         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00708         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00709 
00710         glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
00711         glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
00712 
00713         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00714         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_MODULATE);
00715 
00716         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_TEXTURE);
00717         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00718         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,           GL_PRIMARY_COLOR_ARB);
00719         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,          GL_SRC_COLOR);
00720 
00721         drawLoop();
00722 
00723         //----------------------------------------------------------------------------
00724         // Pass 2/4
00725         
00726         //
00727         // Stage 0: Generate alpha ramp for detail0/detail1 transition
00728         //
00729         LLViewerImage::bindTexture(m2DAlphaRampImagep,0);
00730         glClientActiveTextureARB(GL_TEXTURE0_ARB);
00731 
00732         glDisable(GL_TEXTURE_GEN_S);
00733         glDisable(GL_TEXTURE_GEN_T);
00734         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00735 
00736         // Care about alpha only
00737         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00738         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_REPLACE);
00739         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,         GL_REPLACE);
00740 
00741         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_PREVIOUS);
00742         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00743         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,         GL_TEXTURE);
00744         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,        GL_SRC_ALPHA);
00745 
00746 
00747         //
00748         // Stage 1: Write detail1
00749         //
00750         LLViewerImage::bindTexture(detail_texture1p,1); // Texture unit 1
00751         glEnable(GL_TEXTURE_2D);                // Texture unit 1
00752         glClientActiveTextureARB(GL_TEXTURE1_ARB);
00753 
00754         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00755         glEnable(GL_TEXTURE_GEN_S);
00756         glEnable(GL_TEXTURE_GEN_T);
00757         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00758         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00759         glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
00760         glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
00761 
00762         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00763         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_MODULATE);
00764         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,         GL_REPLACE);
00765 
00766         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_TEXTURE);
00767         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00768         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,           GL_PRIMARY_COLOR_ARB);
00769         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,          GL_SRC_COLOR);
00770         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,         GL_PREVIOUS);
00771         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,        GL_SRC_ALPHA);
00772 
00773         {
00774                 LLGLEnable blend(GL_BLEND);
00775                 drawLoop();
00776         }
00777         //----------------------------------------------------------------------------
00778         // Pass 3/4
00779         
00780         //
00781         // Stage 0: Generate alpha ramp for detail1/detail2 transition
00782         //
00783         LLViewerImage::bindTexture(m2DAlphaRampImagep,0);
00784         glClientActiveTextureARB(GL_TEXTURE0_ARB);
00785         // Set the texture matrix
00786         glMatrixMode(GL_TEXTURE);
00787         glLoadIdentity();
00788         glTranslatef(-1.f, 0.f, 0.f);
00789 
00790         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00791 
00792         // Care about alpha only
00793         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00794         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_REPLACE);
00795         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,         GL_REPLACE);
00796 
00797         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_PREVIOUS);
00798         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00799         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,         GL_TEXTURE);
00800         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,        GL_SRC_ALPHA);
00801 
00802         //
00803         // Stage 1: Write detail2
00804         //
00805         
00806         LLViewerImage::bindTexture(detail_texture2p,1);
00807         glEnable(GL_TEXTURE_2D); // Texture unit 1
00808         glClientActiveTextureARB(GL_TEXTURE1_ARB);
00809 
00810         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00811         glEnable(GL_TEXTURE_GEN_S);
00812         glEnable(GL_TEXTURE_GEN_T);
00813         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00814         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00815         glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
00816         glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
00817 
00818         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00819         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_MODULATE);
00820         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,         GL_REPLACE);
00821 
00822         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_TEXTURE);
00823         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00824         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,           GL_PRIMARY_COLOR_ARB);
00825         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,          GL_SRC_COLOR);
00826         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,         GL_PREVIOUS);
00827         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,        GL_SRC_ALPHA);
00828 
00829         {
00830                 LLGLEnable blend(GL_BLEND);
00831                 drawLoop();
00832         }
00833         
00834         //----------------------------------------------------------------------------
00835         // Pass 4/4
00836         
00837         //
00838         // Stage 0: Generate alpha ramp for detail2/detail3 transition
00839         //
00840         LLViewerImage::bindTexture(m2DAlphaRampImagep,0);
00841         glClientActiveTextureARB(GL_TEXTURE0_ARB);
00842         // Set the texture matrix
00843         glMatrixMode(GL_TEXTURE);
00844         glLoadIdentity();
00845         glTranslatef(-2.f, 0.f, 0.f);
00846 
00847         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00848 
00849         // Care about alpha only
00850         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00851         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_REPLACE);
00852         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,         GL_REPLACE);
00853 
00854         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_PREVIOUS);
00855         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00856         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,         GL_TEXTURE);
00857         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,        GL_SRC_ALPHA);
00858 
00859         // Stage 1: Write detail3
00860 
00861         LLViewerImage::bindTexture(detail_texture3p,1);
00862         glEnable(GL_TEXTURE_2D); // Texture unit 1
00863         glClientActiveTextureARB(GL_TEXTURE1_ARB);
00864 
00865         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00866         glEnable(GL_TEXTURE_GEN_S);
00867         glEnable(GL_TEXTURE_GEN_T);
00868         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00869         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00870         glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
00871         glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
00872 
00873         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00874         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_MODULATE);
00875         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,         GL_REPLACE);
00876 
00877         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_TEXTURE);
00878         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00879         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,           GL_PRIMARY_COLOR_ARB);
00880         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,          GL_SRC_COLOR);
00881         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,         GL_PREVIOUS);
00882         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,        GL_SRC_ALPHA);
00883 
00884         {
00885                 LLGLEnable blend(GL_BLEND);
00886                 drawLoop();
00887         }
00888         
00889         // Restore blend state
00890         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00891         
00892         // Disable multitexture
00893         LLImageGL::unbindTexture(1, GL_TEXTURE_2D);
00894         glClientActiveTextureARB(GL_TEXTURE1_ARB);
00895         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00896         glDisable(GL_TEXTURE_2D); // Texture unit 1
00897         glDisable(GL_TEXTURE_GEN_S);
00898         glDisable(GL_TEXTURE_GEN_T);
00899         glMatrixMode(GL_TEXTURE);
00900         glLoadIdentity();
00901         glMatrixMode(GL_MODELVIEW);
00902 
00903         //----------------------------------------------------------------------------
00904         // Restore Texture Unit 0 defaults
00905         
00906         LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
00907 
00908         glClientActiveTextureARB(GL_TEXTURE0_ARB);
00909         glActiveTextureARB(GL_TEXTURE0_ARB);
00910         glDisable(GL_TEXTURE_GEN_S);
00911         glDisable(GL_TEXTURE_GEN_T);
00912         glMatrixMode(GL_TEXTURE);
00913         glLoadIdentity();
00914         glMatrixMode(GL_MODELVIEW);
00915 
00916         // Restore non Texture Unit specific defaults
00917         glDisableClientState(GL_NORMAL_ARRAY);
00918         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
00919 }
00920 
00921 
00922 void LLDrawPoolTerrain::renderSimple()
00923 {
00924         glEnableClientState(GL_VERTEX_ARRAY);
00925         glEnableClientState(GL_NORMAL_ARRAY);
00926 
00927         LLVector4 tp0, tp1;
00928 
00929         //----------------------------------------------------------------------------
00930         // Pass 1/1
00931 
00932         // Stage 0: Base terrain texture pass
00933         mTexturep->addTextureStats(1024.f*1024.f);
00934         mTexturep->bind(0);
00935 
00936         glActiveTextureARB(GL_TEXTURE0_ARB);
00937         glEnable(GL_TEXTURE_2D); // Texture unit 2
00938         glClientActiveTextureARB(GL_TEXTURE0_ARB);
00939 
00940         LLVector3 origin_agent = mDrawFace[0]->getDrawable()->getVObj()->getRegion()->getOriginAgent();
00941         F32 tscale = 1.f/256.f;
00942         tp0.setVec(tscale, 0.f, 0.0f, -1.f*(origin_agent.mV[0]/256.f));
00943         tp1.setVec(0.f, tscale, 0.0f, -1.f*(origin_agent.mV[1]/256.f));
00944         
00945         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00946         glEnable(GL_TEXTURE_GEN_S);
00947         glEnable(GL_TEXTURE_GEN_T);
00948         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00949         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00950         glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0.mV);
00951         glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1.mV);
00952         
00953         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00954         glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_MODULATE);
00955 
00956         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_TEXTURE);
00957         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00958         glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB,           GL_PRIMARY_COLOR_ARB);
00959         glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB,          GL_SRC_COLOR);
00960 
00961         drawLoop();
00962 
00963         //----------------------------------------------------------------------------
00964         // Restore Texture Unit 0 defaults
00965         
00966         LLImageGL::unbindTexture(0, GL_TEXTURE_2D);
00967         glClientActiveTextureARB(GL_TEXTURE0_ARB);
00968         glActiveTextureARB(GL_TEXTURE0_ARB);
00969         glDisable(GL_TEXTURE_GEN_S);
00970         glDisable(GL_TEXTURE_GEN_T);
00971         glMatrixMode(GL_TEXTURE);
00972         glLoadIdentity();
00973         glMatrixMode(GL_MODELVIEW);
00974 
00975         // Restore non Texture Unit specific defaults
00976         glDisableClientState(GL_NORMAL_ARRAY);
00977         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
00978 }
00979 
00980 //============================================================================
00981 
00982 void LLDrawPoolTerrain::renderOwnership()
00983 {
00984         LLGLSPipelineAlpha gls_pipeline_alpha;
00985 
00986         llassert(!mDrawFace.empty());
00987 
00988         // Each terrain pool is associated with a single region.
00989         // We need to peek back into the viewer's data to find out
00990         // which ownership overlay texture to use.
00991         LLFace                                  *facep                          = mDrawFace[0];
00992         LLDrawable                              *drawablep                      = facep->getDrawable();
00993         const LLViewerObject    *objectp                                = drawablep->getVObj();
00994         const LLVOSurfacePatch  *vo_surface_patchp      = (LLVOSurfacePatch *)objectp;
00995         LLSurfacePatch                  *surface_patchp         = vo_surface_patchp->getPatch();
00996         LLSurface                               *surfacep                       = surface_patchp->getSurface();
00997         LLViewerRegion                  *regionp                        = surfacep->getRegion();
00998         LLViewerParcelOverlay   *overlayp                       = regionp->getParcelOverlay();
00999         LLImageGL                               *texturep                       = overlayp->getTexture();
01000 
01001         glEnableClientState(GL_VERTEX_ARRAY);
01002         glDisableClientState(GL_NORMAL_ARRAY);
01003 
01004         LLViewerImage::bindTexture(texturep);
01005 
01006         glClientActiveTextureARB(GL_TEXTURE0_ARB);
01007         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
01008         
01009         // *NOTE: Because the region is 256 meters wide, but has 257 pixels, the 
01010         // texture coordinates for pixel 256x256 is not 1,1. This makes the
01011         // ownership map not line up with the selection. We address this with
01012         // a texture matrix multiply.
01013         glMatrixMode(GL_TEXTURE);
01014         glPushMatrix();
01015 
01016         const F32 TEXTURE_FUDGE = 257.f / 256.f;
01017         glScalef( TEXTURE_FUDGE, TEXTURE_FUDGE, 1.f );
01018 
01019         for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
01020                  iter != mDrawFace.end(); iter++)
01021         {
01022                 LLFace *facep = *iter;
01023                 facep->renderIndexed(LLVertexBuffer::MAP_VERTEX |
01024                                                         LLVertexBuffer::MAP_TEXCOORD);
01025         }
01026 
01027         glMatrixMode(GL_TEXTURE);
01028         glPopMatrix();
01029         glMatrixMode(GL_MODELVIEW);
01030 
01031         // Restore non Texture Unit specific defaults
01032         glDisableClientState(GL_NORMAL_ARRAY);
01033 }
01034 
01035 
01036 void LLDrawPoolTerrain::renderForSelect()
01037 {
01038         if (mDrawFace.empty())
01039         {
01040                 return;
01041         }
01042 
01043         
01044         LLImageGL::unbindTexture(0);
01045 
01046         for (std::vector<LLFace*>::iterator iter = mDrawFace.begin();
01047                  iter != mDrawFace.end(); iter++)
01048         {
01049                 LLFace *facep = *iter;
01050                 if (!facep->getDrawable()->isDead() && (facep->getDrawable()->getVObj()->mGLName))
01051                 {
01052                         facep->renderForSelect(LLVertexBuffer::MAP_VERTEX);
01053                 }
01054         }
01055 }
01056 
01057 void LLDrawPoolTerrain::dirtyTextures(const std::set<LLViewerImage*>& textures)
01058 {
01059         if (textures.find(mTexturep) != textures.end())
01060         {
01061                 for (std::vector<LLFace*>::iterator iter = mReferences.begin();
01062                          iter != mReferences.end(); iter++)
01063                 {
01064                         LLFace *facep = *iter;
01065                         gPipeline.markTextured(facep->getDrawable());
01066                 }
01067         }
01068 }
01069 
01070 LLViewerImage *LLDrawPoolTerrain::getTexture()
01071 {
01072         return mTexturep;
01073 }
01074 
01075 LLViewerImage *LLDrawPoolTerrain::getDebugTexture()
01076 {
01077         return mTexturep;
01078 }
01079 
01080 
01081 LLColor3 LLDrawPoolTerrain::getDebugColor() const
01082 {
01083         return LLColor3(0.f, 0.f, 1.f);
01084 }
01085 
01086 S32 LLDrawPoolTerrain::getMaterialAttribIndex()
01087 {
01088         return gTerrainProgram.mAttribute[LLShaderMgr::MATERIAL_COLOR];
01089 }

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