00001
00032
00033
00034
00035 #include "llviewerprecompiledheaders.h"
00036
00037 #include "llviewerjoint.h"
00038
00039 #include "llgl.h"
00040 #include "llglimmediate.h"
00041 #include "llmath.h"
00042 #include "llglheaders.h"
00043 #include "llrendersphere.h"
00044 #include "llvoavatar.h"
00045 #include "pipeline.h"
00046
00047 #define DEFAULT_LOD 0.0f
00048
00049 const S32 MIN_PIXEL_AREA_3PASS_HAIR = 64*64;
00050
00051
00052
00053
00054 BOOL LLViewerJoint::sDisableLOD = FALSE;
00055
00056
00057
00058
00059
00060 LLViewerJoint::LLViewerJoint()
00061 {
00062 mUpdateXform = TRUE;
00063 mValid = FALSE;
00064 mComponents = SC_JOINT | SC_BONE | SC_AXES;
00065 mMinPixelArea = DEFAULT_LOD;
00066 mPickName = PN_DEFAULT;
00067 mVisible = TRUE;
00068 }
00069
00070
00071
00072
00073
00074
00075 LLViewerJoint::LLViewerJoint(const std::string &name, LLJoint *parent) :
00076 LLJoint(name, parent)
00077 {
00078 mValid = FALSE;
00079 mComponents = SC_JOINT | SC_BONE | SC_AXES;
00080 mMinPixelArea = DEFAULT_LOD;
00081 mPickName = PN_DEFAULT;
00082 }
00083
00084
00085
00086
00087
00088
00089 LLViewerJoint::~LLViewerJoint()
00090 {
00091 }
00092
00093
00094
00095
00096
00097 void LLViewerJoint::setValid( BOOL valid, BOOL recursive )
00098 {
00099
00100
00101
00102 mValid = valid;
00103
00104
00105
00106
00107 if (recursive)
00108 {
00109 for (child_list_t::iterator iter = mChildren.begin();
00110 iter != mChildren.end(); ++iter)
00111 {
00112 LLViewerJoint* joint = (LLViewerJoint*)(*iter);
00113 joint->setValid(valid, TRUE);
00114 }
00115 }
00116
00117 }
00118
00119
00120
00121
00122 void LLViewerJoint::renderSkeleton(BOOL recursive)
00123 {
00124 F32 nc = 0.57735f;
00125
00126
00127
00128
00129 glPushMatrix();
00130
00131
00132
00133
00134 if (mComponents & SC_BONE)
00135 {
00136 drawBone();
00137 }
00138
00139
00140
00141
00142
00143 glLoadIdentity();
00144 glMultMatrixf( &getWorldMatrix().mMatrix[0][0] );
00145
00146
00147
00148
00149 if (mComponents & SC_AXES)
00150 {
00151 gGL.begin(LLVertexBuffer::LINES);
00152 gGL.color3f( 1.0f, 0.0f, 0.0f );
00153 gGL.vertex3f( 0.0f, 0.0f, 0.0f );
00154 gGL.vertex3f( 0.1f, 0.0f, 0.0f );
00155
00156 gGL.color3f( 0.0f, 1.0f, 0.0f );
00157 gGL.vertex3f( 0.0f, 0.0f, 0.0f );
00158 gGL.vertex3f( 0.0f, 0.1f, 0.0f );
00159
00160 gGL.color3f( 0.0f, 0.0f, 1.0f );
00161 gGL.vertex3f( 0.0f, 0.0f, 0.0f );
00162 gGL.vertex3f( 0.0f, 0.0f, 0.1f );
00163 gGL.end();
00164 }
00165
00166
00167
00168
00169 if (mComponents & SC_JOINT)
00170 {
00171 gGL.color3f( 1.0f, 1.0f, 0.0f );
00172
00173 gGL.begin(LLVertexBuffer::TRIANGLES);
00174
00175
00176 glNormal3f(nc, nc, nc);
00177 gGL.vertex3f(0.0f, 0.0f, 0.05f);
00178 gGL.vertex3f(0.05f, 0.0f, 0.0f);
00179 gGL.vertex3f(0.0f, 0.05f, 0.0f);
00180
00181 glNormal3f(-nc, nc, nc);
00182 gGL.vertex3f(0.0f, 0.0f, 0.05f);
00183 gGL.vertex3f(0.0f, 0.05f, 0.0f);
00184 gGL.vertex3f(-0.05f, 0.0f, 0.0f);
00185
00186 glNormal3f(-nc, -nc, nc);
00187 gGL.vertex3f(0.0f, 0.0f, 0.05f);
00188 gGL.vertex3f(-0.05f, 0.0f, 0.0f);
00189 gGL.vertex3f(0.0f, -0.05f, 0.0f);
00190
00191 glNormal3f(nc, -nc, nc);
00192 gGL.vertex3f(0.0f, 0.0f, 0.05f);
00193 gGL.vertex3f(0.0f, -0.05f, 0.0f);
00194 gGL.vertex3f(0.05f, 0.0f, 0.0f);
00195
00196
00197 glNormal3f(nc, nc, -nc);
00198 gGL.vertex3f(0.0f, 0.0f, -0.05f);
00199 gGL.vertex3f(0.0f, 0.05f, 0.0f);
00200 gGL.vertex3f(0.05f, 0.0f, 0.0f);
00201
00202 glNormal3f(-nc, nc, -nc);
00203 gGL.vertex3f(0.0f, 0.0f, -0.05f);
00204 gGL.vertex3f(-0.05f, 0.0f, 0.0f);
00205 gGL.vertex3f(0.0f, 0.05f, 0.0f);
00206
00207 glNormal3f(-nc, -nc, -nc);
00208 gGL.vertex3f(0.0f, 0.0f, -0.05f);
00209 gGL.vertex3f(0.0f, -0.05f, 0.0f);
00210 gGL.vertex3f(-0.05f, 0.0f, 0.0f);
00211
00212 glNormal3f(nc, -nc, -nc);
00213 gGL.vertex3f(0.0f, 0.0f, -0.05f);
00214 gGL.vertex3f(0.05f, 0.0f, 0.0f);
00215 gGL.vertex3f(0.0f, -0.05f, 0.0f);
00216
00217 gGL.end();
00218 }
00219
00220
00221
00222
00223 if (recursive)
00224 {
00225 for (child_list_t::iterator iter = mChildren.begin();
00226 iter != mChildren.end(); ++iter)
00227 {
00228 LLViewerJoint* joint = (LLViewerJoint*)(*iter);
00229 joint->renderSkeleton();
00230 }
00231 }
00232
00233
00234
00235
00236 glPopMatrix();
00237 }
00238
00239
00240
00241
00242
00243 U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass )
00244 {
00245 U32 triangle_count = 0;
00246
00247
00248
00249
00250 if ( mValid )
00251 {
00252
00253
00254
00255
00256
00257
00258 if ( gRenderForSelect )
00259 {
00260 triangle_count += drawShape( pixelArea, first_pass );
00261 }
00262 else if ( isTransparent() && !LLPipeline::sReflectionRender)
00263 {
00264
00265 if ((pixelArea > MIN_PIXEL_AREA_3PASS_HAIR))
00266 {
00267
00268 LLGLDisable cull(GL_CULL_FACE);
00269
00270 {
00271 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
00272 triangle_count += drawShape( pixelArea, first_pass);
00273 }
00274
00275 glColorMask(FALSE, FALSE, FALSE, FALSE);
00276 {
00277 triangle_count += drawShape( pixelArea, FALSE );
00278 }
00279
00280 glColorMask(TRUE, TRUE, TRUE, FALSE);
00281 {
00282 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
00283 triangle_count += drawShape( pixelArea, FALSE );
00284 }
00285 }
00286 else
00287 {
00288
00289 glCullFace(GL_FRONT);
00290 {
00291 LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
00292 triangle_count += drawShape( pixelArea, first_pass );
00293 }
00294
00295 glCullFace(GL_BACK);
00296 {
00297 triangle_count += drawShape( pixelArea, FALSE );
00298 }
00299 }
00300 }
00301 else
00302 {
00303
00304 triangle_count += drawShape( pixelArea, first_pass );
00305 }
00306 }
00307
00308
00309
00310
00311 for (child_list_t::iterator iter = mChildren.begin();
00312 iter != mChildren.end(); ++iter)
00313 {
00314 LLViewerJoint* joint = (LLViewerJoint*)(*iter);
00315 F32 jointLOD = joint->getLOD();
00316 if (pixelArea >= jointLOD || sDisableLOD)
00317 {
00318 triangle_count += joint->render( pixelArea );
00319
00320 if (jointLOD != DEFAULT_LOD)
00321 {
00322 break;
00323 }
00324 }
00325 }
00326
00327 return triangle_count;
00328 }
00329
00330
00331
00332
00333
00334 void LLViewerJoint::drawBone()
00335 {
00336 if ( mParent == NULL )
00337 return;
00338
00339 F32 boneSize = 0.02f;
00340
00341
00342 glPushMatrix();
00343
00344 LLVector3 boneX = getPosition();
00345 F32 length = boneX.normVec();
00346
00347 LLVector3 boneZ(1.0f, 0.0f, 1.0f);
00348
00349 LLVector3 boneY = boneZ % boneX;
00350 boneY.normVec();
00351
00352 boneZ = boneX % boneY;
00353
00354 LLMatrix4 rotateMat;
00355 rotateMat.setFwdRow( boneX );
00356 rotateMat.setLeftRow( boneY );
00357 rotateMat.setUpRow( boneZ );
00358 glMultMatrixf( &rotateMat.mMatrix[0][0] );
00359
00360
00361 gGL.color3f( 0.5f, 0.5f, 0.0f );
00362
00363 gGL.begin(LLVertexBuffer::TRIANGLES);
00364
00365 gGL.vertex3f( length, 0.0f, 0.0f);
00366 gGL.vertex3f( 0.0f, boneSize, 0.0f);
00367 gGL.vertex3f( 0.0f, 0.0f, boneSize);
00368
00369 gGL.vertex3f( length, 0.0f, 0.0f);
00370 gGL.vertex3f( 0.0f, 0.0f, -boneSize);
00371 gGL.vertex3f( 0.0f, boneSize, 0.0f);
00372
00373 gGL.vertex3f( length, 0.0f, 0.0f);
00374 gGL.vertex3f( 0.0f, -boneSize, 0.0f);
00375 gGL.vertex3f( 0.0f, 0.0f, -boneSize);
00376
00377 gGL.vertex3f( length, 0.0f, 0.0f);
00378 gGL.vertex3f( 0.0f, 0.0f, boneSize);
00379 gGL.vertex3f( 0.0f, -boneSize, 0.0f);
00380
00381 gGL.end();
00382
00383
00384 glPopMatrix();
00385 }
00386
00387
00388
00389
00390 BOOL LLViewerJoint::isTransparent()
00391 {
00392 return FALSE;
00393 }
00394
00395
00396
00397
00398 U32 LLViewerJoint::drawShape( F32 pixelArea, BOOL first_pass )
00399 {
00400 return 0;
00401 }
00402
00403
00404
00405
00406 void LLViewerJoint::setSkeletonComponents( U32 comp, BOOL recursive )
00407 {
00408 mComponents = comp;
00409 if (recursive)
00410 {
00411 for (child_list_t::iterator iter = mChildren.begin();
00412 iter != mChildren.end(); ++iter)
00413 {
00414 LLViewerJoint* joint = (LLViewerJoint*)(*iter);
00415 joint->setSkeletonComponents(comp, recursive);
00416 }
00417 }
00418 }
00419
00420 void LLViewerJoint::updateFaceSizes(U32 &num_vertices, U32& num_indices, F32 pixel_area)
00421 {
00422 for (child_list_t::iterator iter = mChildren.begin();
00423 iter != mChildren.end(); ++iter)
00424 {
00425 LLViewerJoint* joint = (LLViewerJoint*)(*iter);
00426 joint->updateFaceSizes(num_vertices, num_indices, pixel_area);
00427 }
00428 }
00429
00430 void LLViewerJoint::updateFaceData(LLFace *face, F32 pixel_area, BOOL damp_wind)
00431 {
00432 for (child_list_t::iterator iter = mChildren.begin();
00433 iter != mChildren.end(); ++iter)
00434 {
00435 LLViewerJoint* joint = (LLViewerJoint*)(*iter);
00436 joint->updateFaceData(face, pixel_area, damp_wind);
00437 }
00438 }
00439
00440 void LLViewerJoint::updateGeometry()
00441 {
00442 for (child_list_t::iterator iter = mChildren.begin();
00443 iter != mChildren.end(); ++iter)
00444 {
00445 LLViewerJoint* joint = (LLViewerJoint*)(*iter);
00446 joint->updateGeometry();
00447 }
00448 }
00449
00450
00451 BOOL LLViewerJoint::updateLOD(F32 pixel_area, BOOL activate)
00452 {
00453 BOOL lod_changed = FALSE;
00454 BOOL found_lod = FALSE;
00455
00456 for (child_list_t::iterator iter = mChildren.begin();
00457 iter != mChildren.end(); ++iter)
00458 {
00459 LLViewerJoint* joint = (LLViewerJoint*)(*iter);
00460 F32 jointLOD = joint->getLOD();
00461
00462 if (found_lod || jointLOD == DEFAULT_LOD)
00463 {
00464
00465 lod_changed |= joint->updateLOD(pixel_area, TRUE);
00466 }
00467 else
00468 {
00469 if (pixel_area >= jointLOD || sDisableLOD)
00470 {
00471 lod_changed |= joint->updateLOD(pixel_area, TRUE);
00472 found_lod = TRUE;
00473 }
00474 else
00475 {
00476 lod_changed |= joint->updateLOD(pixel_area, FALSE);
00477 }
00478 }
00479 }
00480 return lod_changed;
00481 }
00482
00483 void LLViewerJoint::dump()
00484 {
00485 for (child_list_t::iterator iter = mChildren.begin();
00486 iter != mChildren.end(); ++iter)
00487 {
00488 LLViewerJoint* joint = (LLViewerJoint*)(*iter);
00489 joint->dump();
00490 }
00491 }
00492
00493 void LLViewerJoint::setVisible(BOOL visible, BOOL recursive)
00494 {
00495 mVisible = visible;
00496
00497 if (recursive)
00498 {
00499 for (child_list_t::iterator iter = mChildren.begin();
00500 iter != mChildren.end(); ++iter)
00501 {
00502 LLViewerJoint* joint = (LLViewerJoint*)(*iter);
00503 joint->setVisible(visible, recursive);
00504 }
00505 }
00506 }
00507
00508
00509
00510
00511
00512 LLViewerJointCollisionVolume::LLViewerJointCollisionVolume()
00513 {
00514 mUpdateXform = FALSE;
00515 }
00516
00517 LLViewerJointCollisionVolume::LLViewerJointCollisionVolume(const std::string &name, LLJoint *parent) : LLViewerJoint(name, parent)
00518 {
00519
00520 }
00521
00522 void LLViewerJointCollisionVolume::renderCollision()
00523 {
00524 updateWorldMatrix();
00525 glMatrixMode(GL_MODELVIEW);
00526 glPushMatrix();
00527 glMultMatrixf( &mXform.getWorldMatrix().mMatrix[0][0] );
00528
00529 glColor3f( 0.f, 0.f, 1.f );
00530 gSphere.render();
00531
00532 glPopMatrix();
00533 }
00534
00535 LLVector3 LLViewerJointCollisionVolume::getVolumePos(LLVector3 &offset)
00536 {
00537 mUpdateXform = TRUE;
00538
00539 LLVector3 result = offset;
00540 result.scaleVec(getScale());
00541 result.rotVec(getWorldRotation());
00542 result += getWorldPosition();
00543
00544 return result;
00545 }
00546
00547