lldrawpoolavatar.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 #include "lldrawpoolavatar.h"
00035 #include "llglimmediate.h"
00036 
00037 #include "llvoavatar.h"
00038 #include "m3math.h"
00039 
00040 #include "llagent.h"
00041 #include "lldrawable.h"
00042 #include "llface.h"
00043 #include "llsky.h"
00044 #include "llviewercamera.h"
00045 #include "llviewerregion.h"
00046 #include "noise.h"
00047 #include "pipeline.h"
00048 #include "llglslshader.h"
00049 #include "llappviewer.h"
00050 
00051 static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK;
00052 static U32 sBufferUsage = GL_STREAM_DRAW_ARB;
00053 static U32 sShaderLevel = 0;
00054 static LLGLSLShader* sVertexProgram = NULL;
00055 
00056 extern BOOL gUseGLPick;
00057 
00058 F32 CLOTHING_GRAVITY_EFFECT = 0.7f;
00059 F32 CLOTHING_ACCEL_FORCE_FACTOR = 0.2f;
00060 const S32 NUM_TEST_AVATARS = 30;
00061 const S32 MIN_PIXEL_AREA_2_PASS_SKINNING = 500000000;
00062 
00063 // Format for gAGPVertices
00064 // vertex format for bumpmapping:
00065 //  vertices   12
00066 //  pad             4
00067 //  normals    12
00068 //  pad             4
00069 //  texcoords0  8
00070 //  texcoords1  8
00071 // total       48
00072 //
00073 // for no bumpmapping
00074 //  vertices       12
00075 //  texcoords   8
00076 //  normals        12
00077 // total           32
00078 //
00079 
00080 S32 AVATAR_OFFSET_POS = 0;
00081 S32 AVATAR_OFFSET_NORMAL = 16;
00082 S32 AVATAR_OFFSET_TEX0 = 32;
00083 S32 AVATAR_OFFSET_TEX1 = 40;
00084 S32 AVATAR_VERTEX_BYTES = 48;
00085 
00086 
00087 BOOL gAvatarEmbossBumpMap = FALSE;
00088 static BOOL sRenderingSkinned = FALSE;
00089 
00090 LLDrawPoolAvatar::LLDrawPoolAvatar() :
00091 LLFacePool(POOL_AVATAR)
00092 {
00093         //LLDebugVarMessageBox::show("acceleration", &CLOTHING_ACCEL_FORCE_FACTOR, 10.f, 0.1f);
00094         //LLDebugVarMessageBox::show("gravity", &CLOTHING_GRAVITY_EFFECT, 10.f, 0.1f);  
00095 }
00096 
00097 //-----------------------------------------------------------------------------
00098 // instancePool()
00099 //-----------------------------------------------------------------------------
00100 LLDrawPool *LLDrawPoolAvatar::instancePool()
00101 {
00102         return new LLDrawPoolAvatar();
00103 }
00104 
00105 BOOL gRenderAvatar = TRUE;
00106 
00107 S32 LLDrawPoolAvatar::getVertexShaderLevel() const
00108 {
00109         return sShaderLevel;
00110         //return (S32) LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR);
00111 }
00112 
00113 void LLDrawPoolAvatar::prerender()
00114 {
00115         mVertexShaderLevel = LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR);
00116         sShaderLevel = mVertexShaderLevel;
00117         
00118         if (sShaderLevel > 0)
00119         {
00120                 sBufferUsage = GL_STATIC_DRAW_ARB;
00121         }
00122         else
00123         {
00124                 sBufferUsage = GL_STREAM_DRAW_ARB;
00125         }
00126 }
00127 
00128 LLMatrix4& LLDrawPoolAvatar::getModelView()
00129 {
00130         static LLMatrix4 ret;
00131 
00132         ret.initRows(LLVector4(gGLModelView+0),
00133                                  LLVector4(gGLModelView+4),
00134                                  LLVector4(gGLModelView+8),
00135                                  LLVector4(gGLModelView+12));
00136 
00137         return ret;
00138 }
00139 
00140 //-----------------------------------------------------------------------------
00141 // render()
00142 //-----------------------------------------------------------------------------
00143 
00144 S32 LLDrawPoolAvatar::getNumPasses()
00145 {
00146         return LLPipeline::sImpostorRender ? 1 : 3;
00147 }
00148 
00149 void LLDrawPoolAvatar::render(S32 pass)
00150 {
00151         LLFastTimer t(LLFastTimer::FTM_RENDER_CHARACTERS);
00152         if (LLPipeline::sImpostorRender)
00153         {
00154                 renderAvatars(NULL, 2);
00155                 return;
00156         }
00157 
00158         renderAvatars(NULL, pass); // render all avatars
00159 }
00160 
00161 void LLDrawPoolAvatar::beginRenderPass(S32 pass)
00162 {
00163         LLFastTimer t(LLFastTimer::FTM_RENDER_CHARACTERS);
00164         //reset vertex buffer mappings
00165         LLVertexBuffer::unbind();
00166 
00167         if (LLPipeline::sImpostorRender)
00168         {
00169                 beginSkinned();
00170                 return;
00171         }
00172 
00173         switch (pass)
00174         {
00175         case 0:
00176                 beginFootShadow();
00177                 break;
00178         case 1:
00179                 beginRigid();
00180                 break;
00181         case 2:
00182                 beginSkinned();
00183                 break;
00184         }
00185 }
00186 
00187 void LLDrawPoolAvatar::endRenderPass(S32 pass)
00188 {
00189         LLFastTimer t(LLFastTimer::FTM_RENDER_CHARACTERS);
00190 
00191         if (LLPipeline::sImpostorRender)
00192         {
00193                 endSkinned();
00194                 return;
00195         }
00196 
00197         switch (pass)
00198         {
00199         case 0:
00200                 endFootShadow();
00201                 break;
00202         case 1:
00203                 endRigid();
00204                 break;
00205         case 2:
00206                 endSkinned();
00207         }
00208 }
00209 
00210 void LLDrawPoolAvatar::beginFootShadow()
00211 {
00212         if (!LLPipeline::sReflectionRender)
00213         {
00214                 LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f);
00215                 LLVOAvatar::sNumVisibleAvatars = 0;
00216         }
00217 
00218         gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
00219 }
00220 
00221 void LLDrawPoolAvatar::endFootShadow()
00222 {
00223         gPipeline.enableLightsDynamic();
00224 }
00225 
00226 void LLDrawPoolAvatar::beginRigid()
00227 {
00228         if (gPipeline.canUseVertexShaders())
00229         {
00230                 if (LLPipeline::sUnderWaterRender)
00231                 {
00232                         sVertexProgram = &gObjectSimpleWaterProgram;
00233                 }
00234                 else
00235                 {
00236                         sVertexProgram = &gObjectSimpleProgram;
00237                 }
00238                 
00239                 if (sVertexProgram != NULL)
00240                 {       //eyeballs render with the specular shader
00241                         sVertexProgram->bind();
00242                 }
00243         }
00244         else
00245         {
00246                 sVertexProgram = NULL;
00247         }
00248 }
00249 
00250 void LLDrawPoolAvatar::endRigid()
00251 {
00252         sShaderLevel = mVertexShaderLevel;
00253         if (sVertexProgram != NULL)
00254         {
00255                 sVertexProgram->unbind();
00256         }
00257 }
00258 
00259 void LLDrawPoolAvatar::beginSkinned()
00260 {
00261         if (sShaderLevel > 0)
00262         {
00263                 if (LLPipeline::sUnderWaterRender)
00264                 {
00265                         sVertexProgram = &gAvatarWaterProgram;
00266                         sShaderLevel = llmin((U32) 1, sShaderLevel);
00267                 }
00268                 else
00269                 {
00270                         sVertexProgram = &gAvatarProgram;
00271                 }
00272         }
00273         else
00274         {
00275                 if (LLPipeline::sUnderWaterRender)
00276                 {
00277                         sVertexProgram = &gObjectSimpleWaterProgram;
00278                 }
00279                 else
00280                 {
00281                         sVertexProgram = &gObjectSimpleProgram;
00282                 }
00283         }
00284         
00285         if (sShaderLevel > 0)  // for hardware blending
00286         {
00287                 sRenderingSkinned = TRUE;
00288                 
00289                 sVertexProgram->bind();
00290                 if (sShaderLevel >= SHADER_LEVEL_CLOTH)
00291                 {
00292                         enable_cloth_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_CLOTHING]);
00293                 }
00294                 enable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]);
00295 
00296                 if (sShaderLevel >= SHADER_LEVEL_BUMP)
00297                 {
00298                         enable_binormals(sVertexProgram->mAttribute[LLShaderMgr::BINORMAL]);
00299                 }
00300                 
00301                 sVertexProgram->enableTexture(LLShaderMgr::BUMP_MAP);
00302                 glActiveTextureARB(GL_TEXTURE0_ARB);
00303         }
00304         else
00305         {
00306                 if(gPipeline.canUseVertexShaders())
00307                 {
00308                         // software skinning, use a basic shader for windlight.
00309                         // TODO: find a better fallback method for software skinning.
00310                         sVertexProgram->bind();
00311                 }
00312         }
00313 }
00314 
00315 void LLDrawPoolAvatar::endSkinned()
00316 {
00317         // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
00318         if (sShaderLevel > 0)
00319         {
00320                 sRenderingSkinned = FALSE;
00321                 sVertexProgram->disableTexture(LLShaderMgr::BUMP_MAP);
00322                 glActiveTextureARB(GL_TEXTURE0_ARB);
00323                 disable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]);
00324                 if (sShaderLevel >= SHADER_LEVEL_BUMP)
00325                 {
00326                         disable_binormals(sVertexProgram->mAttribute[LLShaderMgr::BINORMAL]);
00327                 }
00328                 if ((sShaderLevel >= SHADER_LEVEL_CLOTH))
00329                 {
00330                         disable_cloth_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_CLOTHING]);
00331                 }
00332 
00333                 sVertexProgram->unbind();
00334                 sShaderLevel = mVertexShaderLevel;
00335         }
00336         else
00337         {
00338                 if(gPipeline.canUseVertexShaders())
00339                 {
00340                         // software skinning, use a basic shader for windlight.
00341                         // TODO: find a better fallback method for software skinning.
00342                         sVertexProgram->unbind();
00343                 }
00344         }
00345 
00346         glActiveTextureARB(GL_TEXTURE0_ARB);
00347 }
00348 
00349 
00350 void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
00351 {
00352         if (pass == -1)
00353         {
00354                 for (S32 i = 1; i < getNumPasses(); i++)
00355                 { //skip foot shadows
00356                         prerender();
00357                         beginRenderPass(i);
00358                         renderAvatars(single_avatar, i);
00359                         endRenderPass(i);
00360                 }
00361 
00362                 return;
00363         }
00364 
00365         
00366 
00367         if (!gRenderAvatar)
00368         {
00369                 return;
00370         }
00371 
00372         if (mDrawFace.empty() && !single_avatar)
00373         {
00374                 return;
00375         }
00376 
00377         LLVOAvatar *avatarp;
00378 
00379         if (single_avatar)
00380         {
00381                 avatarp = single_avatar;
00382         }
00383         else
00384         {
00385                 const LLFace *facep = mDrawFace[0];
00386                 if (!facep->getDrawable())
00387                 {
00388                         return;
00389                 }
00390                 avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get();
00391         }
00392 
00393     if (avatarp->isDead() || avatarp->mDrawable.isNull())
00394         {
00395                 return;
00396         }
00397 
00398         if (!avatarp->isFullyLoaded())
00399         {
00400                 
00401                 /* // debug code to draw a cube in place of avatar
00402                 LLGLSNoTexture gls_no_texture;
00403                 LLVector3 pos = avatarp->getPositionAgent();
00404 
00405                 gGL.color4f(1.0f, 0.0f, 0.0f, 0.8f);
00406                 gGL.begin(GL_LINES);
00407                 {
00408                         gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
00409                         gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
00410                         gGL.vertex3fv((pos - LLVector3(0.f, 0.2f, 0.f)).mV);
00411                         gGL.vertex3fv((pos + LLVector3(0.f, 0.2f, 0.f)).mV);
00412                         gGL.vertex3fv((pos - LLVector3(0.f, 0.f, 0.2f)).mV);
00413                         gGL.vertex3fv((pos + LLVector3(0.f, 0.f, 0.2f)).mV);
00414                 }
00415                 gGL.end();
00416                 */
00417 
00418                 
00419                 // don't render please
00420                 return;
00421         }
00422 
00423         BOOL impostor = avatarp->isImpostor() && !single_avatar;
00424 
00425         if (impostor && pass != 0)
00426         { //don't draw anything but the impostor for impostored avatars
00427                 return;
00428         }
00429         
00430         if (pass == 0 && !impostor && LLPipeline::sUnderWaterRender)
00431         { //don't draw foot shadows under water
00432                 return;
00433         }
00434 
00435     LLOverrideFaceColor color(this, 1.0f, 1.0f, 1.0f, 1.0f);
00436 
00437         if (pass == 0)
00438         {
00439                 if (!LLPipeline::sReflectionRender)
00440                 {
00441                         LLVOAvatar::sNumVisibleAvatars++;
00442                 }
00443 
00444                 if (impostor)
00445                 {
00446                         avatarp->renderImpostor();
00447                 }
00448                 else if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FOOT_SHADOWS))
00449                 {
00450                         avatarp->renderFootShadows();   
00451                 }
00452                 return;
00453         }
00454 
00455         if (single_avatar && avatarp->mSpecialRenderMode >= 2) // 2=image preview,  3=morph view
00456         {
00457                 gPipeline.enableLightsAvatarEdit(LLColor4(.5f, .5f, .5f, 1.f));
00458         }
00459         
00460         if (pass == 1)
00461         {
00462                 // render rigid meshes (eyeballs) first
00463                 avatarp->renderRigid();
00464                 return;
00465         }
00466         
00467         if (sShaderLevel > 0)
00468         {
00469                 gAvatarMatrixParam = sVertexProgram->mUniform[LLShaderMgr::AVATAR_MATRIX];
00470         }
00471     
00472         if ((sShaderLevel >= SHADER_LEVEL_CLOTH))
00473         {
00474                 LLMatrix4 rot_mat;
00475                 LLViewerCamera::getInstance()->getMatrixToLocal(rot_mat);
00476                 LLMatrix4 cfr(OGL_TO_CFR_ROTATION);
00477                 rot_mat *= cfr;
00478                 
00479                 LLVector4 wind;
00480                 wind.setVec(avatarp->mWindVec);
00481                 wind.mV[VW] = 0;
00482                 wind = wind * rot_mat;
00483                 wind.mV[VW] = avatarp->mWindVec.mV[VW];
00484 
00485                 sVertexProgram->vertexAttrib4fv(LLShaderMgr::AVATAR_WIND, wind.mV);
00486                 F32 phase = -1.f * (avatarp->mRipplePhase);
00487 
00488                 F32 freq = 7.f + (noise1(avatarp->mRipplePhase) * 2.f);
00489                 LLVector4 sin_params(freq, freq, freq, phase);
00490                 sVertexProgram->vertexAttrib4fv(LLShaderMgr::AVATAR_SINWAVE, sin_params.mV);
00491 
00492                 LLVector4 gravity(0.f, 0.f, -CLOTHING_GRAVITY_EFFECT, 0.f);
00493                 gravity = gravity * rot_mat;
00494                 sVertexProgram->vertexAttrib4fv(LLShaderMgr::AVATAR_GRAVITY, gravity.mV);
00495         }
00496 
00497         if( !single_avatar || (avatarp == single_avatar) )
00498         {
00499                 if (LLVOAvatar::sShowCollisionVolumes)
00500                 {
00501                         LLGLSNoTexture no_texture;
00502                         avatarp->renderCollisionVolumes();
00503                 }
00504 
00505                 if (avatarp->mIsSelf && LLAgent::sDebugDisplayTarget)
00506                 {
00507                         LLGLSNoTexture gls_no_texture;
00508                         LLVector3 pos = avatarp->getPositionAgent();
00509 
00510                         gGL.color4f(1.0f, 0.0f, 0.0f, 0.8f);
00511                         gGL.begin(LLVertexBuffer::LINES);
00512                         {
00513                                 gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
00514                                 gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
00515                                 gGL.vertex3fv((pos - LLVector3(0.f, 0.2f, 0.f)).mV);
00516                                 gGL.vertex3fv((pos + LLVector3(0.f, 0.2f, 0.f)).mV);
00517                                 gGL.vertex3fv((pos - LLVector3(0.f, 0.f, 0.2f)).mV);
00518                                 gGL.vertex3fv((pos + LLVector3(0.f, 0.f, 0.2f)).mV);
00519                         }gGL.end();
00520 
00521                         pos = avatarp->mDrawable->getPositionAgent();
00522                         gGL.color4f(1.0f, 0.0f, 0.0f, 0.8f);
00523                         gGL.begin(LLVertexBuffer::LINES);
00524                         {
00525                                 gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
00526                                 gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
00527                                 gGL.vertex3fv((pos - LLVector3(0.f, 0.2f, 0.f)).mV);
00528                                 gGL.vertex3fv((pos + LLVector3(0.f, 0.2f, 0.f)).mV);
00529                                 gGL.vertex3fv((pos - LLVector3(0.f, 0.f, 0.2f)).mV);
00530                                 gGL.vertex3fv((pos + LLVector3(0.f, 0.f, 0.2f)).mV);
00531                         }gGL.end();
00532 
00533                         pos = avatarp->mRoot.getWorldPosition();
00534                         gGL.color4f(1.0f, 1.0f, 1.0f, 0.8f);
00535                         gGL.begin(LLVertexBuffer::LINES);
00536                         {
00537                                 gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
00538                                 gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
00539                                 gGL.vertex3fv((pos - LLVector3(0.f, 0.2f, 0.f)).mV);
00540                                 gGL.vertex3fv((pos + LLVector3(0.f, 0.2f, 0.f)).mV);
00541                                 gGL.vertex3fv((pos - LLVector3(0.f, 0.f, 0.2f)).mV);
00542                                 gGL.vertex3fv((pos + LLVector3(0.f, 0.f, 0.2f)).mV);
00543                         }gGL.end();
00544 
00545                         pos = avatarp->mPelvisp->getWorldPosition();
00546                         gGL.color4f(0.0f, 0.0f, 1.0f, 0.8f);
00547                         gGL.begin(LLVertexBuffer::LINES);
00548                         {
00549                                 gGL.vertex3fv((pos - LLVector3(0.2f, 0.f, 0.f)).mV);
00550                                 gGL.vertex3fv((pos + LLVector3(0.2f, 0.f, 0.f)).mV);
00551                                 gGL.vertex3fv((pos - LLVector3(0.f, 0.2f, 0.f)).mV);
00552                                 gGL.vertex3fv((pos + LLVector3(0.f, 0.2f, 0.f)).mV);
00553                                 gGL.vertex3fv((pos - LLVector3(0.f, 0.f, 0.2f)).mV);
00554                                 gGL.vertex3fv((pos + LLVector3(0.f, 0.f, 0.2f)).mV);
00555                         }gGL.end();     
00556 
00557                         color.setColor(1.0f, 1.0f, 1.0f, 1.0f);
00558                 }
00559 
00560                 avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
00561         }
00562 }
00563 
00564 //-----------------------------------------------------------------------------
00565 // renderForSelect()
00566 //-----------------------------------------------------------------------------
00567 void LLDrawPoolAvatar::renderForSelect()
00568 {
00569         if (gUseGLPick)
00570         {
00571                 return;
00572         }
00573         
00574         if (!gRenderAvatar)
00575         {
00576                 return;
00577         }
00578 
00579         if (mDrawFace.empty())
00580         {
00581                 return;
00582         }
00583 
00584         const LLFace *facep = mDrawFace[0];
00585         if (!facep->getDrawable())
00586         {
00587                 return;
00588         }
00589         LLVOAvatar *avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get();
00590 
00591         if (avatarp->isDead() || avatarp->mIsDummy || avatarp->mDrawable.isNull())
00592         {
00593                 return;
00594         }
00595 
00596         S32 name = avatarp->mDrawable->getVObj()->mGLName;
00597         LLColor4U color((U8)(name >> 16), (U8)(name >> 8), (U8)name);
00598 
00599         BOOL impostor = avatarp->isImpostor();
00600         if (impostor)
00601         {
00602                 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,          GL_COMBINE_ARB);
00603                 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB,           GL_REPLACE);
00604                 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB,         GL_MODULATE);
00605 
00606                 glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB,           GL_PRIMARY_COLOR);
00607                 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB,          GL_SRC_COLOR);
00608 
00609                 glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB,         GL_TEXTURE);
00610                 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB,        GL_SRC_ALPHA);
00611 
00612                 glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_ARB,         GL_PRIMARY_COLOR_ARB);
00613                 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_ARB,        GL_SRC_ALPHA);
00614 
00615                 avatarp->renderImpostor(color);
00616 
00617                 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
00618                 return;
00619         }
00620 
00621         sVertexProgram = &gAvatarPickProgram;
00622         if (sShaderLevel > 0)
00623         {
00624                 gAvatarMatrixParam = sVertexProgram->mUniform[LLShaderMgr::AVATAR_MATRIX];
00625         }
00626         glAlphaFunc(GL_GEQUAL, 0.2f);
00627         gGL.blendFunc(GL_ONE, GL_ZERO);
00628 
00629         glColor4ubv(color.mV);
00630 
00631         if ((sShaderLevel > 0) && !gUseGLPick)  // for hardware blending
00632         {
00633                 sRenderingSkinned = TRUE;
00634                 sVertexProgram->bind();
00635                 enable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]);
00636         }
00637         
00638         avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
00639 
00640         // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
00641         if ((sShaderLevel > 0) && !gUseGLPick)
00642         {
00643                 sRenderingSkinned = FALSE;
00644                 sVertexProgram->unbind();
00645                 disable_vertex_weighting(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT]);
00646         }
00647 
00648         glAlphaFunc(GL_GREATER, 0.01f);
00649         gGL.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00650 
00651         // restore texture mode
00652         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
00653 }
00654 
00655 //-----------------------------------------------------------------------------
00656 // getDebugTexture()
00657 //-----------------------------------------------------------------------------
00658 LLViewerImage *LLDrawPoolAvatar::getDebugTexture()
00659 {
00660         if (mReferences.empty())
00661         {
00662                 return NULL;
00663         }
00664         LLFace *face = mReferences[0];
00665         if (!face->getDrawable())
00666         {
00667                 return NULL;
00668         }
00669         const LLViewerObject *objectp = face->getDrawable()->getVObj();
00670 
00671         // Avatar should always have at least 1 (maybe 3?) TE's.
00672         return objectp->getTEImage(0);
00673 }
00674 
00675 
00676 LLColor3 LLDrawPoolAvatar::getDebugColor() const
00677 {
00678         return LLColor3(0.f, 1.f, 0.f);
00679 }
00680 
00681 LLVertexBufferAvatar::LLVertexBufferAvatar()
00682 : LLVertexBuffer(sDataMask, 
00683         LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR) > 0 ?     
00684         GL_STATIC_DRAW_ARB : 
00685         GL_STREAM_DRAW_ARB)
00686 {
00687 
00688 }
00689 
00690 
00691 void LLVertexBufferAvatar::setupVertexBuffer(U32 data_mask) const
00692 {
00693         if (sRenderingSkinned)
00694         {
00695                 U8* base = useVBOs() ? NULL : mMappedData;
00696 
00697                 glVertexPointer(3,GL_FLOAT, mStride, (void*)(base + 0));
00698                 glNormalPointer(GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_NORMAL]));
00699         
00700                 glClientActiveTextureARB(GL_TEXTURE1_ARB);
00701                 glTexCoordPointer(2,GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_TEXCOORD2]));
00702                 glClientActiveTextureARB(GL_TEXTURE0_ARB);
00703                 glTexCoordPointer(2,GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_TEXCOORD]));
00704                 
00705                 set_vertex_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_WEIGHT], mStride, (F32*)(base + mOffsets[TYPE_WEIGHT]));
00706 
00707                 if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_BUMP)
00708                 {
00709                         set_binormals(sVertexProgram->mAttribute[LLShaderMgr::BINORMAL], mStride, (LLVector3*)(base + mOffsets[TYPE_BINORMAL]));
00710                 }
00711         
00712                 if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH)
00713                 {
00714                         set_vertex_clothing_weights(sVertexProgram->mAttribute[LLShaderMgr::AVATAR_CLOTHING], mStride, (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
00715                 }
00716         }
00717         else
00718         {
00719                 LLVertexBuffer::setupVertexBuffer(data_mask);
00720         }
00721 }
00722 

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