lldrawpoolavatar.cpp

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

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