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
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
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
00093
00094 }
00095
00096
00097
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
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
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);
00152 }
00153
00154 void LLDrawPoolAvatar::beginRenderPass(S32 pass)
00155 {
00156
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
00210
00211
00212
00213
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)
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
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 {
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)
00345 {
00346 gPipeline.enableLightsAvatar(avatarp->mDrawable->getSunShadowFactor());
00347 }
00348 else if (avatarp->mSpecialRenderMode == 1)
00349 {
00350 gPipeline.enableLightsAvatarEdit(LLColor4(0.7f, 0.6f, 0.3f, 1.f));
00351 }
00352 else
00353 {
00354 gPipeline.enableLightsAvatarEdit(LLColor4(.5f, .5f, .5f, 1.f));
00355 }
00356
00357 if (pass == 1)
00358 {
00359
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);
00376 avatarp->mRoot.updateWorldMatrixChildren();
00377
00378 mIndicesDrawn += avatarp->renderRigid();
00379 }
00380 avatarp->mRoot.setPosition(orig_pos_root);
00381 avatarp->mRoot.updateWorldMatrixChildren();
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);
00496 avatarp->mRoot.updateWorldMatrixChildren();
00497
00498 mIndicesDrawn += avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
00499 }
00500 avatarp->mRoot.setPosition(orig_pos_root);
00501 avatarp->mRoot.updateWorldMatrixChildren();
00502 }
00503 }
00504 }
00505
00506
00507
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
00554
00555
00556 if ((sShaderLevel > 0) && !gUseGLPick)
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
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
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
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
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