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

Generated on Fri May 16 08:33:19 2008 for SecondLife by  doxygen 1.5.5