llcape.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 #include "llcape.h"
00035 
00036 #include "llglheaders.h"
00037 #include "llsphere.h"
00038 #include "llrand.h"
00039 #include "llvoavatar.h"
00040 #include "llagent.h"
00041 #include "llviewerobject.h"
00042 #include "llimagegl.h"
00043 #include "llviewerimagelist.h"
00044 #include "llviewercontrol.h"
00045 #include "llflexibleobject.h"
00046 
00047 const int _X_                   = 0;
00048 const int _Y_                   = 1;
00049 const int _Z_                   = 2;
00050 const F32 ONE_HALF              = 0.5f;
00051 const F32 STRAND_VISUALIZATION_ANCHOR_BALL_RADIUS = 0.01f;
00052 
00053 //-----------------------------------------------
00054 // constructor
00055 //-----------------------------------------------
00056 LLVOCloth::LLVOCloth(const LLUUID &id, const LLPCode type, LLViewerRegion *regionp)
00057         : LLViewerObject(id, type, regionp)
00058 {
00059         mAttributes.mTextureFileName                                            = CLOTH_DEFAULT_TEXTURE_FILENAME;
00060         mAttributes.mTextureIndex                                                       = CLOTH_DEFAULT_TEXTURE_INDEX;
00061         mAttributes.mNumStrands                                                         = CLOTH_DEFAULT_NUM_STRANDS;
00062         mAttributes.mNumSegments                                                        = CLOTH_DEFAULT_NUM_SEGMENTS;
00063         mAttributes.mVisualizeStrands                                           = CLOTH_DEFAULT_VISUALIZE_STRANDS;
00064         mAttributes.mVisualizeAvCollisionSphere                         = CLOTH_DEFAULT_VISUALIZE_COLLISION_SPHERE;
00065         mAttributes.mWidth                                                                      = CLOTH_DEFAULT_WIDTH;
00066         mAttributes.mLength                                                                     = CLOTH_DEFAULT_LENGTH;
00067         mAttributes.mPitch                                                                      = CLOTH_DEFAULT_PITCH;
00068         mAttributes.mGravity                                                            = CLOTH_DEFAULT_GRAVITY;
00069         mAttributes.mTension                                                            = CLOTH_DEFAULT_TENSION;
00070         mAttributes.mAirFriction                                                        = CLOTH_DEFAULT_AIR_FRICTION;
00071         mAttributes.mWindSensitivity                                            = CLOTH_DEFAULT_WIND_SENSITIVITY;
00072         mAttributes.mCircleWrapAmount                                           = CLOTH_DEFAULT_CIRCLE_WRAP_AMOUNT;
00073         mAttributes.mUsingAvatarCollisionSphere                         = CLOTH_DEFAULT_USING_AVATAR_COLLISION_SPHERE;          
00074         //mAttributes.mAvatarCollisionSpherePositionOffset      = CLOTH_DEFAULT_AVATAR_COLLISION_SPHERE_POSITION_OFFSET;
00075         mAttributes.mAvatarCollisionSphereRadius                        = CLOTH_DEFAULT_AVATAR_COLLISION_SPHERE_RADIUS;
00076         mAttributes.mAvatarCollisionSphereRightOffset           = CLOTH_DEFAULT_AVATAR_COLLISION_SPHERE_RIGHT_OFFSET;
00077         mAttributes.mAvatarCollisionSphereUpOffset                      = CLOTH_DEFAULT_AVATAR_COLLISION_SPHERE_UP_OFFSET;
00078         mAttributes.mAvatarCollisionSphereForwardOffset         = CLOTH_DEFAULT_AVATAR_COLLISION_SPHERE_FORWARD_OFFSET;
00079 
00080         generateStrands();
00081 
00082 }//------------------------------------------------------------------------------
00083 
00084 
00085 //------------------------------------------------------------------------------
00086 // this method is only called when attributes of the cloth are set, 
00087 // and so it is not so important to try optimized it. 
00088 //------------------------------------------------------------------------------
00089 void LLVOCloth::generateStrands()
00090 {
00091         LLFlexibleObjectData strandAttributes;
00092 
00093         bool    oddNumStrands   = (bool)( mAttributes.mNumStrands % 2 );
00094         F32             piOver180               = F_PI / 180.0f;
00095         F32             x                               = 0.0f;
00096         F32             y                               = 0.0f;
00097         F32             startAngle              = -mAttributes.mCircleWrapAmount * 180.0f;
00098         F32             angleDelta              = ( mAttributes.mCircleWrapAmount * 360.0f )    / (F32)( mAttributes.mNumStrands - 1 );
00099         F32             subWidth                =   mAttributes.mWidth / (F32)( mAttributes.mNumStrands - 1 );
00100 
00101         F32     angle = 0.0f;
00102 
00103         if ( mAttributes.mNumStrands > 2 ) 
00104         {
00105                 angle = startAngle;
00106         }
00107 
00108         //-------------------------------------------
00109         // displace x and y to start the process of 
00110         // iterating through the positional offsets
00111         //-------------------------------------------
00112         if ( ! oddNumStrands )
00113         {
00114                 y += subWidth * ONE_HALF;
00115         }
00116 
00117         int half = mAttributes.mNumStrands / 2;
00118         for ( int s=0; s<half; s ++)
00119         {
00120                 if ( mAttributes.mNumStrands > 2 ) 
00121                 {
00122                         angle += angleDelta;
00123                 }
00124 
00125                 F32 r = angle * piOver180;
00126                 x -= subWidth * sin(r);
00127                 y -= subWidth * cos(r);
00128         }
00129 
00130 
00131         if ( mAttributes.mNumStrands > 2 )
00132                 {
00133                         angle = startAngle;
00134                 }
00135         else
00136                 {
00137                         angle = 0.0f;
00138                 }
00139 
00140                 
00141         for ( int s=0; s<mAttributes.mNumStrands; s ++)
00142         {
00143                 //strandAttributes.mAnchorPositionOffset.setVec( x, y, 0.0f );
00144 
00145                 if ( mAttributes.mNumStrands > 2 )
00146                 {
00147                         angle += angleDelta;
00148                 }
00149 
00150                 F32 r = angle * piOver180;
00151                 F32 dX = subWidth * sin(r);
00152                 F32 dY = subWidth * cos(r);
00153                 x += dX;
00154                 y += dY;
00155 
00156                 //--------------------------------------------------
00157                 // set anchor directions
00158                 //--------------------------------------------------
00159                 LLVector3 perpendicular;
00160                 perpendicular.setVec( -dY, dX, 0.0f );
00161                 perpendicular.normVec();
00162 
00163                 //F32 pitchRadian = mAttributes.mPitch * F_PI_BY_TWO;
00164 
00165                 /*strandAttributes.mAnchorDirection.setVec
00166                         ( 
00167                                 perpendicular.mV[_X_] * cos( pitchRadian ), 
00168                                 perpendicular.mV[_Y_] * cos( pitchRadian ), 
00169                                                                                 sin( pitchRadian ) 
00170                         );*/
00171 
00172                 //strandAttributes.mAnchorDirection.normVec(); // just to be sure...
00173 
00174                 /*strandAttributes.mTension                             = mAttributes.mTension;
00175                 strandAttributes.mSimulateLOD                   = mAttributes.mNumSegments;
00176                 strandAttributes.mGravity                               = mAttributes.mGravity;
00177                 strandAttributes.mAirFriction                   = mAttributes.mAirFriction;
00178                 strandAttributes.mWindSensitivity               = mAttributes.mWindSensitivity;
00179                 strandAttributes.mUsingCollisionSphere  = mAttributes.mUsingAvatarCollisionSphere;*/
00180         }
00181 
00182 }//------------------------------------------------------------------------------
00183 
00184 
00185 
00186 
00187 
00188 
00189 //---------------------------------------------------------------------------------
00190 void LLVOCloth::update()
00191 {
00192         if ( mAttributes.mUsingAvatarCollisionSphere )
00193         {
00194                 LLVector3 offset;
00195                 offset.setVec
00196                         ( 
00197                                 mAttributes.mAvatarCollisionSphereForwardOffset, // in this strange world, forward is along X (I think that's kinda wierd)
00198                                 mAttributes.mAvatarCollisionSphereRightOffset,
00199                                 mAttributes.mAvatarCollisionSphereUpOffset
00200                         );
00201 
00202                 //------------------------------------------------------
00203                 // rotate into avatar space
00204                 //------------------------------------------------------
00205                 offset *= gAgent.getAvatarObject()->getRenderRotation();
00206 
00207                 mAvatarCollisionSpherePosition = gAgent.getAvatarObject()->getRenderPosition() + offset;        
00208         }
00209 
00210         if ( mParent )
00211         {
00212                 // update the attachment of the strands to their parent object, and let them flop around! 
00213                 for ( int s=0; s<mAttributes.mNumStrands; s++)
00214                 {
00215                         mStrand[s]->setParentPositionAndRotationDirectly( getRenderPosition(), getRenderRotation() );
00216                         //mStrand[s]->update();
00217                         
00218                         if ( mAttributes.mUsingAvatarCollisionSphere )
00219                         {
00220                                 // it's not efficient to create the exact same collision 
00221                                 // sphere for every strand, but it'll do for the time being
00222                                 mStrand[s]->setCollisionSphere( mAvatarCollisionSpherePosition, mAttributes.mAvatarCollisionSphereRadius );
00223                         }                       
00224                 }
00225         }
00226 
00227 }//------------------------------------------------------------------
00228 
00229 
00230 
00231 
00232 //------------------------------------------------------------------
00233 void LLVOCloth::render()
00234 {
00235         if ( mAttributes.mTextureFileName != "not_specified" )
00236         {
00237                 LLViewerImage* theTexture = gImageList.getImage( LLUUID( gViewerArt.getString( mAttributes.mTextureFileName ) ), MIPMAP_FALSE, TRUE);
00238                 if  ( theTexture )
00239                 {       
00240                         /*if ( mAttributes.mVisualizeAvCollisionSphere )
00241                         {
00242                                 for ( int s=0; s<mAttributes.mNumStrands; s++)
00243                                 {
00244                                         mStrand[s]->renderCollisionSphere();
00245                                 }
00246                         }*/
00247 
00248                         if ( mAttributes.mVisualizeStrands )
00249                         {
00250                                 for ( int s=0; s<mAttributes.mNumStrands; s++)
00251                                 {
00252                                         //------------------------------------------------
00253                                         // draw a small sphere at the top of the strand
00254                                         //------------------------------------------------
00255                                         glPushMatrix();
00256 
00257                                         glTranslatef
00258                                                 ( 
00259                                                         mStrand[s]->getAnchorPosition().mV[_X_],
00260                                                         mStrand[s]->getAnchorPosition().mV[_Y_], 
00261                                                         mStrand[s]->getAnchorPosition().mV[_Z_]
00262                                                 );
00263 
00264                                         glScalef
00265                                                 ( 
00266                                                         STRAND_VISUALIZATION_ANCHOR_BALL_RADIUS, 
00267                                                         STRAND_VISUALIZATION_ANCHOR_BALL_RADIUS, 
00268                                                         STRAND_VISUALIZATION_ANCHOR_BALL_RADIUS 
00269                                                 );
00270 
00271                                         gSphere.render();
00272                                         glPopMatrix();
00273 
00274                                         //--------------------------------
00275                                         // draw the strand
00276                                         //--------------------------------
00277                                         //mStrand[s]->render();
00278 
00279 
00280 
00281 
00282 
00283 
00284 
00285                                         //--------------------------------------------
00286                                         // draw the segments between the strands
00287                                         //--------------------------------------------
00288                                         if ( s > 0 )
00289                                         {
00290                                                 //--------------------------------
00291                                                 // draw the top edge...
00292                                                 //--------------------------------
00293                                                 glBegin( GL_LINES );
00294                                                         glVertex3fv( mStrand[s-1]->getAnchorPosition().mV );
00295                                                         glVertex3fv( mStrand[s  ]->getAnchorPosition().mV );
00296                                                 glEnd();
00297 
00298                                                 //--------------------------------------------
00299                                                 // draw the rest of the segments
00300                                                 //--------------------------------------------
00301                                                 for ( int i=0; i<mAttributes.mNumSegments; i++)
00302                                                 {
00303                                                         glBegin( GL_LINES );
00304                                                                 glVertex3fv( mStrand[s-1]->getNodePosition(i).mV );
00305                                                                 glVertex3fv( mStrand[s  ]->getNodePosition(i).mV );
00306                                                         glEnd();
00307                                                 }
00308                                         }
00309                                 }
00310                         }
00311 
00312                         //--------------------------------------------------------
00313                         // now, render the cape itself
00314                         //--------------------------------------------------------
00315                         glColor4fv( LLColor4( 1.0f, 1.0f, 1.0f, 1.0f ).mV );
00316 
00317                         for ( int s=1; s<mAttributes.mNumStrands; s++)
00318                         {
00319                                 //to be optimized later (should be calculated only once and stored in an array)
00320                                 F32 x0 = (F32)(s-1)     / (F32)( mAttributes.mNumStrands - 1 );
00321                                 F32 x1 = (F32)s         / (F32)( mAttributes.mNumStrands - 1 );
00322 
00323                                 for ( int i=0; i<mAttributes.mNumSegments; i++)
00324                                 {
00325                                         LLVector3 leftBottom;
00326                                         LLVector3 rightBottom;
00327                                         LLVector3 leftTop;
00328                                         LLVector3 rightTop;
00329 
00330                                         F32 y0 = (F32)i         / (F32)mAttributes.mNumSegments;
00331                                         F32 y1 = (F32)(i+1)     / (F32)mAttributes.mNumSegments;
00332 
00333                                         y0 = 1.0f - y0;
00334                                         y1 = 1.0f - y1;
00335 
00336                                         if ( i == 0 )
00337                                         {
00338                                                 leftBottom      = mStrand[ s-1  ]->getAnchorPosition();
00339                                                 rightBottom     = mStrand[ s    ]->getAnchorPosition();
00340                                         }
00341                                         else
00342                                         {
00343                                                 leftBottom      = mStrand[ s-1  ]->getNodePosition( i-1 );
00344                                                 rightBottom     = mStrand[ s    ]->getNodePosition( i-1 );
00345                                         }
00346 
00347                                         leftTop         = mStrand[ s-1  ]->getNodePosition( i );
00348                                         rightTop        = mStrand[ s    ]->getNodePosition( i );
00349 
00350                                         //gGLSTexture.set(); //set render state to use texture
00351                                         LLViewerImage::bindTexture(theTexture);
00352 
00353                                         glBegin( GL_TRIANGLE_STRIP );
00354                                                 glTexCoord2f( x0, y0 ); glVertex3fv( leftBottom.mV );
00355                                                 glTexCoord2f( x1, y0 ); glVertex3fv( rightBottom.mV );
00356                                                 glTexCoord2f( x0, y1 ); glVertex3fv( leftTop.mV );
00357                                         glEnd();
00358                                         glBegin( GL_TRIANGLE_STRIP );
00359                                                 glTexCoord2f( x1, y0 ); glVertex3fv( rightBottom.mV );
00360                                                 glTexCoord2f( x1, y1 ); glVertex3fv( rightTop.mV );
00361                                                 glTexCoord2f( x0, y1 ); glVertex3fv( leftTop.mV );
00362                                         glEnd();
00363 
00364                                         theTexture->unbindTexture(0, GL_TEXTURE_2D);
00365                                 }
00366                         }
00367                 }
00368         }
00369 
00370 }//------------------------------------------------------------------
00371 
00372 
00373 
00374 
00375 //------------------------------------------------------------------
00376 void LLVOCloth::setAttributes( LLClothAttributes a )
00377 {
00378         mAttributes.mTextureFileName                                            = a.mTextureFileName;
00379         mAttributes.mTextureIndex                                                       = a.mTextureIndex;
00380         mAttributes.mNumSegments                                                        = a.mNumSegments;
00381         mAttributes.mNumStrands                                                         = a.mNumStrands;
00382         mAttributes.mVisualizeStrands                                           = a.mVisualizeStrands;
00383         mAttributes.mVisualizeAvCollisionSphere                         = a.mVisualizeAvCollisionSphere;
00384         mAttributes.mWidth                                                                      = a.mWidth;
00385         mAttributes.mLength                                                                     = a.mLength;
00386         mAttributes.mPitch                                                                      = a.mPitch;
00387         mAttributes.mTension                                                            = a.mTension;
00388         mAttributes.mGravity                                                            = a.mGravity;
00389         mAttributes.mAirFriction                                                        = a.mAirFriction;       
00390         mAttributes.mWindSensitivity                                            = a.mWindSensitivity;   
00391         mAttributes.mCircleWrapAmount                                           = a.mCircleWrapAmount;  
00392         mAttributes.mUsingAvatarCollisionSphere                         = a.mUsingAvatarCollisionSphere;                
00393 //mAttributes.mAvatarCollisionSpherePositionOffset      = a.mAvatarCollisionSpherePositionOffset;
00394         mAttributes.mAvatarCollisionSphereRadius                        = a.mAvatarCollisionSphereRadius;
00395         mAttributes.mAvatarCollisionSphereRightOffset           = a.mAvatarCollisionSphereRightOffset;
00396         mAttributes.mAvatarCollisionSphereUpOffset                      = a.mAvatarCollisionSphereUpOffset;
00397         mAttributes.mAvatarCollisionSphereForwardOffset         = a.mAvatarCollisionSphereForwardOffset;
00398 
00399 
00400         if              ( mAttributes.mTextureIndex             < CLOTH_MIN_TEXTURE_INDEX               ){ mAttributes.mTextureIndex            = CLOTH_MIN_TEXTURE_INDEX;      }
00401         else if ( mAttributes.mTextureIndex             > CLOTH_MAX_TEXTURE_INDEX               ){ mAttributes.mTextureIndex            = CLOTH_MAX_TEXTURE_INDEX;      }
00402         if              ( mAttributes.mPitch                    < CLOTH_MIN_PITCH                               ){ mAttributes.mPitch                           = CLOTH_MIN_PITCH;                      }
00403         else if ( mAttributes.mPitch                    > CLOTH_MAX_PITCH                               ){ mAttributes.mPitch                           = CLOTH_MAX_PITCH;                      }
00404         if              ( mAttributes.mWidth                    < CLOTH_MIN_WIDTH                               ){ mAttributes.mWidth                           = CLOTH_MIN_WIDTH;                      }
00405         else if ( mAttributes.mWidth                    > CLOTH_MAX_WIDTH                               ){ mAttributes.mWidth                           = CLOTH_MAX_WIDTH;                      }
00406         if              ( mAttributes.mLength                   < CLOTH_MIN_LENGTH                              ){ mAttributes.mLength                          = CLOTH_MIN_LENGTH;                     }
00407         else if ( mAttributes.mLength                   > CLOTH_MAX_LENGTH                              ){ mAttributes.mLength                          = CLOTH_MAX_LENGTH;                     }
00408         if              ( mAttributes.mNumSegments              < CLOTH_MIN_SEGMENTS                    ){ mAttributes.mNumSegments                     = CLOTH_MIN_SEGMENTS;           }
00409         else if ( mAttributes.mNumSegments              > CLOTH_MAX_SEGMENTS                    ){ mAttributes.mNumSegments                     = CLOTH_MAX_SEGMENTS;           }
00410         if              ( mAttributes.mNumStrands               < CLOTH_MIN_STRANDS                             ){ mAttributes.mNumStrands                      = CLOTH_MIN_STRANDS;            }
00411         else if ( mAttributes.mNumStrands               > CLOTH_MAX_STRANDS                             ){ mAttributes.mNumStrands                      = CLOTH_MAX_STRANDS;            }
00412         if              ( mAttributes.mTension                  < CLOTH_MIN_TENSION                             ){ mAttributes.mTension                         = CLOTH_MIN_TENSION;            }
00413         else if ( mAttributes.mTension                  > CLOTH_MAX_TENSION                             ){ mAttributes.mTension                         = CLOTH_MAX_TENSION;            }
00414         if              ( mAttributes.mGravity                  < CLOTH_MIN_GRAVITY                             ){ mAttributes.mGravity                         = CLOTH_MIN_GRAVITY;            }
00415         else if ( mAttributes.mGravity                  > CLOTH_MAX_GRAVITY                             ){ mAttributes.mGravity                         = CLOTH_MAX_GRAVITY;            }
00416         if              ( mAttributes.mAirFriction              < CLOTH_MIN_AIR_FRICTION                ){ mAttributes.mAirFriction                     = CLOTH_MIN_AIR_FRICTION;       }
00417         else if ( mAttributes.mAirFriction              > CLOTH_MAX_AIR_FRICTION                ){ mAttributes.mAirFriction                     = CLOTH_MAX_AIR_FRICTION;       }
00418         if              ( mAttributes.mWindSensitivity  < CLOTH_MIN_WIND_SENSITIVITY    ){ mAttributes.mWindSensitivity         = CLOTH_MIN_WIND_SENSITIVITY;}
00419         else if ( mAttributes.mWindSensitivity  > CLOTH_MAX_WIND_SENSITIVITY    ){ mAttributes.mWindSensitivity         = CLOTH_MAX_WIND_SENSITIVITY;}
00420         if              ( mAttributes.mCircleWrapAmount < CLOTH_MIN_CIRCLE_WRAP_AMOUNT  ){ mAttributes.mCircleWrapAmount        = CLOTH_MIN_CIRCLE_WRAP_AMOUNT;}
00421         else if ( mAttributes.mCircleWrapAmount > CLOTH_MAX_CIRCLE_WRAP_AMOUNT  ){ mAttributes.mCircleWrapAmount        = CLOTH_MAX_CIRCLE_WRAP_AMOUNT;}
00422         
00423         if              ( mAttributes.mAvatarCollisionSphereRadius                      < CLOTH_MIN_AVATAR_COLLISION_SPHERE_RADIUS                      ){ mAttributes.mAvatarCollisionSphereRadius                     = CLOTH_MIN_AVATAR_COLLISION_SPHERE_RADIUS;}
00424         else if ( mAttributes.mAvatarCollisionSphereRadius                      > CLOTH_MAX_AVATAR_COLLISION_SPHERE_RADIUS                      ){ mAttributes.mAvatarCollisionSphereRadius                     = CLOTH_MAX_AVATAR_COLLISION_SPHERE_RADIUS;}
00425         if              ( mAttributes.mAvatarCollisionSphereRightOffset         < CLOTH_MIN_AVATAR_COLLISION_SPHERE_RIGHT_OFFSET        ){ mAttributes.mAvatarCollisionSphereRightOffset        = CLOTH_MIN_AVATAR_COLLISION_SPHERE_RIGHT_OFFSET;}
00426         else if ( mAttributes.mAvatarCollisionSphereRightOffset         > CLOTH_MAX_AVATAR_COLLISION_SPHERE_RIGHT_OFFSET        ){ mAttributes.mAvatarCollisionSphereRightOffset        = CLOTH_MAX_AVATAR_COLLISION_SPHERE_RIGHT_OFFSET;}
00427         if              ( mAttributes.mAvatarCollisionSphereUpOffset            < CLOTH_MIN_AVATAR_COLLISION_SPHERE_UP_OFFSET           ){ mAttributes.mAvatarCollisionSphereUpOffset           = CLOTH_MIN_AVATAR_COLLISION_SPHERE_UP_OFFSET;}
00428         else if ( mAttributes.mAvatarCollisionSphereUpOffset            > CLOTH_MAX_AVATAR_COLLISION_SPHERE_UP_OFFSET           ){ mAttributes.mAvatarCollisionSphereUpOffset           = CLOTH_MAX_AVATAR_COLLISION_SPHERE_UP_OFFSET;}
00429         if              ( mAttributes.mAvatarCollisionSphereForwardOffset       < CLOTH_MIN_AVATAR_COLLISION_SPHERE_FORWARD_OFFSET      ){ mAttributes.mAvatarCollisionSphereForwardOffset      = CLOTH_MIN_AVATAR_COLLISION_SPHERE_FORWARD_OFFSET;}
00430         else if ( mAttributes.mAvatarCollisionSphereForwardOffset       > CLOTH_MAX_AVATAR_COLLISION_SPHERE_FORWARD_OFFSET      ){ mAttributes.mAvatarCollisionSphereForwardOffset      = CLOTH_MAX_AVATAR_COLLISION_SPHERE_FORWARD_OFFSET;}
00431 
00432         //-----------------------------------------------------------------------------------
00433         // based on the above attributes, the strands (flexible objects) are generated
00434         //-----------------------------------------------------------------------------------
00435         generateStrands();
00436 
00437 }//------------------------------------------------------------------
00438 
00439 
00440 
00441 
00442 
00443 //------------------------------------------------------------------
00444 // set methods
00445 //------------------------------------------------------------------
00446 
00447 //------------------------------------------------------------------
00448 void LLVOCloth::setNumStrands( int num )
00449 {
00450         mAttributes.mNumStrands = num;
00451         generateStrands();
00452 }//------------------------------------------------------------------
00453 //------------------------------------------------------------------
00454 void LLVOCloth::setNumSegments( int num )
00455 {
00456         mAttributes.mNumSegments = num;
00457         generateStrands();
00458 }//------------------------------------------------------------------
00459 //------------------------------------------------------------------
00460 void LLVOCloth::setLength( F32 le )
00461 {
00462         mAttributes.mLength = le;
00463         generateStrands();
00464 }//------------------------------------------------------------------
00465 //------------------------------------------------------------------
00466 void LLVOCloth::setCircleWrapAmount( F32 n )
00467 {
00468         mAttributes.mCircleWrapAmount = n;
00469         generateStrands();
00470 }//------------------------------------------------------------------
00471 //------------------------------------------------------------------
00472 void LLVOCloth::setGravity( F32 g )
00473 {
00474         mAttributes.mGravity = g;
00475         generateStrands();
00476 }//------------------------------------------------------------------
00477 //------------------------------------------------------------------
00478 void LLVOCloth::setPitch( F32 p )
00479 {
00480         mAttributes.mPitch = p;
00481         generateStrands();
00482 }//------------------------------------------------------------------
00483 //------------------------------------------------------------------
00484 void LLVOCloth::setAirFriction( F32 a )
00485 {
00486         mAttributes.mAirFriction = a;
00487         generateStrands();
00488 }//------------------------------------------------------------------
00489 //------------------------------------------------------------------
00490 void LLVOCloth::setWindSensitivity( F32 w )
00491 {
00492         mAttributes.mWindSensitivity = w;
00493         generateStrands();
00494 }//------------------------------------------------------------------
00495 //------------------------------------------------------------------
00496 void LLVOCloth::setTension( F32 t )
00497 {
00498         mAttributes.mTension = t;
00499         generateStrands();
00500 }//------------------------------------------------------------------
00501 //------------------------------------------------------------------
00502 void LLVOCloth::setWidth( F32 n )
00503 {
00504         mAttributes.mWidth = n;
00505         generateStrands();
00506 }//------------------------------------------------------------------
00507 //------------------------------------------------------------------
00508 void LLVOCloth::setVisualizingStrands( bool v )
00509 {
00510         mAttributes.mVisualizeStrands = v;
00511 }//------------------------------------------------------------------//------------------------------------------------------------------
00512 void LLVOCloth::setVisualizingAvCollisionSphere( bool v )
00513 {
00514         mAttributes.mVisualizeAvCollisionSphere = v;
00515 }//------------------------------------------------------------------
00516 //------------------------------------------------------------------
00517 void LLVOCloth::setAvatarCollisionSphereRadius( F32 r )
00518 {
00519         mAttributes.mAvatarCollisionSphereRadius = r;
00520 
00521 }//------------------------------------------------------------------
00522 //------------------------------------------------------------------
00523 void LLVOCloth::setAvatarCollisionSphereRight( F32 r )
00524 {
00525         mAttributes.mAvatarCollisionSphereRightOffset = r;
00526 
00527 }//------------------------------------------------------------------
00528 //------------------------------------------------------------------
00529 void LLVOCloth::setAvatarCollisionSphereUp( F32 u )
00530 {
00531         mAttributes.mAvatarCollisionSphereUpOffset = u;
00532 
00533 }//------------------------------------------------------------------
00534 //------------------------------------------------------------------
00535 void LLVOCloth::setAvatarCollisionSphereForward( F32 f )
00536 {
00537         mAttributes.mAvatarCollisionSphereForwardOffset = f;
00538 
00539 }//------------------------------------------------------------------
00540 
00541 
00542 //------------------------------------------------------------------
00543 // get methods
00544 //------------------------------------------------------------------
00545 
00546 //------------------------------------------------------------------
00547 int LLVOCloth::getNumStrands()
00548 {
00549         return mAttributes.mNumStrands;
00550 }//------------------------------------------------------------------
00551 //------------------------------------------------------------------
00552 int LLVOCloth::getNumSegments()
00553 {
00554         return mAttributes.mNumSegments;
00555 }//------------------------------------------------------------------
00556 //------------------------------------------------------------------
00557 F32 LLVOCloth::getLength()
00558 {
00559         return mAttributes.mLength;
00560 }//------------------------------------------------------------------
00561 //------------------------------------------------------------------
00562 F32 LLVOCloth::getWidth()
00563 {
00564         return mAttributes.mWidth;
00565 }//------------------------------------------------------------------
00566 //------------------------------------------------------------------
00567 F32 LLVOCloth::getCircleWrapAmount()
00568 {
00569         return mAttributes.mCircleWrapAmount;
00570 }//------------------------------------------------------------------
00571 //------------------------------------------------------------------
00572 F32 LLVOCloth::getPitch()
00573 {
00574         return mAttributes.mPitch;
00575 }//------------------------------------------------------------------
00576 //------------------------------------------------------------------
00577 F32 LLVOCloth::getTension()
00578 {
00579         return mAttributes.mTension;
00580 }//------------------------------------------------------------------
00581 //------------------------------------------------------------------
00582 F32 LLVOCloth::getGravity()
00583 {
00584         return mAttributes.mGravity;
00585 }//------------------------------------------------------------------
00586 //------------------------------------------------------------------
00587 F32 LLVOCloth::getAirFriction()
00588 {
00589         return mAttributes.mAirFriction;
00590 }//------------------------------------------------------------------
00591 //------------------------------------------------------------------
00592 F32 LLVOCloth::getWindSensitivity()
00593 {
00594         return mAttributes.mWindSensitivity;
00595 }//------------------------------------------------------------------
00596 //------------------------------------------------------------------
00597 bool LLVOCloth::getVisualizingStrands() const
00598 {
00599         return mAttributes.mVisualizeStrands;
00600 }//------------------------------------------------------------------
00601 //------------------------------------------------------------------
00602 bool LLVOCloth::getVisualizingAvCollisionSphere() const
00603 {
00604         return mAttributes.mVisualizeAvCollisionSphere;
00605 }//------------------------------------------------------------------
00606 //------------------------------------------------------------------
00607 F32 LLVOCloth::getAvatarCollisionSphereRadius()
00608 {
00609         return mAttributes.mAvatarCollisionSphereRadius;
00610 }//------------------------------------------------------------------
00611 //------------------------------------------------------------------
00612 F32 LLVOCloth::getAvatarCollisionSphereRight()
00613 {
00614         return mAttributes.mAvatarCollisionSphereRightOffset;
00615 }//------------------------------------------------------------------
00616 //------------------------------------------------------------------
00617 F32 LLVOCloth::getAvatarCollisionSphereUp()
00618 {
00619         return mAttributes.mAvatarCollisionSphereUpOffset;
00620 }//------------------------------------------------------------------
00621 //------------------------------------------------------------------
00622 F32 LLVOCloth::getAvatarCollisionSphereForward()
00623 {
00624         return mAttributes.mAvatarCollisionSphereForwardOffset;
00625 }//------------------------------------------------------------------
00626 
00627 
00628 
00629 //------------------------------------------------------------------
00630 void LLVOCloth::markAsDead()
00631 {
00632         mDead = TRUE;
00633 
00634 }//------------------------------------------------------------------
00635 
00636 
00637 
00638 
00639 
00640 
00641 
00642 

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