lldrawpoolalpha.cpp

Go to the documentation of this file.
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"  // For debugging
00048 #include "llviewerobjectlist.h" // For debugging
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 //                              if (!last_part || part->mDepthMask != last_part->mDepthMask)
00178 //                              {
00179 //                                      glDepthMask(part->mDepthMask);
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         //F32 width = (F32) gViewerWindow->getWindowDisplayWidth();
00256 
00257         //F32 view = gCamera->getView();
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         /*LLGLEnable point_sprite(GL_POINT_SPRITE_ARB);
00269 
00270         if (gGLManager.mHasPointParameters)
00271         {
00272                 glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, TRUE);
00273                 glPointParameterfARB(GL_POINT_SIZE_MIN_ARB, 0.f);
00274                 glPointParameterfARB(GL_POINT_SIZE_MAX_ARB, width*16.f);
00275                 glPointSize(width/(view*view));
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                                         //********UMICH 3D LAB********
00301                                         // protect the color mask change for correct anaglyph render
00302                                         GLboolean mask[4];
00303                                         glGetBooleanv(GL_COLOR_WRITEMASK,mask);
00304                                         glColorMask(mask[0], mask[1], mask[2], GL_FALSE);
00305                                         //********UMICH 3D LAB********
00306                                 }
00307                         }
00308                 }
00309                 else if (!light_enabled)
00310                 {
00311                         gPipeline.enableLightsDynamic(1.f);
00312                         light_enabled = TRUE;
00313                         if (LLPipeline::sRenderGlow)
00314                         {
00315                                         //********UMICH 3D LAB********
00316                                         // protect the color mask change for correct anaglyph render
00317                                         GLboolean mask[4];
00318                                         glGetBooleanv(GL_COLOR_WRITEMASK,mask);
00319                                         glColorMask(mask[0], mask[1], mask[2], GL_FALSE);
00320                                         //********UMICH 3D LAB********
00321                         }
00322                 }
00323 
00324                 /*if (params.mParticle)
00325                 {
00326                         F32 size = params.mPartSize;
00327                         size *= size;
00328                         float param[] = { 0, 0, 0.01f/size*view*view };
00329                         prim_type = GL_POINTS;
00330                         glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, param);
00331                 }
00332                 else*/
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                                 //********UMICH 3D LAB********
00358                                 // protect the color mask change for correct anaglyph render
00359                                 GLboolean mask[4];
00360                                 glGetBooleanv(GL_COLOR_WRITEMASK,mask);
00361                                 glColorMask(mask[0], mask[1], mask[2], GL_FALSE);
00362                                 //********UMICH 3D LAB********
00363                 }
00364         }
00365 
00366         /*glPointSize(1.f);
00367 
00368         if (gGLManager.mHasPointParameters)
00369         {
00370                 float param[] = {1, 0, 0 };
00371                 glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, param);
00372         }*/
00373 }       

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