llviewerjoint.cpp

Go to the documentation of this file.
00001 
00032 //-----------------------------------------------------------------------------
00033 // Header Files
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 // Static Data
00053 //-----------------------------------------------------------------------------
00054 BOOL                                    LLViewerJoint::sDisableLOD = FALSE;
00055 
00056 //-----------------------------------------------------------------------------
00057 // LLViewerJoint()
00058 // Class Constructor
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 // LLViewerJoint()
00073 // Class Constructor
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 // ~LLViewerJoint()
00087 // Class Destructor
00088 //-----------------------------------------------------------------------------
00089 LLViewerJoint::~LLViewerJoint()
00090 {
00091 }
00092 
00093 
00094 //--------------------------------------------------------------------
00095 // setValid()
00096 //--------------------------------------------------------------------
00097 void LLViewerJoint::setValid( BOOL valid, BOOL recursive )
00098 {
00099         //----------------------------------------------------------------
00100         // set visibility for this joint
00101         //----------------------------------------------------------------
00102         mValid = valid;
00103         
00104         //----------------------------------------------------------------
00105         // set visibility for children
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 // renderSkeleton()
00121 //--------------------------------------------------------------------
00122 void LLViewerJoint::renderSkeleton(BOOL recursive)
00123 {
00124         F32 nc = 0.57735f;
00125 
00126         //----------------------------------------------------------------
00127         // push matrix stack
00128         //----------------------------------------------------------------
00129         glPushMatrix();
00130 
00131         //----------------------------------------------------------------
00132         // render the bone to my parent
00133         //----------------------------------------------------------------
00134         if (mComponents & SC_BONE)
00135         {
00136                 drawBone();
00137         }
00138 
00139         //----------------------------------------------------------------
00140         // offset to joint position and 
00141         // rotate to our orientation
00142         //----------------------------------------------------------------
00143         glLoadIdentity();
00144         glMultMatrixf( &getWorldMatrix().mMatrix[0][0] );
00145 
00146         //----------------------------------------------------------------
00147         // render joint axes
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         // render the joint graphic
00168         //----------------------------------------------------------------
00169         if (mComponents & SC_JOINT)
00170         {
00171                 gGL.color3f( 1.0f, 1.0f, 0.0f );
00172 
00173                 gGL.begin(LLVertexBuffer::TRIANGLES);
00174 
00175                 // joint top half
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                 // joint bottom half
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         // render children
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         // pop matrix stack
00235         //----------------------------------------------------------------
00236         glPopMatrix();
00237 }
00238 
00239 
00240 //--------------------------------------------------------------------
00241 // render()
00242 //--------------------------------------------------------------------
00243 U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass )
00244 {
00245         U32 triangle_count = 0;
00246 
00247         //----------------------------------------------------------------
00248         // ignore invisible objects
00249         //----------------------------------------------------------------
00250         if ( mValid )
00251         {
00252 
00253 
00254                 //----------------------------------------------------------------
00255                 // if object is transparent, defer it, otherwise
00256                 // give the joint subclass a chance to draw itself
00257                 //----------------------------------------------------------------
00258                 if ( gRenderForSelect )
00259                 {
00260                         triangle_count += drawShape( pixelArea, first_pass );
00261                 }
00262                 else if ( isTransparent() && !LLPipeline::sReflectionRender)
00263                 {
00264                         // Hair and Skirt
00265                         if ((pixelArea > MIN_PIXEL_AREA_3PASS_HAIR))
00266                         {
00267                                 // render all three passes
00268                                 LLGLDisable cull(GL_CULL_FACE);
00269                                 // first pass renders without writing to the z buffer
00270                                 {
00271                                         LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
00272                                         triangle_count += drawShape( pixelArea, first_pass);
00273                                 }
00274                                 // second pass writes to z buffer only
00275                                 glColorMask(FALSE, FALSE, FALSE, FALSE);
00276                                 {
00277                                         triangle_count += drawShape( pixelArea, FALSE );
00278                                 }
00279                                 // third past respects z buffer and writes color
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                                 // Render Inside (no Z buffer write)
00289                                 glCullFace(GL_FRONT);
00290                                 {
00291                                         LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
00292                                         triangle_count += drawShape( pixelArea, first_pass );
00293                                 }
00294                                 // Render Outside (write to the Z buffer)
00295                                 glCullFace(GL_BACK);
00296                                 {
00297                                         triangle_count += drawShape( pixelArea, FALSE );
00298                                 }
00299                         }
00300                 }
00301                 else
00302                 {
00303                         // set up render state
00304                         triangle_count += drawShape( pixelArea, first_pass );
00305                 }
00306         }
00307 
00308         //----------------------------------------------------------------
00309         // render children
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 // drawBone()
00333 //--------------------------------------------------------------------
00334 void LLViewerJoint::drawBone()
00335 {
00336         if ( mParent == NULL )
00337                 return;
00338 
00339         F32 boneSize = 0.02f;
00340 
00341         // rotate to point to child (bone direction)
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         // render the bone
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         // restore matrix
00384         glPopMatrix();
00385 }
00386 
00387 //--------------------------------------------------------------------
00388 // isTransparent()
00389 //--------------------------------------------------------------------
00390 BOOL LLViewerJoint::isTransparent()
00391 {
00392         return FALSE;
00393 }
00394 
00395 //--------------------------------------------------------------------
00396 // drawShape()
00397 //--------------------------------------------------------------------
00398 U32 LLViewerJoint::drawShape( F32 pixelArea, BOOL first_pass )
00399 {
00400         return 0;
00401 }
00402 
00403 //--------------------------------------------------------------------
00404 // setSkeletonComponents()
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                         // we've already found a joint to enable, so enable the rest as alternatives
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 // LLViewerJointCollisionVolume()
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 // End

Generated on Fri May 16 08:34:10 2008 for SecondLife by  doxygen 1.5.5