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
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
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
00094
00095 }
00096
00097
00098
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
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
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);
00159 }
00160
00161 void LLDrawPoolAvatar::beginRenderPass(S32 pass)
00162 {
00163 LLFastTimer t(LLFastTimer::FTM_RENDER_CHARACTERS);
00164
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 {
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)
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
00309
00310 sVertexProgram->bind();
00311 }
00312 }
00313 }
00314
00315 void LLDrawPoolAvatar::endSkinned()
00316 {
00317
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
00341
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 {
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
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420 return;
00421 }
00422
00423 BOOL impostor = avatarp->isImpostor() && !single_avatar;
00424
00425 if (impostor && pass != 0)
00426 {
00427 return;
00428 }
00429
00430 if (pass == 0 && !impostor && LLPipeline::sUnderWaterRender)
00431 {
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)
00456 {
00457 gPipeline.enableLightsAvatarEdit(LLColor4(.5f, .5f, .5f, 1.f));
00458 }
00459
00460 if (pass == 1)
00461 {
00462
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
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)
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
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
00652 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
00653 }
00654
00655
00656
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
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