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"
00048 #include "llviewerparceloverlay.h"
00049 #include "llvosurfacepatch.h"
00050 #include "llviewercamera.h"
00051 #include "llviewerimagelist.h"
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
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
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
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);
00126 }
00127
00128 if (!gGLManager.mHasMultitexture)
00129 {
00130
00131 renderSimple();
00132 return;
00133 }
00134
00135 if (!gGLManager.mHasARBEnvCombine || (gGLManager.mNumTextureUnits < 2))
00136 {
00137 renderSimple();
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
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
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
00225
00226
00227
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
00249
00250 LLViewerImage::bindTexture(m2DAlphaRampImagep,rampTex);
00251
00252 glClientActiveTextureARB(GL_TEXTURE1_ARB);
00253 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00254
00255
00256
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
00272
00273
00274
00275 glClientActiveTextureARB(GL_TEXTURE3_ARB);
00276 glActiveTextureARB(GL_TEXTURE3_ARB);
00277
00278 drawLoop();
00279
00280
00281
00282
00283
00284
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
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
00308 glMatrixMode(GL_TEXTURE);
00309 glLoadIdentity();
00310 glTranslatef(-2.f, 0.f, 0.f);
00311
00312
00313
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
00329
00330
00331
00332
00333
00334 glClientActiveTextureARB(GL_TEXTURE3_ARB);
00335 glActiveTextureARB(GL_TEXTURE3_ARB);
00336 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00337
00338
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
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
00377 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00378
00379
00380
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
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
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
00423
00424
00425
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
00448
00449 glActiveTextureARB(GL_TEXTURE1_ARB);
00450 LLViewerImage::bindTexture(m2DAlphaRampImagep,1);
00451
00452 glEnable(GL_TEXTURE_2D);
00453 glClientActiveTextureARB(GL_TEXTURE1_ARB);
00454 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00455
00456
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
00468
00469 glActiveTextureARB(GL_TEXTURE2_ARB);
00470 LLViewerImage::bindTexture(detail_texture1p,2);
00471 glEnable(GL_TEXTURE_2D);
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
00494
00495 glActiveTextureARB(GL_TEXTURE3_ARB);
00496 LLViewerImage::bindTexture(detail_texture1p,3);
00497 glEnable(GL_TEXTURE_2D);
00498 glClientActiveTextureARB(GL_TEXTURE3_ARB);
00499
00500
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
00510 drawLoop();
00511
00512
00513
00514
00515
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
00538
00539 glActiveTextureARB(GL_TEXTURE1_ARB);
00540 LLViewerImage::bindTexture(m2DAlphaRampImagep,1);
00541
00542 glEnable(GL_TEXTURE_2D);
00543 glClientActiveTextureARB(GL_TEXTURE1_ARB);
00544
00545 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00546
00547
00548 glMatrixMode(GL_TEXTURE);
00549 glLoadIdentity();
00550 glTranslatef(-2.f, 0.f, 0.f);
00551
00552
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
00565
00566 glActiveTextureARB(GL_TEXTURE2_ARB);
00567 LLViewerImage::bindTexture(detail_texture2p,2);
00568 glEnable(GL_TEXTURE_2D);
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
00592
00593 glActiveTextureARB(GL_TEXTURE3_ARB);
00594 LLViewerImage::bindTexture(m2DAlphaRampImagep,3);
00595
00596 glEnable(GL_TEXTURE_2D);
00597 glClientActiveTextureARB(GL_TEXTURE3_ARB);
00598
00599 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00600
00601
00602 glMatrixMode(GL_TEXTURE);
00603 glLoadIdentity();
00604 glTranslatef(-1.f, 0.f, 0.f);
00605
00606
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
00625 LLImageGL::unbindTexture(3, GL_TEXTURE_2D);
00626 glClientActiveTextureARB(GL_TEXTURE3_ARB);
00627 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00628 glDisable(GL_TEXTURE_2D);
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);
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);
00647 glMatrixMode(GL_TEXTURE);
00648 glLoadIdentity();
00649 glMatrixMode(GL_MODELVIEW);
00650
00651
00652 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00653
00654
00655
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
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
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
00697
00698
00699
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
00725
00726
00727
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
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
00749
00750 LLViewerImage::bindTexture(detail_texture1p,1);
00751 glEnable(GL_TEXTURE_2D);
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
00779
00780
00781
00782
00783 LLViewerImage::bindTexture(m2DAlphaRampImagep,0);
00784 glClientActiveTextureARB(GL_TEXTURE0_ARB);
00785
00786 glMatrixMode(GL_TEXTURE);
00787 glLoadIdentity();
00788 glTranslatef(-1.f, 0.f, 0.f);
00789
00790 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00791
00792
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
00804
00805
00806 LLViewerImage::bindTexture(detail_texture2p,1);
00807 glEnable(GL_TEXTURE_2D);
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
00836
00837
00838
00839
00840 LLViewerImage::bindTexture(m2DAlphaRampImagep,0);
00841 glClientActiveTextureARB(GL_TEXTURE0_ARB);
00842
00843 glMatrixMode(GL_TEXTURE);
00844 glLoadIdentity();
00845 glTranslatef(-2.f, 0.f, 0.f);
00846
00847 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00848
00849
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
00860
00861 LLViewerImage::bindTexture(detail_texture3p,1);
00862 glEnable(GL_TEXTURE_2D);
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
00890 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00891
00892
00893 LLImageGL::unbindTexture(1, GL_TEXTURE_2D);
00894 glClientActiveTextureARB(GL_TEXTURE1_ARB);
00895 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
00896 glDisable(GL_TEXTURE_2D);
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
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
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
00931
00932
00933 mTexturep->addTextureStats(1024.f*1024.f);
00934 mTexturep->bind(0);
00935
00936 glActiveTextureARB(GL_TEXTURE0_ARB);
00937 glEnable(GL_TEXTURE_2D);
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
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
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
00989
00990
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
01010
01011
01012
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
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 }