00001
00032 #include "llviewerprecompiledheaders.h"
00033
00034 #include "lldrawpoolalpha.h"
00035
00036 #include "llglheaders.h"
00037 #include "llviewercontrol.h"
00038 #include "llcriticaldamp.h"
00039 #include "llfasttimer.h"
00040
00041 #include "llcubemap.h"
00042 #include "llsky.h"
00043 #include "llagent.h"
00044 #include "lldrawable.h"
00045 #include "llface.h"
00046 #include "llviewercamera.h"
00047 #include "llviewerimagelist.h"
00048 #include "llviewerobjectlist.h"
00049 #include "llviewerwindow.h"
00050 #include "pipeline.h"
00051 #include "llviewerregion.h"
00052 #include "llglslshader.h"
00053
00054 BOOL LLDrawPoolAlpha::sShowDebugAlpha = FALSE;
00055
00056 LLDrawPoolAlpha::LLDrawPoolAlpha(U32 type) :
00057 LLRenderPass(type)
00058 {
00059
00060 }
00061
00062 LLDrawPoolAlphaPostWater::LLDrawPoolAlphaPostWater()
00063 : LLDrawPoolAlpha(POOL_ALPHA_POST_WATER)
00064 {
00065 }
00066
00067 LLDrawPoolAlpha::~LLDrawPoolAlpha()
00068 {
00069 }
00070
00071
00072 void LLDrawPoolAlpha::prerender()
00073 {
00074 mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_OBJECT);
00075 }
00076
00077 void LLDrawPoolAlpha::beginRenderPass(S32 pass)
00078 {
00079 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
00080 glEnableClientState(GL_NORMAL_ARRAY);
00081 glEnableClientState(GL_COLOR_ARRAY);
00082 }
00083
00084 void setup_clip_plane(BOOL pre_water)
00085 {
00086 F32 height = gAgent.getRegion()->getWaterHeight();
00087 BOOL above = gCamera->getOrigin().mV[2] > height ? TRUE : FALSE;
00088
00089 F64 plane[4];
00090
00091 plane[0] = 0;
00092 plane[1] = 0;
00093 plane[2] = above == pre_water ? -1.0 : 1.0;
00094 plane[3] = -plane[2] * height;
00095
00096 glClipPlane(GL_CLIP_PLANE0, plane);
00097 }
00098
00099 void LLDrawPoolAlphaPostWater::render(S32 pass)
00100 {
00101 LLFastTimer t(LLFastTimer::FTM_RENDER_ALPHA);
00102
00103 if (gPipeline.hasRenderType(LLDrawPool::POOL_ALPHA))
00104 {
00105 LLGLEnable clip(GL_CLIP_PLANE0);
00106 setup_clip_plane(FALSE);
00107 LLDrawPoolAlpha::render(gPipeline.mAlphaGroupsPostWater);
00108 }
00109 else
00110 {
00111 LLDrawPoolAlpha::render(gPipeline.mAlphaGroupsPostWater);
00112 }
00113 }
00114
00115 void LLDrawPoolAlpha::render(S32 pass)
00116 {
00117 LLFastTimer t(LLFastTimer::FTM_RENDER_ALPHA);
00118
00119 LLGLEnable clip(GL_CLIP_PLANE0);
00120 setup_clip_plane(TRUE);
00121 render(gPipeline.mAlphaGroups);
00122 }
00123
00124 void LLDrawPoolAlpha::render(std::vector<LLSpatialGroup*>& groups)
00125 {
00126 LLGLDepthTest gls_depth(GL_TRUE);
00127 LLGLSPipelineAlpha gls_pipeline_alpha;
00128
00129 gPipeline.enableLightsDynamic(1.f);
00130 renderAlpha(getVertexDataMask(), groups);
00131
00132 if (sShowDebugAlpha)
00133 {
00134 glDisableClientState(GL_NORMAL_ARRAY);
00135 glDisableClientState(GL_COLOR_ARRAY);
00136 gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
00137 glColor4f(1,0,0,1);
00138 LLViewerImage::sSmokeImagep->addTextureStats(1024.f*1024.f);
00139 LLViewerImage::sSmokeImagep->bind();
00140 renderAlphaHighlight(LLVertexBuffer::MAP_VERTEX |
00141 LLVertexBuffer::MAP_TEXCOORD, groups);
00142 }
00143 }
00144
00145 void LLDrawPoolAlpha::renderAlpha(U32 mask, std::vector<LLSpatialGroup*>& groups)
00146 {
00147 #if !LL_RELEASE_FOR_DOWNLOAD
00148 LLGLState::checkClientArrays(mask);
00149 #endif
00150
00151 LLSpatialBridge* last_bridge = NULL;
00152 LLSpatialPartition* last_part = NULL;
00153 glPushMatrix();
00154 LLGLDepthTest depth(GL_TRUE, GL_FALSE);
00155
00156 for (std::vector<LLSpatialGroup*>::iterator i = groups.begin(); i != groups.end(); ++i)
00157 {
00158 LLSpatialGroup* group = *i;
00159 if (group->mSpatialPartition->mRenderByGroup &&
00160 !group->isDead())
00161 {
00162 LLSpatialPartition* part = group->mSpatialPartition;
00163 if (part != last_part)
00164 {
00165 LLSpatialBridge* bridge = part->asBridge();
00166 if (bridge != last_bridge)
00167 {
00168 glPopMatrix();
00169 glPushMatrix();
00170 if (bridge)
00171 {
00172 glMultMatrixf((F32*) bridge->mDrawable->getRenderMatrix().mMatrix);
00173 }
00174 last_bridge = bridge;
00175 }
00176
00177
00178
00179
00180
00181 last_part = part;
00182 }
00183
00184 renderGroupAlpha(group,LLRenderPass::PASS_ALPHA,mask,TRUE);
00185 }
00186 }
00187
00188 glPopMatrix();
00189 }
00190
00191 void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask, std::vector<LLSpatialGroup*>& groups)
00192 {
00193 #if !LL_RELEASE_FOR_DOWNLOAD
00194 LLGLState::checkClientArrays(mask);
00195 #endif
00196
00197 LLSpatialBridge* last_bridge = NULL;
00198 LLSpatialPartition* last_part = NULL;
00199 glPushMatrix();
00200
00201 for (std::vector<LLSpatialGroup*>::iterator i = groups.begin(); i != groups.end(); ++i)
00202 {
00203 LLSpatialGroup* group = *i;
00204 if (group->mSpatialPartition->mRenderByGroup &&
00205 !group->isDead())
00206 {
00207 LLSpatialPartition* part = group->mSpatialPartition;
00208 if (part != last_part)
00209 {
00210 LLSpatialBridge* bridge = part->asBridge();
00211 if (bridge != last_bridge)
00212 {
00213 glPopMatrix();
00214 glPushMatrix();
00215 if (bridge)
00216 {
00217 glMultMatrixf((F32*) bridge->mDrawable->getRenderMatrix().mMatrix);
00218 }
00219 last_bridge = bridge;
00220 }
00221
00222 last_part = part;
00223 }
00224
00225 LLSpatialGroup::drawmap_elem_t& draw_info = group->mDrawMap[LLRenderPass::PASS_ALPHA];
00226
00227 for (LLSpatialGroup::drawmap_elem_t::iterator k = draw_info.begin(); k != draw_info.end(); ++k)
00228 {
00229 LLDrawInfo& params = **k;
00230
00231 if (params.mParticle)
00232 {
00233 continue;
00234 }
00235 params.mVertexBuffer->setBuffer(mask);
00236 U32* indices_pointer = (U32*) params.mVertexBuffer->getIndicesPointer();
00237 glDrawRangeElements(GL_TRIANGLES, params.mStart, params.mEnd, params.mCount,
00238 GL_UNSIGNED_INT, indices_pointer+params.mOffset);
00239
00240 addIndicesDrawn(params.mCount);
00241 }
00242 }
00243 }
00244 glPopMatrix();
00245 }
00246
00247 void LLDrawPoolAlpha::renderGroupAlpha(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture)
00248 {
00249 BOOL light_enabled = TRUE;
00250
00251 LLSpatialGroup::drawmap_elem_t& draw_info = group->mDrawMap[type];
00252
00253 U32 prim_type = GL_TRIANGLES;
00254
00255
00256
00257
00258
00259 if (group->mSpatialPartition->mDrawableType == LLPipeline::RENDER_TYPE_CLOUDS)
00260 {
00261 glAlphaFunc(GL_GREATER, 0.f);
00262 }
00263 else
00264 {
00265 glAlphaFunc(GL_GREATER, 0.01f);
00266 }
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278 for (LLSpatialGroup::drawmap_elem_t::iterator k = draw_info.begin(); k != draw_info.end(); ++k)
00279 {
00280 LLDrawInfo& params = **k;
00281 if (texture && params.mTexture.notNull())
00282 {
00283 params.mTexture->bind();
00284 params.mTexture->addTextureStats(params.mVSize);
00285 if (params.mTextureMatrix)
00286 {
00287 glMatrixMode(GL_TEXTURE);
00288 glLoadMatrixf((GLfloat*) params.mTextureMatrix->mMatrix);
00289 }
00290 }
00291
00292 if (params.mFullbright)
00293 {
00294 if (light_enabled)
00295 {
00296 gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
00297 light_enabled = FALSE;
00298 if (LLPipeline::sRenderGlow)
00299 {
00300
00301
00302 GLboolean mask[4];
00303 glGetBooleanv(GL_COLOR_WRITEMASK,mask);
00304 glColorMask(mask[0], mask[1], mask[2], GL_FALSE);
00305
00306 }
00307 }
00308 }
00309 else if (!light_enabled)
00310 {
00311 gPipeline.enableLightsDynamic(1.f);
00312 light_enabled = TRUE;
00313 if (LLPipeline::sRenderGlow)
00314 {
00315
00316
00317 GLboolean mask[4];
00318 glGetBooleanv(GL_COLOR_WRITEMASK,mask);
00319 glColorMask(mask[0], mask[1], mask[2], GL_FALSE);
00320
00321 }
00322 }
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333 {
00334 prim_type = GL_TRIANGLES;
00335 }
00336
00337 params.mVertexBuffer->setBuffer(mask);
00338 U32* indices_pointer = (U32*) params.mVertexBuffer->getIndicesPointer();
00339 glDrawRangeElements(prim_type, params.mStart, params.mEnd, params.mCount,
00340 GL_UNSIGNED_INT, indices_pointer+params.mOffset);
00341
00342 addIndicesDrawn(params.mCount);
00343
00344 if (params.mTextureMatrix && texture && params.mTexture.notNull())
00345 {
00346 glLoadIdentity();
00347 glMatrixMode(GL_MODELVIEW);
00348 }
00349 }
00350
00351 if (!light_enabled)
00352 {
00353 gPipeline.enableLightsDynamic(1.f);
00354
00355 if (LLPipeline::sRenderGlow)
00356 {
00357
00358
00359 GLboolean mask[4];
00360 glGetBooleanv(GL_COLOR_WRITEMASK,mask);
00361 glColorMask(mask[0], mask[1], mask[2], GL_FALSE);
00362
00363 }
00364 }
00365
00366
00367
00368
00369
00370
00371
00372
00373 }