llvoavatar.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 #include <algorithm>
00035 #include <vector>
00036 #include "llstl.h"
00037 
00038 #include "llvoavatar.h"
00039 
00040 #include "llglimmediate.h"
00041 #include "audioengine.h"
00042 #include "imageids.h"
00043 #include "indra_constants.h"
00044 #include "llchat.h"
00045 #include "llfontgl.h"
00046 #include "llprimitive.h"
00047 #include "lltextureentry.h"
00048 #include "message.h"
00049 #include "noise.h"
00050 #include "sound_ids.h"
00051 #include "lltimer.h"
00052 #include "timing.h"
00053 
00054 #include "llagent.h"                    //  Get state values from here
00055 #include "llviewercontrol.h"
00056 #include "llcriticaldamp.h"
00057 #include "lldir.h"
00058 #include "lldrawable.h"
00059 #include "lldrawpoolavatar.h"
00060 #include "lldrawpoolalpha.h"
00061 #include "lldrawpoolbump.h"
00062 #include "lldriverparam.h"
00063 #include "lleditingmotion.h"
00064 #include "llemote.h"
00065 #include "llface.h"
00066 #include "llfasttimer.h"
00067 #include "llfirstuse.h"
00068 #include "llfloatercustomize.h"
00069 #include "llfloatertools.h"
00070 #include "llgldbg.h"
00071 #include "llhandmotion.h"
00072 #include "llheadrotmotion.h"
00073 #include "llhudeffectbeam.h"
00074 #include "llhudeffectlookat.h"
00075 #include "llhudeffecttrail.h"
00076 #include "llhudmanager.h"
00077 #include "llhudtext.h"
00078 #include "llinventorymodel.h"
00079 #include "llinventoryview.h"
00080 #include "llkeyframefallmotion.h"
00081 #include "llkeyframemotion.h"
00082 #include "llkeyframemotionparam.h"
00083 #include "llkeyframestandmotion.h"
00084 #include "llkeyframewalkmotion.h"
00085 #include "llmenugl.h"
00086 #include "llmutelist.h"
00087 #include "llnetmap.h"
00088 #include "llnotify.h"
00089 #include "llquantize.h"
00090 #include "llregionhandle.h"
00091 #include "llresmgr.h"
00092 #include "llselectmgr.h"
00093 #include "llsky.h"
00094 #include "llsprite.h"
00095 #include "llstatusbar.h"
00096 #include "lltargetingmotion.h"
00097 #include "lltexlayer.h"
00098 #include "lltoolgrab.h"         // for needsRenderBeam
00099 #include "lltoolmgr.h"          // for needsRenderBeam
00100 #include "lltoolmorph.h"
00101 #include "llviewercamera.h"
00102 #include "llviewerimagelist.h"
00103 #include "llviewerinventory.h"
00104 #include "llviewermenu.h"
00105 #include "llviewerobjectlist.h"
00106 #include "llviewerparcelmgr.h"
00107 #include "llviewerregion.h"
00108 #include "llviewerstats.h"
00109 #include "llviewerwindow.h"
00110 #include "llvosky.h"
00111 #include "llvovolume.h"
00112 #include "llwearable.h"
00113 #include "llwearablelist.h"
00114 #include "llworld.h"
00115 #include "pipeline.h"
00116 #include "llspatialpartition.h"
00117 #include "llglslshader.h"
00118 #include "llappviewer.h"
00119 #include "llsky.h"
00120 #include "llanimstatelabels.h"
00121 
00122 //#include "vtune/vtuneapi.h"
00123 
00124 #include "llgesturemgr.h" //needed to trigger the voice gesticulations
00125 #include "llvoicevisualizer.h" 
00126 #include "llvoiceclient.h"
00127 
00128 LLXmlTree LLVOAvatar::sXMLTree;
00129 LLXmlTree LLVOAvatar::sSkeletonXMLTree;
00130 LLVOAvatarSkeletonInfo* LLVOAvatar::sSkeletonInfo = NULL;
00131 LLVOAvatarInfo*                 LLVOAvatar::sAvatarInfo = NULL;
00132 
00133 BOOL gDebugAvatarRotation = FALSE;
00134 S32 LLVOAvatar::sFreezeCounter = 0 ;
00135 
00136 //extern BOOL gVelocityInterpolate;
00137 
00138 //-----------------------------------------------------------------------------
00139 // Constants
00140 //-----------------------------------------------------------------------------
00141 const F32 MIN_PIXEL_AREA_FOR_COMPOSITE = 200.f;
00142 
00143 F32 SHADOW_OFFSET_AMT = 0.03f;
00144 
00145 #define DELTA_TIME_MIN                  0.01f   // we clamp measured deltaTime to this
00146 #define DELTA_TIME_MAX                  0.2f    // range to insure stability of computations.
00147 
00148 const F32 PELVIS_LAG_FLYING             = 0.22f;// pelvis follow half life while flying
00149 
00150 const F32 PELVIS_LAG_WALKING    = 0.4f; // ...while walking
00151 
00152 const F32 PELVIS_LAG_MOUSELOOK = 0.15f;
00153 const F32 MOUSELOOK_PELVIS_FOLLOW_FACTOR = 0.5f;
00154 
00155 const F32 PELVIS_LAG_WHEN_FOLLOW_CAM_IS_ON = 0.0001f; // not zero! - something gets divided by this!
00156 
00157 #define PELVIS_ROT_THRESHOLD_SLOW       60.0f   // amount of deviation allowed between
00158 #define PELVIS_ROT_THRESHOLD_FAST       2.0f    // the pelvis and the view direction
00159                                                                                         // when moving fast & slow
00160 
00161 const F32 MIN_SPEED_PELVIS_FOLLOW = 0.1f;
00162 
00163 #define TORSO_NOISE_AMOUNT              1.f     // Amount of deviation from up-axis, in degrees
00164 #define TORSO_NOISE_SPEED               0.2f    // Time scale factor on torso noise.
00165 
00166 const F32 BREATHE_ROT_MOTION_STRENGTH = 0.05f;
00167 
00168 const F32 BREATHE_SCALE_MOTION_STRENGTH = 0.005f;
00169 
00170 #define PELVIS_NOISE_FACTOR             0.5f    // amount of random noise
00171 
00172 #define AUDIO_STEP_PRI                  0xC0000000
00173 #define AUDIO_STEP_LO_SPEED             0.01f   // as average speed goes from lo to hi,
00174 #define AUDIO_STEP_HI_SPEED             3.0f    // from lo to hi
00175 #define AUDIO_STEP_LO_GAIN              0.15f   // the resulting gain will ramp linearly
00176 #define AUDIO_STEP_HI_GAIN              0.15f
00177 
00178 const F32 DAMPED_MOTION_TIME_SCALE = 0.15f;
00179 
00180 const F32 LOOKAT_CAMERA_DIST_SQUARED = 25.f;
00181 
00182 #define AVATAR_HEADER           "Linden Avatar 1.0"
00183 #define AVATAR_SECTION          "[avatar]"
00184 
00185 #define AVATAR_DEFAULT_CHAR     "avatar"
00186 
00187 const F32 MIN_SHADOW_HEIGHT = 0.f;
00188 const F32 MAX_SHADOW_HEIGHT = 0.3f;
00189 
00190 #define MIN_REQUIRED_PIXEL_AREA_BODY_NOISE (10000.f)
00191 #define MIN_REQUIRED_PIXEL_AREA_BREATHE (10000.f)
00192 #define MIN_REQUIRED_PIXEL_AREA_PELVIS_FIX (40.f)
00193 
00194 const S32 LOCTEX_IMAGE_SIZE_SELF = 512;
00195 const S32 LOCTEX_IMAGE_AREA_SELF = LOCTEX_IMAGE_SIZE_SELF * LOCTEX_IMAGE_SIZE_SELF;
00196 const S32 LOCTEX_IMAGE_SIZE_OTHER = LOCTEX_IMAGE_SIZE_SELF / 4;  // The size of local textures for other (!mIsSelf) avatars
00197 const S32 LOCTEX_IMAGE_AREA_OTHER = LOCTEX_IMAGE_SIZE_OTHER * LOCTEX_IMAGE_SIZE_OTHER;
00198 
00199 const F32 HEAD_MOVEMENT_AVG_TIME = 0.9f;
00200 
00201 const S32 MORPH_MASK_REQUESTED_DISCARD = 0;
00202 const S32 MIN_PIXEL_AREA_BUMP = 500;
00203 
00204 // Discard level at which to switch to baked textures
00205 // Should probably be 4 or 3, but didn't want to change it while change other logic - SJB
00206 const S32 SWITCH_TO_BAKED_DISCARD = 5;
00207 
00208 const F32 FOOT_COLLIDE_FUDGE = 0.04f;
00209 
00210 const F32 HOVER_EFFECT_MAX_SPEED = 3.f;
00211 const F32 HOVER_EFFECT_STRENGTH = 0.f;
00212 F32 UNDERWATER_EFFECT_STRENGTH = 0.1f;
00213 const F32 UNDERWATER_FREQUENCY_DAMP = 0.33f;
00214 const F32 APPEARANCE_MORPH_TIME = 0.65f;
00215 const F32 CAMERA_SHAKE_ACCEL_THRESHOLD_SQUARED = 5.f * 5.f;
00216 const F32 TIME_BEFORE_MESH_CLEANUP = 5.f; // seconds
00217 const S32 AVATAR_RELEASE_THRESHOLD = 10; // number of avatar instances before releasing memory
00218 const F32 FOOT_GROUND_COLLISION_TOLERANCE = 0.25f;
00219 const F32 AVATAR_LOD_TWEAK_RANGE = 0.7f;
00220 const S32 MAX_LOD_CHANGES_PER_FRAME = 2;
00221 const S32 MAX_BUBBLE_CHAT_LENGTH = 1023;
00222 const S32 MAX_BUBBLE_CHAT_UTTERANCES = 12;
00223 const F32 CHAT_FADE_TIME = 8.0;
00224 const F32 BUBBLE_CHAT_TIME = CHAT_FADE_TIME * 3.f;
00225 const S32 MAX_BUBBLES = 7;
00226 
00227 S32 LLVOAvatar::sMaxVisible = 50;
00228 
00229 LLVOAvatar::ETextureIndex LLVOAvatar::sBakedTextureIndices[BAKED_TEXTURE_COUNT] = 
00230 {
00231         LLVOAvatar::TEX_HEAD_BAKED,
00232         LLVOAvatar::TEX_UPPER_BAKED,
00233         LLVOAvatar::TEX_LOWER_BAKED,
00234         LLVOAvatar::TEX_EYES_BAKED,
00235         LLVOAvatar::TEX_SKIRT_BAKED
00236 };
00237 
00238 //-----------------------------------------------------------------------------
00239 // Utility functions
00240 //-----------------------------------------------------------------------------
00241 
00242 static F32 calc_bouncy_animation(F32 x)
00243 {
00244         return -(cosf(x * F_PI * 2.5f - F_PI_BY_TWO))*(0.4f + x * -0.1f) + x * 1.3f;
00245 }
00246 
00247 //-----------------------------------------------------------------------------
00248 // Static Data
00249 //-----------------------------------------------------------------------------
00250 S32 LLVOAvatar::sMaxOtherAvatarsToComposite = 1;  // Only this many avatars (other than yourself) can be composited at a time.  Set in initClass().
00251 LLMap< LLGLenum, LLGLuint*> LLVOAvatar::sScratchTexNames;
00252 LLMap< LLGLenum, F32*> LLVOAvatar::sScratchTexLastBindTime;
00253 S32 LLVOAvatar::sScratchTexBytes = 0;
00254 F32 LLVOAvatar::sRenderDistance = 256.f;
00255 S32     LLVOAvatar::sNumVisibleAvatars = 0;
00256 S32     LLVOAvatar::sNumLODChangesThisFrame = 0;
00257 
00258 LLUUID LLVOAvatar::sStepSoundOnLand = LLUUID("e8af4a28-aa83-4310-a7c4-c047e15ea0df");
00259 LLUUID LLVOAvatar::sStepSounds[LL_MCODE_END] =
00260 {
00261         LLUUID(SND_STONE_RUBBER),
00262         LLUUID(SND_METAL_RUBBER),
00263         LLUUID(SND_GLASS_RUBBER),
00264         LLUUID(SND_WOOD_RUBBER),
00265         LLUUID(SND_FLESH_RUBBER),
00266         LLUUID(SND_RUBBER_PLASTIC),
00267         LLUUID(SND_RUBBER_RUBBER)
00268 };
00269 
00270 S32 LLVOAvatar::sRenderName = RENDER_NAME_ALWAYS;
00271 BOOL LLVOAvatar::sRenderGroupTitles = TRUE;
00272 S32 LLVOAvatar::sNumVisibleChatBubbles = 0;
00273 BOOL LLVOAvatar::sDebugInvisible = FALSE;
00274 BOOL LLVOAvatar::sShowAttachmentPoints = FALSE;
00275 BOOL LLVOAvatar::sShowAnimationDebug = FALSE;
00276 BOOL LLVOAvatar::sShowFootPlane = FALSE;
00277 BOOL LLVOAvatar::sShowCollisionVolumes = FALSE;
00278 BOOL LLVOAvatar::sVisibleInFirstPerson = FALSE;
00279 F32 LLVOAvatar::sLODFactor = 1.f;
00280 BOOL LLVOAvatar::sUseImpostors = FALSE;
00281 BOOL LLVOAvatar::sJointDebug = FALSE;
00282 
00283 S32 LLVOAvatar::sCurJoint = 0;
00284 S32 LLVOAvatar::sCurVolume = 0;
00285 
00286 struct LLAvatarTexData
00287 {
00288         LLAvatarTexData( const LLUUID& id, LLVOAvatar::ELocTexIndex index )
00289                 : mAvatarID(id), mIndex(index) {}
00290         LLUUID                          mAvatarID;
00291         LLVOAvatar::ELocTexIndex        mIndex;
00292 };
00293 
00294 struct LLTextureMaskData
00295 {
00296         LLTextureMaskData( const LLUUID& id )
00297                 : mAvatarID(id), mLastDiscardLevel(S32_MAX) {}
00298         LLUUID                          mAvatarID;
00299         S32                                     mLastDiscardLevel;
00300 };
00301 
00302 
00303 //-----------------------------------------------------------------------------
00304 // class LLBodyNoiseMotion
00305 //-----------------------------------------------------------------------------
00306 class LLBodyNoiseMotion :
00307         public LLMotion
00308 {
00309 public:
00310         // Constructor
00311         LLBodyNoiseMotion(const LLUUID &id)
00312                 : LLMotion(id)
00313         {
00314                 mName = "body_noise";
00315 
00316                 mTorsoState = new LLJointState;
00317         }
00318 
00319         // Destructor
00320         virtual ~LLBodyNoiseMotion() { }
00321 
00322 public:
00323         //-------------------------------------------------------------------------
00324         // functions to support MotionController and MotionRegistry
00325         //-------------------------------------------------------------------------
00326         // static constructor
00327         // all subclasses must implement such a function and register it
00328         static LLMotion *create(const LLUUID &id) { return new LLBodyNoiseMotion(id); }
00329 
00330 public:
00331         //-------------------------------------------------------------------------
00332         // animation callbacks to be implemented by subclasses
00333         //-------------------------------------------------------------------------
00334 
00335         // motions must specify whether or not they loop
00336         virtual BOOL getLoop() { return TRUE; }
00337 
00338         // motions must report their total duration
00339         virtual F32 getDuration() { return 0.0; }
00340 
00341         // motions must report their "ease in" duration
00342         virtual F32 getEaseInDuration() { return 0.0; }
00343 
00344         // motions must report their "ease out" duration.
00345         virtual F32 getEaseOutDuration() { return 0.0; }
00346 
00347         // motions must report their priority
00348         virtual LLJoint::JointPriority getPriority() { return LLJoint::HIGH_PRIORITY; }
00349 
00350         virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; }
00351 
00352         // called to determine when a motion should be activated/deactivated based on avatar pixel coverage
00353         virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_BODY_NOISE; }
00354 
00355         // run-time (post constructor) initialization,
00356         // called after parameters have been set
00357         // must return true to indicate success and be available for activation
00358         virtual LLMotionInitStatus onInitialize(LLCharacter *character)
00359         {
00360                 if( !mTorsoState->setJoint( character->getJoint("mTorso") ))
00361                 {
00362                         return STATUS_FAILURE;
00363                 }
00364 
00365                 mTorsoState->setUsage(LLJointState::ROT);
00366 
00367                 addJointState( mTorsoState );
00368                 return STATUS_SUCCESS;
00369         }
00370 
00371         // called when a motion is activated
00372         // must return TRUE to indicate success, or else
00373         // it will be deactivated
00374         virtual BOOL onActivate() { return TRUE; }
00375 
00376         // called per time step
00377         // must return TRUE while it is active, and
00378         // must return FALSE when the motion is completed.
00379         virtual BOOL onUpdate(F32 time, U8* joint_mask)
00380         {
00381                 F32 nx[2];
00382                 nx[0]=time*TORSO_NOISE_SPEED;
00383                 nx[1]=0.0f;
00384                 F32 ny[2];
00385                 ny[0]=0.0f;
00386                 ny[1]=time*TORSO_NOISE_SPEED;
00387                 F32 noiseX = noise2(nx);
00388                 F32 noiseY = noise2(ny);
00389 
00390                 F32 rx = TORSO_NOISE_AMOUNT * DEG_TO_RAD * noiseX / 0.42f;
00391                 F32 ry = TORSO_NOISE_AMOUNT * DEG_TO_RAD * noiseY / 0.42f;
00392                 LLQuaternion tQn;
00393                 tQn.setQuat( rx, ry, 0.0f );
00394                 mTorsoState->setRotation( tQn );
00395 
00396                 return TRUE;
00397         }
00398 
00399         // called when a motion is deactivated
00400         virtual void onDeactivate() {}
00401 
00402 public:
00403         //-------------------------------------------------------------------------
00404         // joint states to be animated
00405         //-------------------------------------------------------------------------
00406         LLPointer<LLJointState> mTorsoState;
00407 };
00408 
00409 //-----------------------------------------------------------------------------
00410 // class LLBreatheMotionRot
00411 //-----------------------------------------------------------------------------
00412 class LLBreatheMotionRot :
00413         public LLMotion
00414 {
00415 public:
00416         // Constructor
00417         LLBreatheMotionRot(const LLUUID &id) :
00418                 LLMotion(id),
00419                 mBreatheRate(1.f),
00420                 mCharacter(NULL)
00421         {
00422                 mName = "breathe_rot";
00423 
00424                 mChestState = new LLJointState;
00425         }
00426 
00427         // Destructor
00428         virtual ~LLBreatheMotionRot() { }
00429 
00430 public:
00431         //-------------------------------------------------------------------------
00432         // functions to support MotionController and MotionRegistry
00433         //-------------------------------------------------------------------------
00434         // static constructor
00435         // all subclasses must implement such a function and register it
00436         static LLMotion *create(const LLUUID &id) { return new LLBreatheMotionRot(id); }
00437 
00438 public:
00439         //-------------------------------------------------------------------------
00440         // animation callbacks to be implemented by subclasses
00441         //-------------------------------------------------------------------------
00442 
00443         // motions must specify whether or not they loop
00444         virtual BOOL getLoop() { return TRUE; }
00445 
00446         // motions must report their total duration
00447         virtual F32 getDuration() { return 0.0; }
00448 
00449         // motions must report their "ease in" duration
00450         virtual F32 getEaseInDuration() { return 0.0; }
00451 
00452         // motions must report their "ease out" duration.
00453         virtual F32 getEaseOutDuration() { return 0.0; }
00454 
00455         // motions must report their priority
00456         virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; }
00457 
00458         virtual LLMotionBlendType getBlendType() { return NORMAL_BLEND; }
00459 
00460         // called to determine when a motion should be activated/deactivated based on avatar pixel coverage
00461         virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_BREATHE; }
00462 
00463         // run-time (post constructor) initialization,
00464         // called after parameters have been set
00465         // must return true to indicate success and be available for activation
00466         virtual LLMotionInitStatus onInitialize(LLCharacter *character)
00467         {               
00468                 mCharacter = character;
00469                 bool success = true;
00470 
00471                 if ( !mChestState->setJoint( character->getJoint( "mChest" ) ) ) { success = false; }
00472 
00473                 if ( success )
00474                 {
00475                         mChestState->setUsage(LLJointState::ROT);
00476                         addJointState( mChestState );
00477                 }
00478 
00479                 if ( success )
00480                 {
00481                         return STATUS_SUCCESS;
00482                 }
00483                 else
00484                 {
00485                         return STATUS_FAILURE;
00486                 }
00487         }
00488 
00489         // called when a motion is activated
00490         // must return TRUE to indicate success, or else
00491         // it will be deactivated
00492         virtual BOOL onActivate() { return TRUE; }
00493 
00494         // called per time step
00495         // must return TRUE while it is active, and
00496         // must return FALSE when the motion is completed.
00497         virtual BOOL onUpdate(F32 time, U8* joint_mask)
00498         {
00499                 mBreatheRate = 1.f;
00500 
00501                 F32 breathe_amt = (sinf(mBreatheRate * time) * BREATHE_ROT_MOTION_STRENGTH);
00502 
00503                 mChestState->setRotation(LLQuaternion(breathe_amt, LLVector3(0.f, 1.f, 0.f)));
00504 
00505                 return TRUE;
00506         }
00507 
00508         // called when a motion is deactivated
00509         virtual void onDeactivate() {}
00510 
00511 public:
00512         //-------------------------------------------------------------------------
00513         // joint states to be animated
00514         //-------------------------------------------------------------------------
00515         LLPointer<LLJointState> mChestState;
00516         F32                                     mBreatheRate;
00517         LLCharacter*            mCharacter;
00518 };
00519 
00520 //-----------------------------------------------------------------------------
00521 // class LLPelvisFixMotion
00522 //-----------------------------------------------------------------------------
00523 class LLPelvisFixMotion :
00524         public LLMotion
00525 {
00526 public:
00527         // Constructor
00528         LLPelvisFixMotion(const LLUUID &id)
00529                 : LLMotion(id), mCharacter(NULL)
00530         {
00531                 mName = "pelvis_fix";
00532 
00533                 mPelvisState = new LLJointState;
00534         }
00535 
00536         // Destructor
00537         virtual ~LLPelvisFixMotion() { }
00538 
00539 public:
00540         //-------------------------------------------------------------------------
00541         // functions to support MotionController and MotionRegistry
00542         //-------------------------------------------------------------------------
00543         // static constructor
00544         // all subclasses must implement such a function and register it
00545         static LLMotion *create(const LLUUID& id) { return new LLPelvisFixMotion(id); }
00546 
00547 public:
00548         //-------------------------------------------------------------------------
00549         // animation callbacks to be implemented by subclasses
00550         //-------------------------------------------------------------------------
00551 
00552         // motions must specify whether or not they loop
00553         virtual BOOL getLoop() { return TRUE; }
00554 
00555         // motions must report their total duration
00556         virtual F32 getDuration() { return 0.0; }
00557 
00558         // motions must report their "ease in" duration
00559         virtual F32 getEaseInDuration() { return 0.5f; }
00560 
00561         // motions must report their "ease out" duration.
00562         virtual F32 getEaseOutDuration() { return 0.5f; }
00563 
00564         // motions must report their priority
00565         virtual LLJoint::JointPriority getPriority() { return LLJoint::LOW_PRIORITY; }
00566 
00567         virtual LLMotionBlendType getBlendType() { return NORMAL_BLEND; }
00568 
00569         // called to determine when a motion should be activated/deactivated based on avatar pixel coverage
00570         virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_PELVIS_FIX; }
00571 
00572         // run-time (post constructor) initialization,
00573         // called after parameters have been set
00574         // must return true to indicate success and be available for activation
00575         virtual LLMotionInitStatus onInitialize(LLCharacter *character)
00576         {
00577                 mCharacter = character;
00578 
00579                 if (!mPelvisState->setJoint( character->getJoint("mPelvis")))
00580                 {
00581                         return STATUS_FAILURE;
00582                 }
00583 
00584                 mPelvisState->setUsage(LLJointState::POS);
00585 
00586                 addJointState( mPelvisState );
00587                 return STATUS_SUCCESS;
00588         }
00589 
00590         // called when a motion is activated
00591         // must return TRUE to indicate success, or else
00592         // it will be deactivated
00593         virtual BOOL onActivate() { return TRUE; }
00594 
00595         // called per time step
00596         // must return TRUE while it is active, and
00597         // must return FALSE when the motion is completed.
00598         virtual BOOL onUpdate(F32 time, U8* joint_mask)
00599         {
00600                 mPelvisState->setPosition(LLVector3::zero);
00601 
00602                 return TRUE;
00603         }
00604 
00605         // called when a motion is deactivated
00606         virtual void onDeactivate() {}
00607 
00608 public:
00609         //-------------------------------------------------------------------------
00610         // joint states to be animated
00611         //-------------------------------------------------------------------------
00612         LLPointer<LLJointState> mPelvisState;
00613         LLCharacter*            mCharacter;
00614 };
00615 
00616 //-----------------------------------------------------------------------------
00617 // LLVOAvatar()
00618 //-----------------------------------------------------------------------------
00619 LLVOAvatar::LLVOAvatar(
00620         const LLUUID& id,
00621         const LLPCode pcode,
00622         LLViewerRegion* regionp)
00623         :
00624         LLViewerObject(id, pcode, regionp),
00625         mHUDTargetZoom(1.f),
00626         mHUDCurZoom(1.f),
00627         mLastHeadBakedID( IMG_DEFAULT_AVATAR ),
00628         mLastUpperBodyBakedID( IMG_DEFAULT_AVATAR ),
00629         mLastLowerBodyBakedID( IMG_DEFAULT_AVATAR ),
00630         mLastEyesBakedID( IMG_DEFAULT_AVATAR ),
00631         mLastSkirtBakedID( IMG_DEFAULT_AVATAR ),
00632         mIsDummy(FALSE),
00633         mSpecialRenderMode(0),
00634         mTurning(FALSE),
00635         mPelvisToFoot(0.f),
00636         mLastSkeletonSerialNum( 0 ),
00637         mHeadOffset(),
00638         mIsSitting(FALSE),
00639         mTimeVisible(),
00640         mTyping(FALSE),
00641         mMeshValid(FALSE),
00642         mVisible(FALSE),
00643         mWindFreq(0.f),
00644         mRipplePhase( 0.f ),
00645         mBelowWater(FALSE),
00646         mAppearanceAnimSetByUser(FALSE),
00647         mLastAppearanceBlendTime(0.f),
00648         mAppearanceAnimating(FALSE),
00649         mHeadLayerSet( NULL ),
00650         mUpperBodyLayerSet( NULL ),
00651         mLowerBodyLayerSet( NULL ),
00652         mEyesLayerSet( NULL ),
00653         mSkirtLayerSet( NULL ),
00654         mRenderPriority(1.0f),
00655         mNameString(),
00656         mTitle(),
00657         mNameAway(FALSE),
00658         mNameBusy(FALSE),
00659         mNameMute(FALSE),
00660         mRenderGroupTitles(sRenderGroupTitles),
00661         mNameAppearance(FALSE),
00662         mLastRegionHandle(0),
00663         mRegionCrossingCount(0),
00664         mFirstTEMessageReceived( FALSE ),
00665         mFirstAppearanceMessageReceived( FALSE ),
00666         mHeadBakedLoaded(FALSE),
00667         mHeadMaskDiscard(-1),
00668         mUpperBakedLoaded(FALSE),
00669         mUpperMaskDiscard(-1),
00670         mLowerBakedLoaded(FALSE),
00671         mLowerMaskDiscard(-1),
00672         mEyesBakedLoaded(FALSE),
00673         mSkirtBakedLoaded(FALSE),
00674         mHeadMaskTexName(0),
00675         mUpperMaskTexName(0),
00676         mLowerMaskTexName(0),
00677         mCulled( FALSE ),
00678         mTexSkinColor( NULL ),
00679         mTexHairColor( NULL ),
00680         mTexEyeColor( NULL ),
00681         mNeedsSkin(FALSE),
00682         mUpdatePeriod(1),
00683         mFullyLoadedInitialized(FALSE)
00684 {
00685         LLMemType mt(LLMemType::MTYPE_AVATAR);
00686         
00687         //VTResume();  // VTune
00688         
00689         // mVoiceVisualizer is created by the hud effects manager and uses the HUD Effects pipeline
00690         bool needsSendToSim = false; // currently, this HUD effect doesn't need to pack and unpack data to do its job
00691         mVoiceVisualizer = ( LLVoiceVisualizer *)LLHUDManager::getInstance()->createViewerEffect( LLHUDObject::LL_HUD_EFFECT_VOICE_VISUALIZER, needsSendToSim );
00692 
00693         lldebugs << "LLVOAvatar Constructor (0x" << this << ") id:" << mID << llendl;
00694 
00695         mPelvisp = NULL;
00696 
00697         for( S32 i=0; i<LOCTEX_NUM_ENTRIES; i++ )
00698         {
00699                 mLocalTextureBaked[i] = FALSE;
00700                 mLocalTextureDiscard[i] = MAX_DISCARD_LEVEL+1;
00701         }
00702 
00703         mDirtyMesh = TRUE;      // Dirty geometry, need to regenerate.
00704         mShadow0Facep = NULL;
00705         mShadow1Facep = NULL;
00706         mHeadp = NULL;
00707 
00708         mIsBuilt = FALSE;
00709 
00710         mNumJoints = 0;
00711         mSkeleton = NULL;
00712         mScreenp = NULL;
00713 
00714         mNumCollisionVolumes = 0;
00715         mCollisionVolumes = NULL;
00716 
00717         // set up animation variables
00718         mSpeed = 0.f;
00719         setAnimationData("Speed", &mSpeed);
00720 
00721         strcpy(mAvatarDefinition, AVATAR_DEFAULT_CHAR);         /* Flawfinder: ignore */
00722 
00723         if (id == gAgentID)
00724         {
00725                 mIsSelf = TRUE;
00726                 gAgent.setAvatarObject(this);
00727                 lldebugs << "Marking avatar as self " << id << llendl;
00728         }
00729         else
00730         {
00731                 mIsSelf = FALSE;
00732         }
00733 
00734         mNeedsImpostorUpdate = TRUE;
00735         mNeedsAnimUpdate = TRUE;
00736 
00737         mImpostorDistance = 0;
00738 
00739         setNumTEs(TEX_NUM_ENTRIES);
00740 
00741         mbCanSelect = TRUE;
00742 
00743         mSignaledAnimations.clear();
00744         mPlayingAnimations.clear();
00745 
00746         mWasOnGroundLeft = FALSE;
00747         mWasOnGroundRight = FALSE;
00748 
00749         mTimeLast = 0.0f;
00750         mSpeedAccum = 0.0f;
00751 
00752         mRippleTimeLast = 0.f;
00753 
00754         mShadowImagep = gImageList.getImageFromFile("foot_shadow.j2c");
00755         mShadowImagep->bind();
00756         mShadowImagep->setClamp(TRUE, TRUE);
00757         
00758         mInAir = FALSE;
00759 
00760         mStepOnLand = TRUE;
00761         mStepMaterial = 0;
00762 
00763         mLipSyncActive = false;
00764         mOohMorph      = NULL;
00765         mAahMorph      = NULL;
00766 
00767         //-------------------------------------------------------------------------
00768         // initialize joint, mesh and shape members
00769         //-------------------------------------------------------------------------
00770         mRoot.setName( "mRoot" );
00771 
00772         // skinned mesh objects
00773         mHairLOD.setName("mHairLOD");
00774         mHairMesh0.setName("mHairMesh0");
00775         mHairMesh0.setMeshID(MESH_ID_HAIR);
00776         mHairMesh1.setName("mHairMesh1");
00777         mHairMesh2.setName("mHairMesh2");
00778         mHairMesh3.setName("mHairMesh3");
00779         mHairMesh4.setName("mHairMesh4");
00780         mHairMesh5.setName("mHairMesh5");
00781         
00782         mHairMesh0.setIsTransparent(TRUE);
00783         mHairMesh1.setIsTransparent(TRUE);
00784         mHairMesh2.setIsTransparent(TRUE);
00785         mHairMesh3.setIsTransparent(TRUE);
00786         mHairMesh4.setIsTransparent(TRUE);
00787         mHairMesh5.setIsTransparent(TRUE);
00788 
00789         mHeadLOD.setName("mHeadLOD");
00790         mHeadMesh0.setName("mHeadMesh0");
00791         mHeadMesh0.setMeshID(MESH_ID_HEAD);
00792         mHeadMesh1.setName("mHeadMesh1");
00793         mHeadMesh2.setName("mHeadMesh2");
00794         mHeadMesh3.setName("mHeadMesh3");
00795         mHeadMesh4.setName("mHeadMesh4");
00796         
00797         mEyeLashLOD.setName("mEyeLashLOD");
00798         mEyeLashMesh0.setName("mEyeLashMesh0");
00799         mEyeLashMesh0.setMeshID(MESH_ID_HEAD);
00800         mEyeLashMesh0.setIsTransparent(TRUE);
00801 
00802         mUpperBodyLOD.setName("mUpperBodyLOD");
00803         mUpperBodyMesh0.setName("mUpperBodyMesh0");
00804         mUpperBodyMesh0.setMeshID(MESH_ID_UPPER_BODY);
00805         mUpperBodyMesh1.setName("mUpperBodyMesh1");
00806         mUpperBodyMesh2.setName("mUpperBodyMesh2");
00807         mUpperBodyMesh3.setName("mUpperBodyMesh3");
00808         mUpperBodyMesh4.setName("mUpperBodyMesh4");
00809 
00810         mLowerBodyLOD.setName("mLowerBodyLOD");
00811         mLowerBodyMesh0.setName("mLowerBodyMesh0");
00812         mLowerBodyMesh0.setMeshID(MESH_ID_LOWER_BODY);
00813         mLowerBodyMesh1.setName("mLowerBodyMesh1");
00814         mLowerBodyMesh2.setName("mLowerBodyMesh2");
00815         mLowerBodyMesh3.setName("mLowerBodyMesh3");
00816         mLowerBodyMesh4.setName("mLowerBodyMesh4");
00817 
00818         mEyeBallLeftLOD.setName("mEyeBallLeftLOD");
00819         mEyeBallLeftMesh0.setName("mEyeBallLeftMesh0");
00820         mEyeBallLeftMesh1.setName("mEyeBallLeftMesh1");
00821 
00822         mEyeBallRightLOD.setName("mEyeBallRightLOD");
00823         mEyeBallRightMesh0.setName("mEyeBallRightMesh0");
00824         mEyeBallRightMesh1.setName("mEyeBallRightMesh1");
00825 
00826         mSkirtLOD.setName("mSkirtLOD");
00827         mSkirtMesh0.setName("mSkirtMesh0");
00828         mSkirtMesh0.setMeshID(MESH_ID_SKIRT);
00829         mSkirtMesh1.setName("mSkirtMesh1");
00830         mSkirtMesh2.setName("mSkirtMesh2");
00831         mSkirtMesh3.setName("mSkirtMesh3");
00832         mSkirtMesh4.setName("mSkirtMesh4");
00833 
00834         mSkirtMesh0.setIsTransparent(TRUE);
00835         mSkirtMesh1.setIsTransparent(TRUE);
00836         mSkirtMesh2.setIsTransparent(TRUE);
00837         mSkirtMesh3.setIsTransparent(TRUE);
00838         mSkirtMesh4.setIsTransparent(TRUE);
00839 
00840         // set the pick names for the avatar
00841         mHeadMesh0.setPickName( LLViewerJoint::PN_0 );
00842         mHeadMesh1.setPickName( LLViewerJoint::PN_0 );
00843         mHeadMesh2.setPickName( LLViewerJoint::PN_0 );
00844         mHeadMesh3.setPickName( LLViewerJoint::PN_0 );
00845         mHeadMesh4.setPickName( LLViewerJoint::PN_0 );
00846         mEyeLashMesh0.setPickName( LLViewerJoint::PN_0 );
00847 
00848         mUpperBodyMesh0.setPickName( LLViewerJoint::PN_1 );
00849         mUpperBodyMesh1.setPickName( LLViewerJoint::PN_1 );
00850         mUpperBodyMesh2.setPickName( LLViewerJoint::PN_1 );
00851         mUpperBodyMesh3.setPickName( LLViewerJoint::PN_1 );
00852         mUpperBodyMesh4.setPickName( LLViewerJoint::PN_1 );
00853 
00854         mLowerBodyMesh0.setPickName( LLViewerJoint::PN_2 );
00855         mLowerBodyMesh1.setPickName( LLViewerJoint::PN_2 );
00856         mLowerBodyMesh2.setPickName( LLViewerJoint::PN_2 );
00857         mLowerBodyMesh3.setPickName( LLViewerJoint::PN_2 );
00858         mLowerBodyMesh4.setPickName( LLViewerJoint::PN_2 );
00859 
00860         mEyeBallLeftMesh0.setPickName( LLViewerJoint::PN_3 );
00861         mEyeBallLeftMesh1.setPickName( LLViewerJoint::PN_3 );
00862         mEyeBallRightMesh0.setPickName( LLViewerJoint::PN_3 );
00863         mEyeBallRightMesh1.setPickName( LLViewerJoint::PN_3 );
00864 
00865         mHairMesh0.setPickName( LLViewerJoint::PN_4);
00866         mHairMesh1.setPickName( LLViewerJoint::PN_4);
00867         mHairMesh2.setPickName( LLViewerJoint::PN_4);
00868         mHairMesh3.setPickName( LLViewerJoint::PN_4);
00869         mHairMesh4.setPickName( LLViewerJoint::PN_4);
00870         mHairMesh5.setPickName( LLViewerJoint::PN_4);
00871 
00872         mSkirtMesh0.setPickName( LLViewerJoint::PN_5 );
00873         mSkirtMesh1.setPickName( LLViewerJoint::PN_5 );
00874         mSkirtMesh2.setPickName( LLViewerJoint::PN_5 );
00875         mSkirtMesh3.setPickName( LLViewerJoint::PN_5 );
00876         mSkirtMesh4.setPickName( LLViewerJoint::PN_5 );
00877 
00878         // material settings
00879 
00880         mEyeBallLeftMesh0.setSpecular( LLColor4( 1.0f, 1.0f, 1.0f, 1.0f ), 1.f );
00881         mEyeBallLeftMesh1.setSpecular( LLColor4( 1.0f, 1.0f, 1.0f, 1.0f ), 1.f );
00882         mEyeBallRightMesh0.setSpecular( LLColor4( 1.0f, 1.0f, 1.0f, 1.0f ), 1.f );
00883         mEyeBallRightMesh1.setSpecular( LLColor4( 1.0f, 1.0f, 1.0f, 1.0f ), 1.f );
00884 
00885         //-------------------------------------------------------------------------
00886         // register motions
00887         //-------------------------------------------------------------------------
00888         if (LLCharacter::sInstances.size() == 1)
00889         {
00890                 LLKeyframeMotion::setVFS(gStaticVFS);
00891                 addMotion( ANIM_AGENT_BUSY,                                             LLNullMotion::create );
00892                 addMotion( ANIM_AGENT_CROUCH,                                   LLKeyframeStandMotion::create );
00893                 addMotion( ANIM_AGENT_CROUCHWALK,                               LLKeyframeWalkMotion::create );
00894                 addMotion( ANIM_AGENT_EXPRESS_AFRAID,                   LLEmote::create );
00895                 addMotion( ANIM_AGENT_EXPRESS_ANGER,                    LLEmote::create );
00896                 addMotion( ANIM_AGENT_EXPRESS_BORED,                    LLEmote::create );
00897                 addMotion( ANIM_AGENT_EXPRESS_CRY,                              LLEmote::create );
00898                 addMotion( ANIM_AGENT_EXPRESS_DISDAIN,                  LLEmote::create );
00899                 addMotion( ANIM_AGENT_EXPRESS_EMBARRASSED,              LLEmote::create );
00900                 addMotion( ANIM_AGENT_EXPRESS_FROWN,                    LLEmote::create );
00901                 addMotion( ANIM_AGENT_EXPRESS_KISS,                             LLEmote::create );
00902                 addMotion( ANIM_AGENT_EXPRESS_LAUGH,                    LLEmote::create );
00903                 addMotion( ANIM_AGENT_EXPRESS_OPEN_MOUTH,               LLEmote::create );
00904                 addMotion( ANIM_AGENT_EXPRESS_REPULSED,                 LLEmote::create );
00905                 addMotion( ANIM_AGENT_EXPRESS_SAD,                              LLEmote::create );
00906                 addMotion( ANIM_AGENT_EXPRESS_SHRUG,                    LLEmote::create );
00907                 addMotion( ANIM_AGENT_EXPRESS_SMILE,                    LLEmote::create );
00908                 addMotion( ANIM_AGENT_EXPRESS_SURPRISE,                 LLEmote::create );
00909                 addMotion( ANIM_AGENT_EXPRESS_TONGUE_OUT,               LLEmote::create );
00910                 addMotion( ANIM_AGENT_EXPRESS_TOOTHSMILE,               LLEmote::create );
00911                 addMotion( ANIM_AGENT_EXPRESS_WINK,                             LLEmote::create );
00912                 addMotion( ANIM_AGENT_EXPRESS_WORRY,                    LLEmote::create );
00913                 addMotion( ANIM_AGENT_RUN,                                              LLKeyframeWalkMotion::create );
00914                 addMotion( ANIM_AGENT_STAND,                                    LLKeyframeStandMotion::create );
00915                 addMotion( ANIM_AGENT_STAND_1,                                  LLKeyframeStandMotion::create );
00916                 addMotion( ANIM_AGENT_STAND_2,                                  LLKeyframeStandMotion::create );
00917                 addMotion( ANIM_AGENT_STAND_3,                                  LLKeyframeStandMotion::create );
00918                 addMotion( ANIM_AGENT_STAND_4,                                  LLKeyframeStandMotion::create );
00919                 addMotion( ANIM_AGENT_STANDUP,                                  LLKeyframeFallMotion::create );
00920                 addMotion( ANIM_AGENT_TURNLEFT,                                 LLKeyframeWalkMotion::create );
00921                 addMotion( ANIM_AGENT_TURNRIGHT,                                LLKeyframeWalkMotion::create );
00922                 addMotion( ANIM_AGENT_WALK,                                             LLKeyframeWalkMotion::create );
00923         
00924                 // motions without a start/stop bit
00925                 addMotion( ANIM_AGENT_BODY_NOISE,                               LLBodyNoiseMotion::create );
00926                 addMotion( ANIM_AGENT_BREATHE_ROT,                              LLBreatheMotionRot::create );
00927                 addMotion( ANIM_AGENT_EDITING,                                  LLEditingMotion::create );
00928                 addMotion( ANIM_AGENT_EYE,                                              LLEyeMotion::create     );
00929                 addMotion( ANIM_AGENT_FEMALE_WALK,                              LLKeyframeWalkMotion::create );
00930                 addMotion( ANIM_AGENT_FLY_ADJUST,                               LLFlyAdjustMotion::create );
00931                 addMotion( ANIM_AGENT_HAND_MOTION,                              LLHandMotion::create );
00932                 addMotion( ANIM_AGENT_HEAD_ROT,                                 LLHeadRotMotion::create );
00933                 addMotion( ANIM_AGENT_PELVIS_FIX,                               LLPelvisFixMotion::create );
00934                 addMotion( ANIM_AGENT_SIT_FEMALE,                               LLKeyframeMotion::create );
00935                 addMotion( ANIM_AGENT_TARGET,                                   LLTargetingMotion::create );
00936                 addMotion( ANIM_AGENT_WALK_ADJUST,                              LLWalkAdjustMotion::create );
00937         }
00938 
00939         if (gNoRender)
00940         {
00941                 return;
00942         }
00943         buildCharacter();
00944 
00945         // preload specific motions here
00946         createMotion( ANIM_AGENT_CUSTOMIZE);
00947         createMotion( ANIM_AGENT_CUSTOMIZE_DONE);
00948 
00949         //VTPause();  // VTune
00950         
00951         mVoiceVisualizer->setVoiceEnabled( gVoiceClient->getVoiceEnabled( mID ) );
00952         mCurrentGesticulationLevel = 0;         
00953 }
00954 
00955 //------------------------------------------------------------------------
00956 // LLVOAvatar::~LLVOAvatar()
00957 //------------------------------------------------------------------------
00958 LLVOAvatar::~LLVOAvatar()
00959 {
00960         lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl;
00961 
00962         if (mIsSelf)
00963         {
00964                 gAgent.setAvatarObject(NULL);
00965         }
00966 
00967         mRoot.removeAllChildren();
00968 
00969         delete [] mSkeleton;
00970         mSkeleton = NULL;
00971 
00972         delete mScreenp;
00973         mScreenp = NULL;
00974         
00975         delete [] mCollisionVolumes;
00976         mCollisionVolumes = NULL;
00977 
00978 
00979         mNumJoints = 0;
00980 
00981         delete mHeadLayerSet;
00982         mHeadLayerSet = NULL;
00983 
00984         delete mUpperBodyLayerSet;
00985         mUpperBodyLayerSet = NULL;
00986 
00987         delete mLowerBodyLayerSet;
00988         mLowerBodyLayerSet = NULL;
00989 
00990         delete mEyesLayerSet;
00991         mEyesLayerSet = NULL;
00992 
00993         delete mSkirtLayerSet;
00994         mSkirtLayerSet = NULL;
00995 
00996         std::for_each(mAttachmentPoints.begin(), mAttachmentPoints.end(), DeletePairedPointer());
00997         mAttachmentPoints.clear();
00998 
00999         delete mTexSkinColor;
01000         mTexSkinColor = NULL;
01001         delete mTexHairColor;
01002         mTexHairColor = NULL;
01003         delete mTexEyeColor;
01004         mTexEyeColor = NULL;
01005 
01006         std::for_each(mMeshes.begin(), mMeshes.end(), DeletePairedPointer());
01007         mMeshes.clear();
01008         
01009         mDead = TRUE;
01010         
01011         // Clean up class data
01012         LLVOAvatar::cullAvatarsByPixelArea();
01013 
01014         mAnimationSources.clear();
01015 
01016         lldebugs << "LLVOAvatar Destructor end" << llendl;
01017 }
01018 
01019 void LLVOAvatar::markDead()
01020 {
01021         if (mNameText)
01022         {
01023                 mNameText->markDead();
01024                 mNameText = NULL;
01025                 sNumVisibleChatBubbles--;
01026         }
01027 
01028         mVoiceVisualizer->markDead();
01029 
01030         mBeam = NULL;
01031         LLViewerObject::markDead();
01032 }
01033 
01034 
01035 BOOL LLVOAvatar::isFullyBaked()
01036 {
01037         if (mIsDummy) return TRUE;
01038         if (getNumTEs() == 0) return FALSE;
01039         
01040         BOOL head_baked = ( getTEImage( TEX_HEAD_BAKED )->getID() != IMG_DEFAULT_AVATAR );
01041         BOOL upper_baked = ( getTEImage( TEX_UPPER_BAKED )->getID() != IMG_DEFAULT_AVATAR );
01042         BOOL lower_baked = ( getTEImage( TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR );
01043         BOOL eyes_baked = ( getTEImage( TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR );
01044         BOOL skirt_baked = ( getTEImage( TEX_SKIRT_BAKED )->getID() != IMG_DEFAULT_AVATAR );
01045 
01046         if (isWearingWearableType(WT_SKIRT))
01047         {
01048                 return head_baked && upper_baked && lower_baked && eyes_baked && skirt_baked;
01049         }
01050         else
01051         {
01052                 return head_baked && upper_baked && lower_baked && eyes_baked;
01053         }
01054 }
01055 
01056 void LLVOAvatar::deleteLayerSetCaches()
01057 {
01058         if( mHeadLayerSet )                     mHeadLayerSet->deleteCaches();
01059         if( mUpperBodyLayerSet )        mUpperBodyLayerSet->deleteCaches();
01060         if( mLowerBodyLayerSet )        mLowerBodyLayerSet->deleteCaches();
01061         if( mEyesLayerSet )                     mEyesLayerSet->deleteCaches();
01062         if( mSkirtLayerSet )            mSkirtLayerSet->deleteCaches();
01063 }
01064 
01065 // static 
01066 BOOL LLVOAvatar::areAllNearbyInstancesBaked()
01067 {
01068         for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
01069                 iter != LLCharacter::sInstances.end(); ++iter)
01070         {
01071                 LLVOAvatar* inst = (LLVOAvatar*) *iter;
01072                 if( inst->isDead() )
01073                 {
01074                         continue;
01075                 }
01076                 else
01077                 if( inst->getPixelArea() < MIN_PIXEL_AREA_FOR_COMPOSITE )
01078                 {
01079                         return TRUE;  // Assumes sInstances is sorted by pixel area.
01080                 }
01081                 else
01082                 if( !inst->isFullyBaked() )
01083                 {
01084                         return FALSE;
01085                 }
01086         }
01087         return TRUE;
01088 }
01089 
01090 // static 
01091 void LLVOAvatar::dumpScratchTextureByteCount()
01092 {
01093         llinfos << "Scratch Texture GL: " << (sScratchTexBytes/1024) << "KB" << llendl;
01094 }
01095 
01096 // static
01097 void LLVOAvatar::dumpBakedStatus()
01098 {
01099         LLVector3d camera_pos_global = gAgent.getCameraPositionGlobal();
01100 
01101         for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
01102                 iter != LLCharacter::sInstances.end(); ++iter)
01103         {
01104                 LLVOAvatar* inst = (LLVOAvatar*) *iter;
01105                 llinfos << "Avatar ";
01106 
01107                 LLNameValue* firstname = inst->getNVPair("FirstName");
01108                 LLNameValue* lastname = inst->getNVPair("LastName");
01109 
01110                 if( firstname )
01111                 {
01112                         llcont << firstname->getString();
01113                 }
01114                 if( lastname )
01115                 {
01116                         llcont << " " << lastname->getString();
01117                 }
01118 
01119                 llcont << " " << inst->mID;
01120 
01121                 if( inst->isDead() )
01122                 {
01123                         llcont << " DEAD ("<< inst->getNumRefs() << " refs)";
01124                 }
01125 
01126                 if( inst->mIsSelf )
01127                 {
01128                         llcont << " (self)";
01129                 }
01130 
01131 
01132                 F64 dist_to_camera = (inst->getPositionGlobal() - camera_pos_global).magVec();
01133                 llcont << " " << dist_to_camera << "m ";
01134 
01135                 llcont << " " << inst->mPixelArea << " pixels";
01136 
01137                 if( inst->isVisible() )
01138                 {
01139                         llcont << " (visible)";
01140                 }
01141                 else
01142                 {
01143                         llcont << " (not visible)";
01144                 }
01145 
01146                 if( inst->isFullyBaked() )
01147                 {
01148                         llcont << " Baked";
01149                 }
01150                 else
01151                 {
01152                         llcont << " Unbaked (";
01153                         if( inst->getTEImage( TEX_HEAD_BAKED )->getID()  == IMG_DEFAULT_AVATAR )
01154                         {
01155                                 llcont << " head";
01156                         }
01157 
01158                         if( inst->getTEImage( TEX_UPPER_BAKED )->getID() == IMG_DEFAULT_AVATAR )
01159                         {
01160                                 llcont << " upper";
01161                         }
01162 
01163                         if( inst->getTEImage( TEX_LOWER_BAKED )->getID() == IMG_DEFAULT_AVATAR )
01164                         {
01165                                 llcont << " lower";
01166                         }
01167 
01168                         if( inst->getTEImage( TEX_EYES_BAKED )->getID()  == IMG_DEFAULT_AVATAR )
01169                         {
01170                                 llcont << " eyes";
01171                         }
01172 
01173                         if (inst->isWearingWearableType(WT_SKIRT))
01174                         {
01175                                 if( inst->getTEImage( TEX_SKIRT_BAKED )->getID()  == IMG_DEFAULT_AVATAR )
01176                                 {
01177                                         llcont << " skirt";
01178                                 }
01179                         }
01180 
01181                         llcont << " ) " << inst->getUnbakedPixelAreaRank() << "/" << LLVOAvatar::sMaxOtherAvatarsToComposite;
01182                         if( inst->isCulled() )
01183                         {
01184                                 llcont << " culled";
01185                         }
01186                 }
01187                 llcont << llendl;
01188 /*
01189                 if( inst->isDead() )
01190                 {
01191                         llinfos << "DEAD LIST " << llendl;
01192 
01193                         
01194                         for( S32 i = 0; i < inst->mOwners.count(); i++ )
01195                         {
01196                                 llinfos << i << llendl;
01197                                 LLPointer<LLViewerObject>* owner = (LLPointer<LLViewerObject>*)(inst->mOwners[i]);
01198                                 LLPointer<LLViewerObject>* cur;
01199                                 if( !owner->mName.isEmpty() )
01200                                 {
01201                                         llinfos << "    " << owner->mName << llendl;
01202                                 }
01203 
01204                                 LLViewerObject* key_vo;
01205                                 for( key_vo = gObjectList.mActiveObjects.getFirstKey(); key_vo; key_vo = gObjectList.mActiveObjects.getNextKey() )
01206                                 {
01207                                         cur = &(gObjectList.mActiveObjects.getCurrentDataWithoutIncrement());
01208                                         if( cur == owner )
01209                                         {
01210                                                 llinfos << "    gObjectList.mActiveObjects" << llendl;
01211                                         }
01212                                 }
01213 
01214                                 for( key_vo = gObjectList.mAvatarObjects.getFirstKey(); key_vo; key_vo = gObjectList.mAvatarObjects.getNextKey() )
01215                                 {
01216                                         cur = &(gObjectList.mAvatarObjects.getCurrentDataWithoutIncrement());   
01217                                         if( cur == owner )
01218                                         {
01219                                                 llinfos << "    gObjectList.mAvatarObjects" << llendl;
01220                                         }
01221                                 }
01222 
01223                                 LLUUID id;
01224                                 for( id = gObjectList.mDeadObjects.getFirstKey(); id; id = gObjectList.mDeadObjects.getNextKey() )
01225                                 {
01226                                         cur = &(gObjectList.mDeadObjects.getCurrentDataWithoutIncrement());
01227                                         if( cur == owner )
01228                                         {
01229                                                 llinfos << "    gObjectList.mDeadObjects" << llendl;
01230                                         }
01231                                 }
01232 
01233 
01234                                 for( id = gObjectList.mUUIDObjectMap.getFirstKey(); id; id = gObjectList.mUUIDObjectMap.getNextKey() )
01235                                 {
01236                                         cur = &(gObjectList.mUUIDObjectMap.getCurrentDataWithoutIncrement());
01237                                         if( cur == owner )
01238                                         {
01239                                                 llinfos << "    gObjectList.mUUIDObjectMap" << llendl;
01240                                         }
01241                                 }
01242 
01243                                 S32 j;
01244                                 S32 k;
01245                                 for( j = 0; j < 16; j++ )
01246                                 {
01247                                         for( k = 0; k < 10; k++ )
01248                                         {
01249                                                 cur = &(gObjectList.mCloseObjects[j][k]);
01250                                                 if( cur == owner )
01251                                                 {
01252                                                         llinfos << "    gObjectList.mCloseObjects" << llendl;
01253                                                 }
01254                                         }
01255                                 }
01256 
01257                                 for( j = 0; j < gObjectList.mObjects.count(); j++ )
01258                                 {
01259                                         cur = &(gObjectList.mObjects[j]);
01260                                         if( cur == owner )
01261                                         {
01262                                                 llinfos << "    gObjectList.mObjects" << llendl;
01263                                         }
01264                                 }
01265 
01266                                 for( j = 0; j < gObjectList.mMapObjects.count(); j++ )
01267                                 {
01268                                         cur = &(gObjectList.mMapObjects[j]);
01269                                         if( cur == owner )
01270                                         {
01271                                                 llinfos << "    gObjectList.mMapObjects" << llendl;
01272                                         }
01273                                 }
01274                         }
01275                 }
01276                 */
01277         }
01278 }
01279 
01280 //static
01281 void LLVOAvatar::restoreGL()
01282 {
01283         for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
01284                 iter != LLCharacter::sInstances.end(); ++iter)
01285         {
01286                 LLVOAvatar* inst = (LLVOAvatar*) *iter;
01287                 inst->setCompositeUpdatesEnabled( TRUE );
01288                 inst->invalidateComposite( inst->mHeadLayerSet,         FALSE );
01289                 inst->invalidateComposite( inst->mLowerBodyLayerSet,    FALSE );
01290                 inst->invalidateComposite( inst->mUpperBodyLayerSet,    FALSE );
01291                 inst->invalidateComposite( inst->mEyesLayerSet, FALSE );
01292                 inst->invalidateComposite( inst->mSkirtLayerSet,        FALSE );
01293                 inst->updateMeshTextures();
01294         }
01295 }
01296 
01297 //static
01298 void LLVOAvatar::destroyGL()
01299 {
01300         deleteCachedImages();
01301 
01302         resetImpostors();
01303 }
01304 
01305 //static
01306 void LLVOAvatar::resetImpostors()
01307 {
01308         for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
01309                 iter != LLCharacter::sInstances.end(); ++iter)
01310         {
01311                 LLVOAvatar* avatar = (LLVOAvatar*) *iter;
01312                 avatar->mImpostor.release();
01313         }
01314 }
01315 
01316 // static
01317 void LLVOAvatar::deleteCachedImages()
01318 {
01319         if (LLTexLayerSet::sHasCaches)
01320         {
01321                 lldebugs << "Deleting layer set caches" << llendl;
01322                 for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
01323                 iter != LLCharacter::sInstances.end(); ++iter)
01324                 {
01325                         LLVOAvatar* inst = (LLVOAvatar*) *iter;
01326                         inst->deleteLayerSetCaches();
01327                 }
01328                 LLTexLayerSet::sHasCaches = FALSE;
01329         }
01330         
01331         for( GLuint* namep = (GLuint*)sScratchTexNames.getFirstData(); 
01332                  namep; 
01333                  namep = (GLuint*)sScratchTexNames.getNextData() )
01334         {
01335                 glDeleteTextures(1, namep );
01336                 stop_glerror();
01337         }
01338 
01339         if( sScratchTexBytes )
01340         {
01341                 lldebugs << "Clearing Scratch Textures " << (sScratchTexBytes/1024) << "KB" << llendl;
01342 
01343                 sScratchTexNames.deleteAllData();
01344                 LLVOAvatar::sScratchTexLastBindTime.deleteAllData();
01345                 LLImageGL::sGlobalTextureMemory -= sScratchTexBytes;
01346                 sScratchTexBytes = 0;
01347         }
01348 
01349         gTexStaticImageList.deleteCachedImages();
01350 }
01351 
01352 
01353 //------------------------------------------------------------------------
01354 // static
01355 // LLVOAvatar::initClass()
01356 //------------------------------------------------------------------------
01357 void LLVOAvatar::initClass()
01358 { 
01359         LLVOAvatar::sMaxOtherAvatarsToComposite = gSavedSettings.getS32("AvatarCompositeLimit");
01360 
01361         char xmlFile[MAX_PATH];         /* Flawfinder: ignore */
01362 
01363         snprintf(xmlFile, MAX_PATH, "%s_lad.xml", gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,AVATAR_DEFAULT_CHAR).c_str());               /* Flawfinder: ignore */
01364         BOOL success = sXMLTree.parseFile( xmlFile, FALSE );
01365         if (!success)
01366         {
01367                 llerrs << "Problem reading avatar configuration file:" << xmlFile << llendl;
01368         }
01369 
01370         // now sanity check xml file
01371         LLXmlTreeNode* root = sXMLTree.getRoot();
01372         if (!root) 
01373         {
01374                 llerrs << "No root node found in avatar configuration file: " << xmlFile << llendl;
01375                 return;
01376         }
01377 
01378         //-------------------------------------------------------------------------
01379         // <linden_avatar version="1.0"> (root)
01380         //-------------------------------------------------------------------------
01381         if( !root->hasName( "linden_avatar" ) )
01382         {
01383                 llerrs << "Invalid avatar file header: " << xmlFile << llendl;
01384         }
01385         
01386         LLString version;
01387         static LLStdStringHandle version_string = LLXmlTree::addAttributeString("version");
01388         if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") )
01389         {
01390                 llerrs << "Invalid avatar file version: " << version << " in file: " << xmlFile << llendl;
01391         }
01392 
01393         S32 wearable_def_version = 1;
01394         static LLStdStringHandle wearable_definition_version_string = LLXmlTree::addAttributeString("wearable_definition_version");
01395         root->getFastAttributeS32( wearable_definition_version_string, wearable_def_version );
01396         LLWearable::setCurrentDefinitionVersion( wearable_def_version );
01397 
01398         LLString mesh_file_name;
01399 
01400         LLXmlTreeNode* skeleton_node = root->getChildByName( "skeleton" );
01401         if (!skeleton_node)
01402         {
01403                 llerrs << "No skeleton in avatar configuration file: " << xmlFile << llendl;
01404                 return;
01405         }
01406         
01407         LLString skeleton_file_name;
01408         static LLStdStringHandle file_name_string = LLXmlTree::addAttributeString("file_name");
01409         if (!skeleton_node->getFastAttributeString(file_name_string, skeleton_file_name))
01410         {
01411                 llerrs << "No file name in skeleton node in avatar config file: " << xmlFile << llendl;
01412         }
01413         
01414         std::string skeleton_path;
01415         skeleton_path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,skeleton_file_name);
01416         if (!parseSkeletonFile(skeleton_path))
01417         {
01418                 llerrs << "Error parsing skeleton file: " << skeleton_path << llendl;
01419         }
01420 
01421         // Process XML data
01422 
01423         // avatar_skeleton.xml
01424         llassert(!sSkeletonInfo);
01425         sSkeletonInfo = new LLVOAvatarSkeletonInfo;
01426         if (!sSkeletonInfo->parseXml(sSkeletonXMLTree.getRoot()))
01427         {
01428                 llerrs << "Error parsing skeleton XML file: " << skeleton_path << llendl;
01429         }
01430         // parse avatar_lad.xml
01431         llassert(!sAvatarInfo);
01432         sAvatarInfo = new LLVOAvatarInfo;
01433         if (!sAvatarInfo->parseXmlSkeletonNode(root))
01434         {
01435                 llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
01436         }
01437         if (!sAvatarInfo->parseXmlMeshNodes(root))
01438         {
01439                 llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
01440         }
01441         if (!sAvatarInfo->parseXmlColorNodes(root))
01442         {
01443                 llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
01444         }
01445         if (!sAvatarInfo->parseXmlLayerNodes(root))
01446         {
01447                 llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
01448         }
01449         if (!sAvatarInfo->parseXmlDriverNodes(root))
01450         {
01451                 llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
01452         }
01453 }
01454 
01455 
01456 void LLVOAvatar::cleanupClass()
01457 {
01458         delete sAvatarInfo;
01459         sAvatarInfo = NULL;
01460         delete sSkeletonInfo;
01461         sSkeletonInfo = NULL;
01462         sSkeletonXMLTree.cleanup();
01463         sXMLTree.cleanup();
01464 }
01465 
01466 const LLVector3 LLVOAvatar::getRenderPosition() const
01467 {
01468         if (mDrawable.isNull() || mDrawable->getGeneration() < 0)
01469         {
01470                 return getPositionAgent();
01471         }
01472         else if (isRoot())
01473         {
01474                 return mDrawable->getPositionAgent();
01475         }
01476         else
01477         {
01478                 return getPosition() * mDrawable->getParent()->getRenderMatrix();
01479         }
01480 }
01481 
01482 void LLVOAvatar::updateDrawable(BOOL force_damped)
01483 {
01484         clearChanged(SHIFTED);
01485 }
01486 
01487 void LLVOAvatar::onShift(const LLVector3& shift_vector)
01488 {
01489         mLastAnimExtents[0] += shift_vector;
01490         mLastAnimExtents[1] += shift_vector;
01491         mNeedsImpostorUpdate = TRUE;
01492         mNeedsAnimUpdate = TRUE;
01493 }
01494 
01495 void LLVOAvatar::updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax)
01496 {
01497         if (isImpostor() && !needsImpostorUpdate())
01498         {
01499                 LLVector3 delta = getRenderPosition() -
01500                         ((LLVector3(mDrawable->getPositionGroup())-mImpostorOffset));
01501                 
01502                 newMin = mLastAnimExtents[0] + delta;
01503                 newMax = mLastAnimExtents[1] + delta;
01504         }
01505         else
01506         {
01507                 getSpatialExtents(newMin,newMax);
01508                 mLastAnimExtents[0] = newMin;
01509                 mLastAnimExtents[1] = newMax;
01510                 LLVector3 pos_group = (newMin+newMax)*0.5f;
01511                 mImpostorOffset = pos_group-getRenderPosition();
01512                 mDrawable->setPositionGroup(pos_group);
01513         }
01514 }
01515 
01516 void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax)
01517 {
01518         LLVector3 buffer(0.25f, 0.25f, 0.25f);
01519         LLVector3 pos = getRenderPosition();
01520         newMin = pos - buffer;
01521         newMax = pos + buffer;
01522         
01523         //stretch bounding box by joint positions
01524         for (mesh_map_t::iterator i = mMeshes.begin(); i != mMeshes.end(); ++i)
01525         {
01526                 LLPolyMesh* mesh = i->second;
01527                 for (S32 joint_num = 0; joint_num < mesh->mJointRenderData.count(); joint_num++)
01528                 {
01529                         update_min_max(newMin, newMax, 
01530                                                         mesh->mJointRenderData[joint_num]->mWorldMatrix->getTranslation());
01531                 }
01532         }
01533 
01534         //stretch bounding box by attachments
01535         for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
01536                 iter != mAttachmentPoints.end();
01537                 ++iter)
01538         {
01539                 LLViewerJointAttachment* attachment = iter->second;
01540 
01541                 if(!attachment->getValid())
01542                 {
01543                         continue ;
01544                 }
01545 
01546                 LLViewerObject* object = attachment->getObject();
01547                 if (object && !object->isHUDAttachment())
01548                 {
01549                         LLDrawable* drawable = object->mDrawable;
01550                         if (drawable)
01551                         {
01552                                 LLSpatialBridge* bridge = drawable->getSpatialBridge();
01553                                 if (bridge)
01554                                 {
01555                                         const LLVector3* ext = bridge->getSpatialExtents();
01556                                         update_min_max(newMin,newMax,ext[0]);
01557                                         update_min_max(newMin,newMax,ext[1]);
01558                                 }
01559                         }
01560                 }
01561         }
01562 
01563         //pad bounding box      
01564         newMin -= buffer;
01565         newMax += buffer;
01566 }
01567 
01568 
01569 //-----------------------------------------------------------------------------
01570 // parseSkeletonFile()
01571 //-----------------------------------------------------------------------------
01572 BOOL LLVOAvatar::parseSkeletonFile(const LLString& filename)
01573 {
01574         LLMemType mt(LLMemType::MTYPE_AVATAR);
01575         
01576         //-------------------------------------------------------------------------
01577         // parse the file
01578         //-------------------------------------------------------------------------
01579         BOOL success = sSkeletonXMLTree.parseFile( filename, FALSE );
01580 
01581         if (!success)
01582         {
01583                 llerrs << "Can't parse skeleton file: " << filename << llendl;
01584                 return FALSE;
01585         }
01586 
01587         // now sanity check xml file
01588         LLXmlTreeNode* root = sSkeletonXMLTree.getRoot();
01589         if (!root) 
01590         {
01591                 llerrs << "No root node found in avatar skeleton file: " << filename << llendl;
01592         }
01593 
01594         if( !root->hasName( "linden_skeleton" ) )
01595         {
01596                 llerrs << "Invalid avatar skeleton file header: " << filename << llendl;
01597         }
01598 
01599         LLString version;
01600         static LLStdStringHandle version_string = LLXmlTree::addAttributeString("version");
01601         if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") )
01602         {
01603                 llerrs << "Invalid avatar skeleton file version: " << version << " in file: " << filename << llendl;
01604         }
01605 
01606         return TRUE;
01607 }
01608 
01609 //-----------------------------------------------------------------------------
01610 // setupBone()
01611 //-----------------------------------------------------------------------------
01612 BOOL LLVOAvatar::setupBone(LLVOAvatarBoneInfo* info, LLViewerJoint* parent)
01613 {
01614         LLMemType mt(LLMemType::MTYPE_AVATAR);
01615         
01616         LLViewerJoint* joint = NULL;
01617 
01618         if (info->mIsJoint)
01619         {
01620                 joint = (LLViewerJoint*)getCharacterJoint(sCurJoint);
01621                 if (!joint)
01622                 {
01623                         llwarns << "Too many bones" << llendl;
01624                         return FALSE;
01625                 }
01626                 joint->setName( info->mName );
01627         }
01628         else // collision volume
01629         {
01630                 if (sCurVolume >= (S32)mNumCollisionVolumes)
01631                 {
01632                         llwarns << "Too many bones" << llendl;
01633                         return FALSE;
01634                 }
01635                 joint = (LLViewerJoint*)(&mCollisionVolumes[sCurVolume]);
01636 
01637                 joint->setName( info->mName );
01638         }
01639 
01640         // add to parent
01641         if (parent)
01642         {
01643                 parent->addChild( joint );
01644         }
01645 
01646         joint->setPosition(info->mPos);
01647 
01648         joint->setRotation(mayaQ(info->mRot.mV[VX], info->mRot.mV[VY],
01649                                                          info->mRot.mV[VZ], LLQuaternion::XYZ));
01650 
01651         joint->setScale(info->mScale);
01652 
01653 
01654         if (info->mIsJoint)
01655         {
01656                 joint->setSkinOffset( info->mPivot );
01657                 sCurJoint++;
01658         }
01659         else // collision volume
01660         {
01661                 sCurVolume++;
01662         }
01663 
01664         // setup children
01665         LLVOAvatarBoneInfo::child_list_t::iterator iter;
01666         for (iter = info->mChildList.begin(); iter != info->mChildList.end(); iter++)
01667         {
01668                 LLVOAvatarBoneInfo *child_info = *iter;
01669                 if (!setupBone(child_info, joint))
01670                 {
01671                         return FALSE;
01672                 }
01673         }
01674 
01675         return TRUE;
01676 }
01677 
01678 //-----------------------------------------------------------------------------
01679 // buildSkeleton()
01680 //-----------------------------------------------------------------------------
01681 BOOL LLVOAvatar::buildSkeleton(LLVOAvatarSkeletonInfo *info)
01682 {
01683         LLMemType mt(LLMemType::MTYPE_AVATAR);
01684         
01685         //-------------------------------------------------------------------------
01686         // allocate joints
01687         //-------------------------------------------------------------------------
01688         if (!allocateCharacterJoints(info->mNumBones))
01689         {
01690                 llerrs << "Can't allocate " << info->mNumBones << " joints" << llendl;
01691                 return FALSE;
01692         }
01693         
01694         //-------------------------------------------------------------------------
01695         // allocate volumes
01696         //-------------------------------------------------------------------------
01697         if (info->mNumCollisionVolumes)
01698         {
01699                 if (!allocateCollisionVolumes(info->mNumCollisionVolumes))
01700                 {
01701                         llerrs << "Can't allocate " << info->mNumCollisionVolumes << " collision volumes" << llendl;
01702                         return FALSE;
01703                 }
01704         }
01705 
01706         sCurJoint = 0;
01707         sCurVolume = 0;
01708 
01709         LLVOAvatarSkeletonInfo::bone_info_list_t::iterator iter;
01710         for (iter = info->mBoneInfoList.begin(); iter != info->mBoneInfoList.end(); iter++)
01711         {
01712                 LLVOAvatarBoneInfo *info = *iter;
01713                 if (!setupBone(info, NULL))
01714                 {
01715                         llerrs << "Error parsing bone in skeleton file" << llendl;
01716                         return FALSE;
01717                 }
01718         }
01719 
01720         // add special-purpose "screen" joint
01721         if (mIsSelf)
01722         {
01723                 mScreenp = new LLViewerJoint("mScreen", NULL);
01724                 // for now, put screen at origin, as it is only used during special
01725                 // HUD rendering mode
01726                 F32 aspect = LLViewerCamera::getInstance()->getAspect();
01727                 LLVector3 scale(1.f, aspect, 1.f);
01728                 mScreenp->setScale(scale);
01729                 mScreenp->setWorldPosition(LLVector3::zero);
01730         }
01731 
01732         return TRUE;
01733 }
01734 
01735 //-----------------------------------------------------------------------------
01736 // LLVOAvatar::buildCharacter()
01737 // Deferred initialization and rebuild of the avatar.
01738 //-----------------------------------------------------------------------------
01739 void LLVOAvatar::buildCharacter()
01740 {
01741         LLMemType mt(LLMemType::MTYPE_AVATAR);
01742         
01743         //-------------------------------------------------------------------------
01744         // remove all references to our existing skeleton
01745         // so we can rebuild it
01746         //-------------------------------------------------------------------------
01747         flushAllMotions();
01748 
01749         //-------------------------------------------------------------------------
01750         // remove all of mRoot's children
01751         //-------------------------------------------------------------------------
01752         mRoot.removeAllChildren();
01753         mIsBuilt = FALSE;
01754 
01755         //-------------------------------------------------------------------------
01756         // clear mesh data
01757         //-------------------------------------------------------------------------
01758         mHairMesh0.setMesh(NULL);
01759         mHairMesh1.setMesh(NULL);
01760         mHairMesh2.setMesh(NULL);
01761         mHairMesh3.setMesh(NULL);
01762         mHairMesh4.setMesh(NULL);
01763         mHairMesh5.setMesh(NULL);
01764 
01765         mHeadMesh0.setMesh(NULL);
01766         mHeadMesh1.setMesh(NULL);
01767         mHeadMesh2.setMesh(NULL);
01768         mHeadMesh3.setMesh(NULL);
01769         mHeadMesh4.setMesh(NULL);
01770 
01771         mEyeLashMesh0.setMesh(NULL);
01772 
01773         mUpperBodyMesh0.setMesh(NULL);
01774         mUpperBodyMesh1.setMesh(NULL);
01775         mUpperBodyMesh2.setMesh(NULL);
01776         mUpperBodyMesh3.setMesh(NULL);
01777         mUpperBodyMesh4.setMesh(NULL);
01778 
01779         mLowerBodyMesh0.setMesh(NULL);
01780         mLowerBodyMesh1.setMesh(NULL);
01781         mLowerBodyMesh2.setMesh(NULL);
01782         mLowerBodyMesh3.setMesh(NULL);
01783         mLowerBodyMesh4.setMesh(NULL);
01784 
01785         mEyeBallLeftMesh0.setMesh(NULL);
01786         mEyeBallLeftMesh1.setMesh(NULL);
01787         mEyeBallRightMesh0.setMesh(NULL);
01788         mEyeBallRightMesh1.setMesh(NULL);
01789 
01790         mSkirtMesh0.setMesh(NULL);
01791         mSkirtMesh1.setMesh(NULL);
01792         mSkirtMesh2.setMesh(NULL);
01793         mSkirtMesh3.setMesh(NULL);
01794         mSkirtMesh4.setMesh(NULL);      
01795 
01796         //-------------------------------------------------------------------------
01797         // (re)load our skeleton and meshes
01798         //-------------------------------------------------------------------------
01799         LLTimer timer;
01800 
01801         BOOL status = loadAvatar();
01802         stop_glerror();
01803 
01804         if (gNoRender)
01805         {
01806                 // Still want to load the avatar skeleton so visual parameters work.
01807                 return;
01808         }
01809 
01810 //      gPrintMessagesThisFrame = TRUE;
01811         lldebugs << "Avatar load took " << timer.getElapsedTimeF32() << " seconds." << llendl;
01812 
01813         if ( ! status )
01814         {
01815                 if ( mIsSelf )
01816                 {
01817                         llerrs << "Unable to load user's avatar" << llendl;
01818                         //set_avatar_character( &LLString(AVATAR_DEFAULT_CHAR));
01819                 }
01820                 else
01821                 {
01822                         llwarns << "Unable to load other's avatar" << llendl;
01823                 }
01824                 return;
01825         }
01826 
01827         //-------------------------------------------------------------------------
01828         // initialize "well known" joint pointers
01829         //-------------------------------------------------------------------------
01830         mPelvisp                = (LLViewerJoint*)mRoot.findJoint("mPelvis");
01831         mTorsop                 = (LLViewerJoint*)mRoot.findJoint("mTorso");
01832         mChestp                 = (LLViewerJoint*)mRoot.findJoint("mChest");
01833         mNeckp                  = (LLViewerJoint*)mRoot.findJoint("mNeck");
01834         mHeadp                  = (LLViewerJoint*)mRoot.findJoint("mHead");
01835         mSkullp                 = (LLViewerJoint*)mRoot.findJoint("mSkull");
01836         mHipLeftp               = (LLViewerJoint*)mRoot.findJoint("mHipLeft");
01837         mHipRightp              = (LLViewerJoint*)mRoot.findJoint("mHipRight");
01838         mKneeLeftp              = (LLViewerJoint*)mRoot.findJoint("mKneeLeft");
01839         mKneeRightp             = (LLViewerJoint*)mRoot.findJoint("mKneeRight");
01840         mAnkleLeftp             = (LLViewerJoint*)mRoot.findJoint("mAnkleLeft");
01841         mAnkleRightp    = (LLViewerJoint*)mRoot.findJoint("mAnkleRight");
01842         mFootLeftp              = (LLViewerJoint*)mRoot.findJoint("mFootLeft");
01843         mFootRightp             = (LLViewerJoint*)mRoot.findJoint("mFootRight");
01844         mWristLeftp             = (LLViewerJoint*)mRoot.findJoint("mWristLeft");
01845         mWristRightp    = (LLViewerJoint*)mRoot.findJoint("mWristRight");
01846         mEyeLeftp               = (LLViewerJoint*)mRoot.findJoint("mEyeLeft");
01847         mEyeRightp              = (LLViewerJoint*)mRoot.findJoint("mEyeRight");
01848 
01849         //-------------------------------------------------------------------------
01850         // Make sure "well known" pointers exist
01851         //-------------------------------------------------------------------------
01852         if (!(mPelvisp && 
01853                 mTorsop &&
01854                 mChestp &&
01855                 mNeckp &&
01856                 mHeadp &&
01857                 mSkullp &&
01858                 mHipLeftp &&
01859                 mHipRightp &&
01860                 mKneeLeftp &&
01861                 mKneeRightp &&
01862                 mAnkleLeftp &&
01863                 mAnkleRightp &&
01864                 mFootLeftp &&
01865                 mFootRightp &&
01866                 mWristLeftp &&
01867                 mWristRightp &&
01868                 mEyeLeftp &&
01869                 mEyeRightp))
01870         {
01871                 llerrs << "Failed to create avatar." << llendl;
01872                 return;
01873         }
01874 
01875         //-------------------------------------------------------------------------
01876         // initialize the pelvis
01877         //-------------------------------------------------------------------------
01878         mPelvisp->setPosition( LLVector3(0.0f, 0.0f, 0.0f) );
01879         
01880         //-------------------------------------------------------------------------
01881         // set head offset from pelvis
01882         //-------------------------------------------------------------------------
01883         updateHeadOffset();
01884 
01885         //-------------------------------------------------------------------------
01886         // initialize lip sync morph pointers
01887         //-------------------------------------------------------------------------
01888         mOohMorph     = getVisualParam( "Lipsync_Ooh" );
01889         mAahMorph     = getVisualParam( "Lipsync_Aah" );
01890 
01891         // If we don't have the Ooh morph, use the Kiss morph
01892         if (!mOohMorph)
01893         {
01894                 llwarns << "Missing 'Ooh' morph for lipsync, using fallback." << llendl;
01895                 mOohMorph = getVisualParam( "Express_Kiss" );
01896         }
01897 
01898         // If we don't have the Aah morph, use the Open Mouth morph
01899         if (!mAahMorph)
01900         {
01901                 llwarns << "Missing 'Aah' morph for lipsync, using fallback." << llendl;
01902                 mAahMorph = getVisualParam( "Express_Open_Mouth" );
01903         }
01904 
01905         //-------------------------------------------------------------------------
01906         // start default motions
01907         //-------------------------------------------------------------------------
01908         startMotion( ANIM_AGENT_HEAD_ROT );
01909         startMotion( ANIM_AGENT_EYE );
01910         startMotion( ANIM_AGENT_BODY_NOISE );
01911         startMotion( ANIM_AGENT_BREATHE_ROT );
01912         startMotion( ANIM_AGENT_HAND_MOTION );
01913         startMotion( ANIM_AGENT_PELVIS_FIX );
01914 
01915         //-------------------------------------------------------------------------
01916         // restart any currently active motions
01917         //-------------------------------------------------------------------------
01918         processAnimationStateChanges();
01919 
01920         mIsBuilt = TRUE;
01921         stop_glerror();
01922 
01923         //-------------------------------------------------------------------------
01924         // build the attach and detach menus
01925         //-------------------------------------------------------------------------
01926         if (mIsSelf)
01927         {
01928                 gAttachBodyPartPieMenus[0] = NULL;
01929                 gAttachBodyPartPieMenus[1] = new LLPieMenu("Right Arm >");
01930                 gAttachBodyPartPieMenus[2] = new LLPieMenu("Head >");
01931                 gAttachBodyPartPieMenus[3] = new LLPieMenu("Left Arm >");
01932                 gAttachBodyPartPieMenus[4] = NULL;
01933                 gAttachBodyPartPieMenus[5] = new LLPieMenu("Left Leg >");
01934                 gAttachBodyPartPieMenus[6] = new LLPieMenu("Torso >");
01935                 gAttachBodyPartPieMenus[7] = new LLPieMenu("Right Leg >");
01936 
01937                 gDetachBodyPartPieMenus[0] = NULL;
01938                 gDetachBodyPartPieMenus[1] = new LLPieMenu("Right Arm >");
01939                 gDetachBodyPartPieMenus[2] = new LLPieMenu("Head >");
01940                 gDetachBodyPartPieMenus[3] = new LLPieMenu("Left Arm >");
01941                 gDetachBodyPartPieMenus[4] = NULL;
01942                 gDetachBodyPartPieMenus[5] = new LLPieMenu("Left Leg >");
01943                 gDetachBodyPartPieMenus[6] = new LLPieMenu("Torso >");
01944                 gDetachBodyPartPieMenus[7] = new LLPieMenu("Right Leg >");
01945 
01946                 for (S32 i = 0; i < 8; i++)
01947                 {
01948                         if (gAttachBodyPartPieMenus[i])
01949                         {
01950                                 gAttachPieMenu->appendPieMenu( gAttachBodyPartPieMenus[i] );
01951                         }
01952                         else
01953                         {
01954                                 BOOL attachment_found = FALSE;
01955                                 for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
01956                                          iter != mAttachmentPoints.end(); )
01957                                 {
01958                                         attachment_map_t::iterator curiter = iter++;
01959                                         LLViewerJointAttachment* attachment = curiter->second;
01960                                         if (attachment->getGroup() == i)
01961                                         {
01962                                                 LLMenuItemCallGL* item;
01963                                                 item = new LLMenuItemCallGL(attachment->getName(), 
01964                                                                                                         NULL, 
01965                                                                                                         object_selected_and_point_valid);
01966                                                 item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", curiter->first);
01967                                                 
01968                                                 gAttachPieMenu->append(item);
01969 
01970                                                 attachment_found = TRUE;
01971                                                 break;
01972 
01973                                         }
01974                                 }
01975 
01976                                 if (!attachment_found)
01977                                 {
01978                                         gAttachPieMenu->appendSeparator();
01979                                 }
01980                         }
01981 
01982                         if (gDetachBodyPartPieMenus[i])
01983                         {
01984                                 gDetachPieMenu->appendPieMenu( gDetachBodyPartPieMenus[i] );
01985                         }
01986                         else
01987                         {
01988                                 BOOL attachment_found = FALSE;
01989                                 for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
01990                                          iter != mAttachmentPoints.end(); )
01991                                 {
01992                                         attachment_map_t::iterator curiter = iter++;
01993                                         LLViewerJointAttachment* attachment = curiter->second;
01994                                         if (attachment->getGroup() == i)
01995                                         {
01996                                                 gDetachPieMenu->append(new LLMenuItemCallGL(attachment->getName(), 
01997                                                         &handle_detach_from_avatar, object_attached, attachment));
01998 
01999                                                 attachment_found = TRUE;
02000                                                 break;
02001                                         }
02002                                 }
02003 
02004                                 if (!attachment_found)
02005                                 {
02006                                         gDetachPieMenu->appendSeparator();
02007                                 }
02008                         }
02009                 }
02010 
02011                 // add screen attachments
02012                 for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
02013                          iter != mAttachmentPoints.end(); )
02014                 {
02015                         attachment_map_t::iterator curiter = iter++;
02016                         LLViewerJointAttachment* attachment = curiter->second;
02017                         if (attachment->getGroup() == 8)
02018                         {
02019                                 LLMenuItemCallGL* item;
02020                                 item = new LLMenuItemCallGL(attachment->getName(), 
02021                                                                                         NULL, 
02022                                                                                         object_selected_and_point_valid);
02023                                 item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", curiter->first);
02024                                 gAttachScreenPieMenu->append(item);
02025                                 gDetachScreenPieMenu->append(new LLMenuItemCallGL(attachment->getName(), 
02026                                                         &handle_detach_from_avatar, object_attached, attachment));
02027                         }
02028                 }
02029 
02030                 for (S32 pass = 0; pass < 2; pass++)
02031                 {
02032                         for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
02033                                  iter != mAttachmentPoints.end(); )
02034                         {
02035                                 attachment_map_t::iterator curiter = iter++;
02036                                 LLViewerJointAttachment* attachment = curiter->second;
02037                                 if (attachment->getIsHUDAttachment() != (pass == 1))
02038                                 {
02039                                         continue;
02040                                 }
02041                                 LLMenuItemCallGL* item = new LLMenuItemCallGL(attachment->getName(), 
02042                                                                                                                           NULL, &object_selected_and_point_valid,
02043                                                                                                                           &attach_label, attachment);
02044                                 item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", curiter->first);
02045                                 gAttachSubMenu->append(item);
02046 
02047                                 gDetachSubMenu->append(new LLMenuItemCallGL(attachment->getName(), 
02048                                         &handle_detach_from_avatar, object_attached, &detach_label, attachment));
02049                                 
02050                         }
02051                         if (pass == 0)
02052                         {
02053                                 // put separator between non-hud and hud attachments
02054                                 gAttachSubMenu->appendSeparator();
02055                                 gDetachSubMenu->appendSeparator();
02056                         }
02057                 }
02058 
02059                 for (S32 group = 0; group < 8; group++)
02060                 {
02061                         // skip over groups that don't have sub menus
02062                         if (!gAttachBodyPartPieMenus[group] || !gDetachBodyPartPieMenus[group])
02063                         {
02064                                 continue;
02065                         }
02066 
02067                         std::multimap<S32, S32> attachment_pie_menu_map;
02068 
02069                         // gather up all attachment points assigned to this group, and throw into map sorted by pie slice number
02070                         for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
02071                                  iter != mAttachmentPoints.end(); )
02072                         {
02073                                 attachment_map_t::iterator curiter = iter++;
02074                                 LLViewerJointAttachment* attachment = curiter->second;
02075                                 if(attachment->getGroup() == group)
02076                                 {
02077                                         // use multimap to provide a partial order off of the pie slice key
02078                                         S32 pie_index = attachment->getPieSlice();
02079                                         attachment_pie_menu_map.insert(std::make_pair(pie_index, curiter->first));
02080                                 }
02081                         }
02082 
02083                         // add in requested order to pie menu, inserting separators as necessary
02084                         S32 cur_pie_slice = 0;
02085                         for (std::multimap<S32, S32>::iterator attach_it = attachment_pie_menu_map.begin();
02086                                  attach_it != attachment_pie_menu_map.end(); ++attach_it)
02087                         {
02088                                 S32 requested_pie_slice = attach_it->first;
02089                                 S32 attach_index = attach_it->second;
02090                                 while (cur_pie_slice < requested_pie_slice)
02091                                 {
02092                                         gAttachBodyPartPieMenus[group]->appendSeparator();
02093                                         gDetachBodyPartPieMenus[group]->appendSeparator();
02094                                         cur_pie_slice++;
02095                                 }
02096 
02097                                 LLViewerJointAttachment* attachment = get_if_there(mAttachmentPoints, attach_index, (LLViewerJointAttachment*)NULL);
02098                                 if (attachment)
02099                                 {
02100                                         LLMenuItemCallGL* item = new LLMenuItemCallGL(attachment->getName(), 
02101                                                                                                                                   NULL, object_selected_and_point_valid);
02102                                         gAttachBodyPartPieMenus[group]->append(item);
02103                                         item->addListener(gMenuHolder->getListenerByName("Object.AttachToAvatar"), "on_click", attach_index);
02104                                         gDetachBodyPartPieMenus[group]->append(new LLMenuItemCallGL(attachment->getName(), 
02105                                                                                                                                                                 &handle_detach_from_avatar,
02106                                                                                                                                                                 object_attached, attachment));
02107                                         cur_pie_slice++;
02108                                 }
02109                         }
02110                 }
02111         }
02112 
02113         mMeshValid = TRUE;
02114 }
02115 
02116 
02117 //-----------------------------------------------------------------------------
02118 // releaseMeshData()
02119 //-----------------------------------------------------------------------------
02120 void LLVOAvatar::releaseMeshData()
02121 {
02122         LLMemType mt(LLMemType::MTYPE_AVATAR);
02123         
02124         if (sInstances.size() < AVATAR_RELEASE_THRESHOLD || mIsDummy)
02125         {
02126                 return;
02127         }
02128 
02129         //llinfos << "Releasing" << llendl;
02130 
02131         // cleanup mesh data
02132         mHairLOD.setValid(FALSE, TRUE);
02133         mHeadLOD.setValid(FALSE, TRUE);
02134         mEyeLashLOD.setValid(FALSE, TRUE);
02135         mUpperBodyLOD.setValid(FALSE, TRUE);
02136         mLowerBodyLOD.setValid(FALSE, TRUE);
02137         mEyeBallLeftLOD.setValid(FALSE, TRUE);
02138         mEyeBallRightLOD.setValid(FALSE, TRUE);
02139         mSkirtLOD.setValid(FALSE, TRUE);
02140 
02141         //cleanup data
02142         if (mDrawable.notNull())
02143         {
02144                 LLFace* facep = mDrawable->getFace(0);
02145                 facep->setSize(0, 0);
02146         }
02147         
02148         for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
02149                  iter != mAttachmentPoints.end(); )
02150         {
02151                 attachment_map_t::iterator curiter = iter++;
02152                 LLViewerJointAttachment* attachment = curiter->second;
02153                 if (!attachment->getIsHUDAttachment())
02154                 {
02155                         attachment->setAttachmentVisibility(FALSE);
02156                 }
02157         }
02158         mMeshValid = FALSE;
02159 }
02160 
02161 //-----------------------------------------------------------------------------
02162 // restoreMeshData()
02163 //-----------------------------------------------------------------------------
02164 void LLVOAvatar::restoreMeshData()
02165 {
02166         LLMemType mt(LLMemType::MTYPE_AVATAR);
02167         
02168         //llinfos << "Restoring" << llendl;
02169         mMeshValid = TRUE;
02170         updateJointLODs();
02171 
02172         if (mIsSelf)
02173         {
02174                 updateAttachmentVisibility(gAgent.getCameraMode());
02175         }
02176         else
02177         {
02178                 for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
02179                          iter != mAttachmentPoints.end(); )
02180                 {
02181                         attachment_map_t::iterator curiter = iter++;
02182                         LLViewerJointAttachment* attachment = curiter->second;
02183                         if (!attachment->getIsHUDAttachment())
02184                         {
02185                                 attachment->setAttachmentVisibility(TRUE);
02186                         }
02187                 }
02188         }
02189 
02190         // force mesh update as LOD might not have changed to trigger this
02191         gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE);
02192 }
02193 
02194 //-----------------------------------------------------------------------------
02195 // updateMeshData()
02196 //-----------------------------------------------------------------------------
02197 void LLVOAvatar::updateMeshData()
02198 {
02199         if (mDrawable.notNull())
02200         {
02201                 stop_glerror();
02202                 LLFace* facep = mDrawable->getFace(0);
02203 
02204                 U32 num_vertices = 0;
02205                 U32 num_indices = 0;
02206 
02207                 // this order is determined by number of LODS
02208                 // if a mesh earlier in this list changed LODs while a later mesh doesn't,
02209                 // the later mesh's index offset will be inaccurate
02210                 mEyeBallLeftLOD.updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea);
02211                 mEyeBallRightLOD.updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea);
02212                 mEyeLashLOD.updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea);
02213                 mHeadLOD.updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea);
02214                 mLowerBodyLOD.updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea);
02215                 mSkirtLOD.updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea);
02216                 mUpperBodyLOD.updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea);
02217                 mHairLOD.updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea);
02218 
02219                 // resize immediately
02220                 facep->setSize(num_vertices, num_indices);
02221 
02222                 facep->mVertexBuffer = new LLVertexBufferAvatar();
02223                 facep->mVertexBuffer->allocateBuffer(num_vertices, num_indices, TRUE);
02224 
02225                 facep->setGeomIndex(0);
02226                 facep->setIndicesIndex(0);
02227                 
02228                 // This is a hack! Avatars have their own pool, so we are detecting
02229                 //   the case of more than one avatar in the pool (thus > 0 instead of >= 0)
02230                 if (facep->getGeomIndex() > 0)
02231                 {
02232                         llerrs << "non-zero geom index: " << facep->getGeomIndex() << " in LLVOAvatar::restoreMeshData" << llendl;
02233                 }
02234 
02235                 mEyeBallLeftLOD.updateFaceData(facep, mAdjustedPixelArea);
02236                 mEyeBallRightLOD.updateFaceData(facep, mAdjustedPixelArea);
02237                 mEyeLashLOD.updateFaceData(facep, mAdjustedPixelArea);
02238                 mHeadLOD.updateFaceData(facep, mAdjustedPixelArea);
02239                 mLowerBodyLOD.updateFaceData(facep, mAdjustedPixelArea);
02240                 mSkirtLOD.updateFaceData(facep, mAdjustedPixelArea);
02241                 mUpperBodyLOD.updateFaceData(facep, mAdjustedPixelArea);
02242                 mHairLOD.updateFaceData(facep, mAdjustedPixelArea, TRUE);
02243 
02244                 stop_glerror();
02245                 facep->mVertexBuffer->setBuffer(0);
02246         }
02247 }
02248 
02249 //------------------------------------------------------------------------
02250 
02251 //------------------------------------------------------------------------
02252 // The viewer can only suggest a good size for the agent,
02253 // the simulator will keep it inside a reasonable range.
02254 void LLVOAvatar::computeBodySize() 
02255 {
02256         LLVector3 pelvis_scale = mPelvisp->getScale();
02257 
02258         // some of the joints have not been cached
02259         LLVector3 skull = mSkullp->getPosition();
02260         LLVector3 skull_scale = mSkullp->getScale();
02261 
02262         LLVector3 neck = mNeckp->getPosition();
02263         LLVector3 neck_scale = mNeckp->getScale();
02264 
02265         LLVector3 chest = mChestp->getPosition();
02266         LLVector3 chest_scale = mChestp->getScale();
02267 
02268         // the rest of the joints have been cached
02269         LLVector3 head = mHeadp->getPosition();
02270         LLVector3 head_scale = mHeadp->getScale();
02271 
02272         LLVector3 torso = mTorsop->getPosition();
02273         LLVector3 torso_scale = mTorsop->getScale();
02274 
02275         LLVector3 hip = mHipLeftp->getPosition();
02276         LLVector3 hip_scale = mHipLeftp->getScale();
02277 
02278         LLVector3 knee = mKneeLeftp->getPosition();
02279         LLVector3 knee_scale = mKneeLeftp->getScale();
02280 
02281         LLVector3 ankle = mAnkleLeftp->getPosition();
02282         LLVector3 ankle_scale = mAnkleLeftp->getScale();
02283 
02284         LLVector3 foot  = mFootLeftp->getPosition();
02285 
02286         mPelvisToFoot = hip.mV[VZ] * pelvis_scale.mV[VZ] -
02287                                         knee.mV[VZ] * hip_scale.mV[VZ] -
02288                                         ankle.mV[VZ] * knee_scale.mV[VZ] -
02289                                         foot.mV[VZ] * ankle_scale.mV[VZ];
02290 
02291         mBodySize.mV[VZ] = mPelvisToFoot +
02292                                            // the sqrt(2) correction below is an approximate
02293                                            // correction to get to the top of the head
02294                                            F_SQRT2 * (skull.mV[VZ] * head_scale.mV[VZ]) + 
02295                                            head.mV[VZ] * neck_scale.mV[VZ] + 
02296                                            neck.mV[VZ] * chest_scale.mV[VZ] + 
02297                                            chest.mV[VZ] * torso_scale.mV[VZ] + 
02298                                            torso.mV[VZ] * pelvis_scale.mV[VZ]; 
02299 
02300         // TODO -- measure the real depth and width
02301         mBodySize.mV[VX] = DEFAULT_AGENT_DEPTH;
02302         mBodySize.mV[VY] = DEFAULT_AGENT_WIDTH;
02303 
02304 /* debug spam
02305         std::cout << "skull = " << skull << std::endl;                          // adebug
02306         std::cout << "head = " << head << std::endl;                            // adebug
02307         std::cout << "head_scale = " << head_scale << std::endl;        // adebug
02308         std::cout << "neck = " << neck << std::endl;                            // adebug
02309         std::cout << "neck_scale = " << neck_scale << std::endl;        // adebug
02310         std::cout << "chest = " << chest << std::endl;                          // adebug
02311         std::cout << "chest_scale = " << chest_scale << std::endl;      // adebug
02312         std::cout << "torso = " << torso << std::endl;                          // adebug
02313         std::cout << "torso_scale = " << torso_scale << std::endl;      // adebug
02314         std::cout << std::endl; // adebug
02315 
02316         std::cout << "pelvis_scale = " << pelvis_scale << std::endl;// adebug
02317         std::cout << std::endl; // adebug
02318 
02319         std::cout << "hip = " << hip << std::endl;                                      // adebug
02320         std::cout << "hip_scale = " << hip_scale << std::endl;          // adebug
02321         std::cout << "ankle = " << ankle << std::endl;                          // adebug
02322         std::cout << "ankle_scale = " << ankle_scale << std::endl;      // adebug
02323         std::cout << "foot = " << foot << std::endl;                            // adebug
02324         std::cout << "mBodySize = " << mBodySize << std::endl;          // adebug
02325         std::cout << "mPelvisToFoot = " << mPelvisToFoot << std::endl;  // adebug
02326         std::cout << std::endl;         // adebug
02327 */
02328 }
02329 
02330 //------------------------------------------------------------------------
02331 // LLVOAvatar::processUpdateMessage()
02332 //------------------------------------------------------------------------
02333 U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys,
02334                                                                                   void **user_data,
02335                                                                                   U32 block_num, const EObjectUpdateType update_type,
02336                                                                                   LLDataPacker *dp)
02337 {
02338         LLMemType mt(LLMemType::MTYPE_AVATAR);
02339         
02340         LLVector3 old_vel = getVelocity();
02341         // Do base class updates...
02342         U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp);
02343 
02344         //llinfos << getRotation() << llendl;
02345         //llinfos << getPosition() << llendl;
02346         if (update_type == OUT_FULL )
02347         {
02348                 if( !mIsSelf || !mFirstTEMessageReceived )
02349                 {
02350 //                      dumpAvatarTEs( "PRE   processUpdateMessage()" );
02351                         unpackTEMessage(mesgsys, _PREHASH_ObjectData, block_num);
02352 //                      dumpAvatarTEs( "POST  processUpdateMessage()" );
02353 
02354                         if( !mFirstTEMessageReceived )
02355                         {
02356                                 onFirstTEMessageReceived();
02357                         }
02358 
02359                         // Disable updates to composites.  We'll decide whether we need to do
02360                         // any updates after we find out whether this update message has any
02361                         // "baked" (pre-composited) textures.
02362                         setCompositeUpdatesEnabled( FALSE );
02363                         updateMeshTextures(); 
02364                         setCompositeUpdatesEnabled( TRUE );
02365                 }
02366         }
02367 
02368         return retval;
02369 }
02370 
02371 // virtual
02372 S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid)
02373 {
02374         // The core setTETexture() method requests images, so we need
02375         // to redirect certain avatar texture requests to different sims.
02376         if (isTextureIndexBaked(te))
02377         {
02378                 LLHost target_host = getObjectHost();
02379                 return setTETextureCore(te, uuid, target_host);
02380         }
02381         else
02382         {
02383                 return setTETextureCore(te, uuid, LLHost::invalid);
02384         }
02385 }
02386 
02387 
02388 // setTEImage
02389 
02390 //------------------------------------------------------------------------
02391 // idleUpdate()
02392 //------------------------------------------------------------------------
02393 BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
02394 {
02395         LLMemType mt(LLMemType::MTYPE_AVATAR);
02396         LLFastTimer t(LLFastTimer::FTM_AVATAR_UPDATE);
02397 
02398         if (isDead())
02399         {
02400                 llinfos << "Warning!  Idle on dead avatar" << llendl;
02401                 return TRUE;
02402         }
02403 
02404         if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR)))
02405         {
02406                 return TRUE;
02407         }
02408         
02409         // force immediate pixel area update on avatars using last frames data (before drawable or camera updates)
02410         setPixelAreaAndAngle(gAgent);
02411 
02412         // force asynchronous drawable update
02413         if(mDrawable.notNull() && !gNoRender)
02414         {       
02415                 LLFastTimer t(LLFastTimer::FTM_JOINT_UPDATE);
02416         
02417                 if (mIsSitting && getParent())
02418                 {
02419                         LLViewerObject *root_object = (LLViewerObject*)getRoot();
02420                         LLDrawable* drawablep = root_object->mDrawable;
02421                         // if this object hasn't already been updated by another avatar...
02422                         if (drawablep) // && !drawablep->isState(LLDrawable::EARLY_MOVE))
02423                         {
02424                                 if (root_object->isSelected())
02425                                 {
02426                                         gPipeline.updateMoveNormalAsync(drawablep);
02427                                 }
02428                                 else
02429                                 {
02430                                         gPipeline.updateMoveDampedAsync(drawablep);
02431                                 }
02432                         }
02433                 }
02434                 else 
02435                 {
02436                         gPipeline.updateMoveDampedAsync(mDrawable);
02437                 }
02438         }
02439 
02440         //--------------------------------------------------------------------
02441         // set alpha flag depending on state
02442         //--------------------------------------------------------------------
02443 
02444         if (mIsSelf)
02445         {
02446                 LLViewerObject::idleUpdate(agent, world, time);
02447                 
02448                 // trigger fidget anims
02449                 if (isAnyAnimationSignaled(AGENT_STAND_ANIMS, NUM_AGENT_STAND_ANIMS))
02450                 {
02451                         agent.fidget();
02452                 }
02453         }
02454         else
02455         {
02456                 // Should override the idleUpdate stuff and leave out the angular update part.
02457                 LLQuaternion rotation = getRotation();
02458                 LLViewerObject::idleUpdate(agent, world, time);
02459                 setRotation(rotation);
02460         }
02461 
02462         // attach objects that were waiting for a drawable
02463         lazyAttach();
02464         
02465         // animate the character
02466         // store off last frame's root position to be consistent with camera position
02467         LLVector3 root_pos_last = mRoot.getWorldPosition();
02468         BOOL detailed_update = updateCharacter(agent);
02469         bool voiceEnabled = gVoiceClient->getVoiceEnabled( mID ) && gVoiceClient->inProximalChannel();
02470 
02471         // disable voice visualizer when in mouselook
02472         mVoiceVisualizer->setVoiceEnabled( voiceEnabled && !(mIsSelf && gAgent.cameraMouselook()) );
02473         if ( voiceEnabled )
02474         {               
02475                 //----------------------------------------------------------------
02476                 // Only do gesture triggering for your own avatar, and only when you're in a proximal channel.
02477                 //----------------------------------------------------------------
02478                 if( mIsSelf )
02479                 {
02480                         //----------------------------------------------------------------------------------------
02481                         // The following takes the voice signal and uses that to trigger gesticulations. 
02482                         //----------------------------------------------------------------------------------------
02483                         int lastGesticulationLevel = mCurrentGesticulationLevel;
02484                         mCurrentGesticulationLevel = mVoiceVisualizer->getCurrentGesticulationLevel();
02485                         
02486                         //---------------------------------------------------------------------------------------------------
02487                         // If "current gesticulation level" changes, we catch this, and trigger the new gesture
02488                         //---------------------------------------------------------------------------------------------------
02489                         if ( lastGesticulationLevel != mCurrentGesticulationLevel )
02490                         {
02491                                 if ( mCurrentGesticulationLevel != VOICE_GESTICULATION_LEVEL_OFF )
02492                                 {
02493                                         LLString gestureString = "unInitialized";
02494                                         if ( mCurrentGesticulationLevel == 0 )  { gestureString = "/voicelevel1";       }
02495                                         else    if ( mCurrentGesticulationLevel == 1 )  { gestureString = "/voicelevel2";       }
02496                                         else    if ( mCurrentGesticulationLevel == 2 )  { gestureString = "/voicelevel3";       }
02497                                         else    { llinfos << "oops - CurrentGesticulationLevel can be only 0, 1, or 2"  << llendl; }
02498                                         
02499                                         // this is the call that Karl S. created for triggering gestures from within the code.
02500                                         gGestureManager.triggerAndReviseString( gestureString );
02501                                 }
02502                         }
02503                         
02504                 } //if( mIsSelf )
02505                 
02506                 //-----------------------------------------------------------------------------------------------------------------
02507                 // If the avatar is speaking, then the voice amplitude signal is passed to the voice visualizer.
02508                 // Also, here we trigger voice visualizer start and stop speaking, so it can animate the voice symbol.
02509                 //
02510                 // Notice the calls to "gAwayTimer.reset()". This resets the timer that determines how long the avatar has been
02511                 // "away", so that the avatar doesn't lapse into away-mode (and slump over) while the user is still talking. 
02512                 //-----------------------------------------------------------------------------------------------------------------
02513                 if ( gVoiceClient->getIsSpeaking( mID ) )
02514                 {               
02515                         if ( ! mVoiceVisualizer->getCurrentlySpeaking() )
02516                         {
02517                                 mVoiceVisualizer->setStartSpeaking();
02518                                 
02519                                 //printf( "gAwayTimer.reset();\n" );
02520                         }
02521                         
02522                         mVoiceVisualizer->setSpeakingAmplitude( gVoiceClient->getCurrentPower( mID ) );
02523                         
02524                         if( mIsSelf )
02525                         {
02526                                 gAgent.clearAFK();
02527                         }
02528                 }
02529                 else
02530                 {
02531                         if ( mVoiceVisualizer->getCurrentlySpeaking() )
02532                         {
02533                                 mVoiceVisualizer->setStopSpeaking();
02534                                 
02535                                 if ( mLipSyncActive )
02536                                 {
02537                                         if( mOohMorph ) mOohMorph->setWeight(mOohMorph->getMinWeight(), FALSE);
02538                                         if( mAahMorph ) mAahMorph->setWeight(mAahMorph->getMinWeight(), FALSE);
02539                                         
02540                                         mLipSyncActive = false;
02541                                         LLCharacter::updateVisualParams();
02542                                         dirtyMesh();
02543                                 }
02544                         }
02545                 }
02546                 
02547                 //--------------------------------------------------------------------------------------------
02548                 // here we get the approximate head position and set as sound source for the voice symbol
02549                 // (the following version uses a tweak of "mHeadOffset" which handle sitting vs. standing)
02550                 //--------------------------------------------------------------------------------------------
02551                 LLVector3 headOffset = LLVector3( 0.0f, 0.0f, mHeadOffset.mV[2] );
02552                 mVoiceVisualizer->setVoiceSourceWorldPosition( mRoot.getWorldPosition() + headOffset );
02553                 
02554         }//if ( voiceEnabled )
02555                 
02556         if (LLVOAvatar::sJointDebug)
02557         {
02558                 llinfos << getFullname() << ": joint touches: " << LLJoint::sNumTouches << " updates: " << LLJoint::sNumUpdates << llendl;
02559         }
02560 
02561         LLJoint::sNumUpdates = 0;
02562         LLJoint::sNumTouches = 0;
02563 
02564         if (gNoRender)
02565         {
02566                 return TRUE;
02567         }
02568 
02569         // *NOTE: this is necessary for the floating name text above your head.
02570         if (mDrawable.notNull())
02571         {
02572                 gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_SHADOW, TRUE);
02573         }
02574 
02575         BOOL visible = isVisible() || mNeedsAnimUpdate;
02576 
02577         // update attachments positions
02578         if (detailed_update || !sUseImpostors)
02579         {
02580                 LLFastTimer t(LLFastTimer::FTM_ATTACHMENT_UPDATE);
02581                 for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
02582                          iter != mAttachmentPoints.end(); )
02583                 {
02584                         attachment_map_t::iterator curiter = iter++;
02585                         LLViewerJointAttachment* attachment = curiter->second;
02586                         LLViewerObject *attached_object = attachment->getObject();
02587 
02588                         BOOL visibleAttachment = visible || (attached_object && 
02589                                                                                                 !(attached_object->mDrawable->getSpatialBridge() &&
02590                                                                                                   attached_object->mDrawable->getSpatialBridge()->getRadius() < 2.0));
02591 
02592                         if (visibleAttachment && attached_object && !attached_object->isDead() && attachment->getValid())
02593                         {
02594                                 // if selecting any attachments, update all of them as non-damped
02595                                 if (LLSelectMgr::getInstance()->getSelection()->getObjectCount() && LLSelectMgr::getInstance()->getSelection()->isAttachment())
02596                                 {
02597                                         gPipeline.updateMoveNormalAsync(attached_object->mDrawable);
02598                                 }
02599                                 else
02600                                 {
02601                                         gPipeline.updateMoveDampedAsync(attached_object->mDrawable);
02602                                 }
02603 
02604                                 LLSpatialBridge* bridge = attached_object->mDrawable->getSpatialBridge();
02605                                 if (bridge)
02606                                 {
02607                                         gPipeline.updateMoveNormalAsync(bridge);
02608                                 }
02609                                 attached_object->updateText();  
02610                         }
02611                 }
02612         }
02613 
02614         mNeedsAnimUpdate = FALSE;
02615 
02616         if (isImpostor() && !mNeedsImpostorUpdate)
02617         {
02618                 LLVector3 ext[2];
02619                 F32 distance;
02620                 LLVector3 angle;
02621 
02622                 getImpostorValues(ext, angle, distance);
02623 
02624                 for (U32 i = 0; i < 3 && !mNeedsImpostorUpdate; i++)
02625                 {
02626                         F32 cur_angle = angle.mV[i];
02627                         F32 old_angle = mImpostorAngle.mV[i];
02628                         F32 angle_diff = fabsf(cur_angle-old_angle);
02629                 
02630                         if (angle_diff > 3.14159f/512.f*distance)
02631                         {
02632                                 mNeedsImpostorUpdate = TRUE;
02633                         }
02634                 }
02635 
02636                 if (detailed_update && !mNeedsImpostorUpdate)
02637                 {       //update impostor if view angle, distance, or bounding box change
02638                         //significantly
02639                         
02640                         F32 dist_diff = fabsf(distance-mImpostorDistance);
02641                         if (dist_diff/mImpostorDistance > 0.1f)
02642                         {
02643                                 mNeedsImpostorUpdate = TRUE;
02644                         }
02645                         else
02646                         {
02647                                 getSpatialExtents(ext[0], ext[1]);
02648                                 if ((ext[1]-mImpostorExtents[1]).magVec() > 0.05f ||
02649                                         (ext[0]-mImpostorExtents[0]).magVec() > 0.05f)
02650                                 {
02651                                         mNeedsImpostorUpdate = TRUE;
02652                                 }
02653                         }
02654                 }
02655         }
02656 
02657         mDrawable->movePartition();
02658         
02659         //force a move if sitting on an active object
02660         if (getParent() && ((LLViewerObject*) getParent())->mDrawable->isActive())
02661         {
02662                 gPipeline.markMoved(mDrawable, TRUE);
02663         }
02664 
02665         // update morphing params
02666         if (mAppearanceAnimating)
02667         {
02668                 ESex avatar_sex = getSex();
02669                 F32 appearance_anim_time = mAppearanceMorphTimer.getElapsedTimeF32();
02670                 if (appearance_anim_time >= APPEARANCE_MORPH_TIME)
02671                 {
02672                         mAppearanceAnimating = FALSE;
02673                         for (LLVisualParam *param = getFirstVisualParam(); 
02674                                  param;
02675                                  param = getNextVisualParam())
02676                         {
02677                                 if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
02678                                 {
02679                                         param->stopAnimating(mAppearanceAnimSetByUser);
02680                                 }
02681                         }
02682                         updateVisualParams();
02683                         if (mIsSelf)
02684                         {
02685                                 gAgent.sendAgentSetAppearance();
02686                         }
02687                 }
02688                 else
02689                 {
02690                         F32 blend_frac = calc_bouncy_animation(appearance_anim_time / APPEARANCE_MORPH_TIME);
02691                         F32 last_blend_frac = calc_bouncy_animation(mLastAppearanceBlendTime / APPEARANCE_MORPH_TIME);
02692                         F32 morph_amt;
02693                         if (last_blend_frac == 1.f)
02694                         {
02695                                 morph_amt = 1.f;
02696                         }
02697                         else
02698                         {
02699                                 morph_amt = (blend_frac - last_blend_frac) / (1.f - last_blend_frac);
02700                         }
02701 
02702                         LLVisualParam *param;
02703 
02704                         // animate only top level params
02705                         for (param = getFirstVisualParam();
02706                                  param;
02707                                  param = getNextVisualParam())
02708                         {
02709                                 if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
02710                                 {
02711                                         param->animate(morph_amt, mAppearanceAnimSetByUser);
02712                                 }
02713                         }
02714 
02715                         // apply all params
02716                         for (param = getFirstVisualParam();
02717                                  param;
02718                                  param = getNextVisualParam())
02719                         {
02720                                 param->apply(avatar_sex);
02721                         }
02722 
02723                         mLastAppearanceBlendTime = appearance_anim_time;
02724                 }
02725                 dirtyMesh();
02726         }
02727 
02728         // Use the Lipsync_Ooh and Lipsync_Aah morphs for lip sync
02729         if ( voiceEnabled && (gVoiceClient->lipSyncEnabled() > 0) && gVoiceClient->getIsSpeaking( mID ) )
02730         {
02731                 F32 ooh_morph_amount = 0.0f;
02732                 F32 aah_morph_amount = 0.0f;
02733 
02734                 mVoiceVisualizer->lipSyncOohAah( ooh_morph_amount, aah_morph_amount );
02735 
02736                 if( mOohMorph )
02737                 {
02738                         F32 ooh_weight = mOohMorph->getMinWeight()
02739                                 + ooh_morph_amount * (mOohMorph->getMaxWeight() - mOohMorph->getMinWeight());
02740 
02741                         mOohMorph->setWeight( ooh_weight, FALSE );
02742                 }
02743 
02744                 if( mAahMorph )
02745                 {
02746                         F32 aah_weight = mAahMorph->getMinWeight()
02747                                 + aah_morph_amount * (mAahMorph->getMaxWeight() - mAahMorph->getMinWeight());
02748 
02749                         mAahMorph->setWeight( aah_weight, FALSE );
02750                 }
02751 
02752                 mLipSyncActive = true;
02753                 LLCharacter::updateVisualParams();
02754                 dirtyMesh();
02755         }
02756 
02757         // update visibility when avatar is partially loaded
02758         if (updateIsFullyLoaded()) // changed?
02759         {
02760                 if (isFullyLoaded())
02761                 {
02762                         deleteParticleSource();
02763                 }
02764                 else
02765                 {
02766                         LLPartSysData particle_parameters;
02767 
02768                         // fancy particle cloud designed by Brent
02769                         particle_parameters.mPartData.mMaxAge            = 4.f;
02770                         particle_parameters.mPartData.mStartScale.mV[VX] = 0.8f;
02771                         particle_parameters.mPartData.mStartScale.mV[VX] = 0.8f;
02772                         particle_parameters.mPartData.mStartScale.mV[VY] = 1.0f;
02773                         particle_parameters.mPartData.mEndScale.mV[VX]   = 0.02f;
02774                         particle_parameters.mPartData.mEndScale.mV[VY]   = 0.02f;
02775                         particle_parameters.mPartData.mStartColor        = LLColor4(1, 1, 1, 0.5f);
02776                         particle_parameters.mPartData.mEndColor          = LLColor4(1, 1, 1, 0.0f);
02777                         particle_parameters.mPartData.mStartScale.mV[VX] = 0.8f;
02778                         LLViewerImage* cloud = gImageList.getImageFromFile("cloud-particle.j2c");
02779                         particle_parameters.mPartImageID                 = cloud->getID();
02780                         particle_parameters.mMaxAge                      = 0.f;
02781                         particle_parameters.mPattern                     = LLPartSysData::LL_PART_SRC_PATTERN_ANGLE_CONE;
02782                         particle_parameters.mInnerAngle                  = 3.14159f;
02783                         particle_parameters.mOuterAngle                  = 0.f;
02784                         particle_parameters.mBurstRate                   = 0.02f;
02785                         particle_parameters.mBurstRadius                 = 0.0f;
02786                         particle_parameters.mBurstPartCount              = 1;
02787                         particle_parameters.mBurstSpeedMin               = 0.1f;
02788                         particle_parameters.mBurstSpeedMax               = 1.f;
02789                         particle_parameters.mPartData.mFlags             = ( LLPartData::LL_PART_INTERP_COLOR_MASK | LLPartData::LL_PART_INTERP_SCALE_MASK |
02790                                                                                                                                  LLPartData::LL_PART_EMISSIVE_MASK | // LLPartData::LL_PART_FOLLOW_SRC_MASK |
02791                                                                                                                                  LLPartData::LL_PART_TARGET_POS_MASK );
02792                         
02793                         setParticleSource(particle_parameters, getID());
02794                 }
02795         }
02796         
02797 
02798         // update wind effect
02799         if ((LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR) >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH))
02800         {
02801                 F32 hover_strength = 0.f;
02802                 F32 time_delta = mRippleTimer.getElapsedTimeF32() - mRippleTimeLast;
02803                 mRippleTimeLast = mRippleTimer.getElapsedTimeF32();
02804                 LLVector3 velocity = getVelocity();
02805                 F32 speed = velocity.magVec();
02806                 //RN: velocity varies too much frame to frame for this to work
02807                 mRippleAccel.clearVec();//lerp(mRippleAccel, (velocity - mLastVel) * time_delta, LLCriticalDamp::getInterpolant(0.02f));
02808                 mLastVel = velocity;
02809                 LLVector4 wind;
02810                 wind.setVec(getRegion()->mWind.getVelocityNoisy(getPositionAgent(), 4.f) - velocity);
02811 
02812                 if (mInAir)
02813                 {
02814                         hover_strength = HOVER_EFFECT_STRENGTH * llmax(0.f, HOVER_EFFECT_MAX_SPEED - speed);
02815                 }
02816 
02817                 if (mBelowWater)
02818                 {
02819                         // TODO: make cloth flow more gracefully when underwater
02820                         hover_strength += UNDERWATER_EFFECT_STRENGTH;
02821                 }
02822 
02823                 wind.mV[VZ] += hover_strength;
02824                 wind.normVec();
02825 
02826                 wind.mV[VW] = llmin(0.025f + (speed * 0.015f) + hover_strength, 0.5f);
02827                 F32 interp;
02828                 if (wind.mV[VW] > mWindVec.mV[VW])
02829                 {
02830                         interp = LLCriticalDamp::getInterpolant(0.2f);
02831                 }
02832                 else
02833                 {
02834                         interp = LLCriticalDamp::getInterpolant(0.4f);
02835                 }
02836                 mWindVec = lerp(mWindVec, wind, interp);
02837         
02838                 F32 wind_freq = hover_strength + llclamp(8.f + (speed * 0.7f) + (noise1(mRipplePhase) * 4.f), 8.f, 25.f);
02839                 mWindFreq = lerp(mWindFreq, wind_freq, interp); 
02840 
02841                 if (mBelowWater)
02842                 {
02843                         mWindFreq *= UNDERWATER_FREQUENCY_DAMP;
02844                 }
02845 
02846                 mRipplePhase += (time_delta * mWindFreq);
02847                 if (mRipplePhase > F_TWO_PI)
02848                 {
02849                         mRipplePhase = fmodf(mRipplePhase, F_TWO_PI);
02850                 }
02851         }
02852 
02853         // update chat bubble
02854         //--------------------------------------------------------------------
02855         // draw text label over characters head
02856         //--------------------------------------------------------------------
02857         if (mChatTimer.getElapsedTimeF32() > BUBBLE_CHAT_TIME)
02858         {
02859                 mChats.clear();
02860         }
02861         
02862         const F32 time_visible = mTimeVisible.getElapsedTimeF32();
02863         const F32 NAME_SHOW_TIME = gSavedSettings.getF32("RenderNameShowTime"); // seconds
02864         const F32 FADE_DURATION = gSavedSettings.getF32("RenderNameFadeDuration"); // seconds
02865         BOOL visible_chat = gSavedSettings.getBOOL("UseChatBubbles") && (mChats.size() || mTyping);
02866         BOOL render_name =      visible_chat ||
02867                                                 (visible &&
02868                                                 ((sRenderName == RENDER_NAME_ALWAYS) ||
02869                                                 (sRenderName == RENDER_NAME_FADE && time_visible < NAME_SHOW_TIME)));
02870         // If it's your own avatar, don't draw in mouselook, and don't
02871         // draw if we're specifically hiding our own name.
02872         if (mIsSelf)
02873         {
02874                 render_name = render_name
02875                                                 && !gAgent.cameraMouselook()
02876                                                 && (visible_chat || !gSavedSettings.getBOOL("RenderNameHideSelf"));
02877         }
02878 
02879         if ( render_name )
02880         {
02881                 BOOL new_name = FALSE;
02882                 if (visible_chat != mVisibleChat)
02883                 {
02884                         mVisibleChat = visible_chat;
02885                         new_name = TRUE;
02886                 }
02887                 
02888                 if (sRenderGroupTitles != mRenderGroupTitles)
02889                 {
02890                         mRenderGroupTitles = sRenderGroupTitles;
02891                         new_name = TRUE;
02892                 }
02893 
02894                 // First Calculate Alpha
02895                 // If alpha > 0, create mNameText if necessary, otherwise delete it
02896                 {
02897                         F32 alpha = 0.f;
02898                         if (mAppAngle > 5.f)
02899                         {
02900                                 const F32 START_FADE_TIME = NAME_SHOW_TIME - FADE_DURATION;
02901                                 if (!visible_chat && sRenderName == RENDER_NAME_FADE && time_visible > START_FADE_TIME)
02902                                 {
02903                                         alpha = 1.f - (time_visible - START_FADE_TIME) / FADE_DURATION;
02904                                 }
02905                                 else
02906                                 {
02907                                         // ...not fading, full alpha
02908                                         alpha = 1.f;
02909                                 }
02910                         }
02911                         else if (mAppAngle > 2.f)
02912                         {
02913                                 // far away is faded out also
02914                                 alpha = (mAppAngle-2.f)/3.f;
02915                         }
02916 
02917                         if (alpha > 0.f)
02918                         {
02919                                 if (!mNameText)
02920                                 {
02921                                         mNameText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
02922                                         mNameText->setMass(10.f);
02923                                         mNameText->setSourceObject(this);
02924                                         mNameText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP);
02925                                         mNameText->setVisibleOffScreen(TRUE);
02926                                         mNameText->setMaxLines(11);
02927                                         mNameText->setFadeDistance(CHAT_NORMAL_RADIUS, 5.f);
02928                                         mNameText->setUseBubble(TRUE);
02929                                         sNumVisibleChatBubbles++;
02930                                         new_name = TRUE;
02931                                 }
02932                                 
02933                                 LLColor4 avatar_name_color = gColors.getColor( "AvatarNameColor" );
02934                                 avatar_name_color.setAlpha(alpha);
02935                                 mNameText->setColor(avatar_name_color);
02936                                 
02937                                 LLQuaternion root_rot = mRoot.getWorldRotation();
02938                                 mNameText->setUsePixelSize(TRUE);
02939                                 LLVector3 pixel_right_vec;
02940                                 LLVector3 pixel_up_vec;
02941                                 LLViewerCamera::getInstance()->getPixelVectors(root_pos_last, pixel_up_vec, pixel_right_vec);
02942                                 LLVector3 camera_to_av = root_pos_last - LLViewerCamera::getInstance()->getOrigin();
02943                                 camera_to_av.normVec();
02944                                 LLVector3 local_camera_at = camera_to_av * ~root_rot;
02945                                 LLVector3 local_camera_up = camera_to_av % LLViewerCamera::getInstance()->getLeftAxis();
02946                                 local_camera_up.normVec();
02947                                 local_camera_up = local_camera_up * ~root_rot;
02948                         
02949                                 local_camera_up.scaleVec(mBodySize * 0.5f);
02950                                 local_camera_at.scaleVec(mBodySize * 0.5f);
02951 
02952                                 LLVector3 name_position = mRoot.getWorldPosition() + 
02953                                         (local_camera_up * root_rot) -
02954                                         (projected_vec(local_camera_at * root_rot, camera_to_av));
02955                                 name_position += pixel_up_vec * 15.f;
02956                                 mNameText->setPositionAgent(name_position);
02957                         }
02958                         else if (mNameText)
02959                         {
02960                                 mNameText->markDead();
02961                                 mNameText = NULL;
02962                                 sNumVisibleChatBubbles--;
02963                         }
02964                 }
02965                 
02966                 LLNameValue *title = getNVPair("Title");
02967                 LLNameValue* firstname = getNVPair("FirstName");
02968                 LLNameValue* lastname = getNVPair("LastName");
02969 
02970                 if (mNameText.notNull() && firstname && lastname)
02971                 {
02972                         BOOL is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY)  != mSignaledAnimations.end();
02973                         BOOL is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end();
02974                         BOOL is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end();
02975                         BOOL is_muted;
02976                         if (mIsSelf)
02977                         {
02978                                 is_muted = FALSE;
02979                         }
02980                         else
02981                         {
02982                                 is_muted = LLMuteList::getInstance()->isMuted(getID());
02983                         }
02984 
02985                         if (mNameString.empty() ||
02986                                 new_name ||
02987                                 (!title && !mTitle.empty()) ||
02988                                 (title && mTitle != title->getString()) ||
02989                                 (is_away != mNameAway || is_busy != mNameBusy || is_muted != mNameMute)
02990                                 || is_appearance != mNameAppearance)
02991                         {
02992                                 char line[MAX_STRING];          /* Flawfinder: ignore */
02993                                 if (!sRenderGroupTitles)
02994                                 {
02995                                         // If all group titles are turned off, stack first name
02996                                         // on a line above last name
02997                                         strncpy(line, firstname->getString(), MAX_STRING -1 );          /* Flawfinder: ignore */
02998                                         line[MAX_STRING -1] = '\0';
02999                                         strcat(line, "\n");
03000                                 }
03001                                 else if (title && title->getString() && title->getString()[0] != '\0')
03002                                 {
03003                                         strncpy(line, title->getString(), MAX_STRING -1 );              /* Flawfinder: ignore */
03004                                         line[MAX_STRING -1] = '\0';
03005                                         strcat(line, "\n");             /* Flawfinder: ignore */
03006                                         strncat(line, firstname->getString(), MAX_STRING - strlen(line) -1 );           /* Flawfinder: ignore */
03007                                 }
03008                                 else
03009                                 {
03010                                         strncpy(line, firstname->getString(), MAX_STRING -1 );          /* Flawfinder: ignore */
03011                                         line[MAX_STRING -1] = '\0';
03012                                 }
03013 
03014                                 strcat(line, " ");              /* Flawfinder: ignore */
03015                                 strncat(line, lastname->getString(), MAX_STRING - strlen(line) -1);             /* Flawfinder: ignore */
03016                                 BOOL need_comma = FALSE;
03017 
03018                                 if (is_away || is_muted || is_busy)
03019                                 {
03020                                         strcat(line, " (");             /* Flawfinder: ignore */
03021                                         if (is_away)
03022                                         {
03023                                                 strcat(line, "Away");           /* Flawfinder: ignore */
03024                                                 need_comma = TRUE;
03025                                         }
03026                                         if (is_busy)
03027                                         {
03028                                                 if (need_comma)
03029                                                 {
03030                                                         strcat(line, ", ");             /* Flawfinder: ignore */
03031                                                 }
03032                                                 strcat(line, "Busy");           /* Flawfinder: ignore */
03033                                                 need_comma = TRUE;
03034                                         }
03035                                         if (is_muted)
03036                                         {
03037                                                 if (need_comma)
03038                                                 {
03039                                                         strcat(line, ", ");             /* Flawfinder: ignore */
03040                                                 }
03041                                                 strcat(line, "Muted");          /* Flawfinder: ignore */
03042                                                 need_comma = TRUE;
03043                                         }
03044                                         strcat(line,")");               /* Flawfinder: ignore */
03045                                 }
03046                                 if (is_appearance)
03047                                 {
03048                                         strcat(line, "\n(Editing Appearance)");         /* Flawfinder: ignore */
03049                                 }
03050                                 mNameAway = is_away;
03051                                 mNameBusy = is_busy;
03052                                 mNameMute = is_muted;
03053                                 mNameAppearance = is_appearance;
03054                                 mTitle = title ? title->getString() : "";
03055                                 mNameString = utf8str_to_wstring(line);
03056                                 new_name = TRUE;
03057                         }
03058 
03059                         if (visible_chat)
03060                         {
03061                                 mNameText->setDropShadow(TRUE);
03062                                 mNameText->setFont(LLFontGL::sSansSerif);
03063                                 mNameText->setTextAlignment(LLHUDText::ALIGN_TEXT_LEFT);
03064                                 mNameText->setFadeDistance(CHAT_NORMAL_RADIUS * 2.f, 5.f);
03065                                 if (new_name)
03066                                 {
03067                                         mNameText->setLabel(mNameString);
03068                                 }
03069                         
03070                                 char line[MAX_STRING];          /* Flawfinder: ignore */
03071                                 line[0] = '\0';
03072                                 std::deque<LLChat>::iterator chat_iter = mChats.begin();
03073                                 mNameText->clearString();
03074 
03075                                 LLColor4 new_chat = gColors.getColor( "AvatarNameColor" );
03076                                 LLColor4 normal_chat = lerp(new_chat, LLColor4(0.8f, 0.8f, 0.8f, 1.f), 0.7f);
03077                                 LLColor4 old_chat = lerp(normal_chat, LLColor4(0.6f, 0.6f, 0.6f, 1.f), 0.7f);
03078                                 if (mTyping && mChats.size() >= MAX_BUBBLE_CHAT_UTTERANCES) 
03079                                 {
03080                                         ++chat_iter;
03081                                 }
03082 
03083                                 for(; chat_iter != mChats.end(); ++chat_iter)
03084                                 {
03085                                         F32 chat_fade_amt = llclamp((F32)((LLFrameTimer::getElapsedSeconds() - chat_iter->mTime) / CHAT_FADE_TIME), 0.f, 4.f);
03086                                         LLFontGL::StyleFlags style;
03087                                         switch(chat_iter->mChatType)
03088                                         {
03089                                         case CHAT_TYPE_WHISPER:
03090                                                 style = LLFontGL::ITALIC;
03091                                                 break;
03092                                         case CHAT_TYPE_SHOUT:
03093                                                 style = LLFontGL::BOLD;
03094                                                 break;
03095                                         default:
03096                                                 style = LLFontGL::NORMAL;
03097                                                 break;
03098                                         }
03099                                         if (chat_fade_amt < 1.f)
03100                                         {
03101                                                 F32 u = clamp_rescale(chat_fade_amt, 0.9f, 1.f, 0.f, 1.f);
03102                                                 mNameText->addLine(utf8str_to_wstring(chat_iter->mText), lerp(new_chat, normal_chat, u), style);
03103                                         }
03104                                         else if (chat_fade_amt < 2.f)
03105                                         {
03106                                                 F32 u = clamp_rescale(chat_fade_amt, 1.9f, 2.f, 0.f, 1.f);
03107                                                 mNameText->addLine(utf8str_to_wstring(chat_iter->mText), lerp(normal_chat, old_chat, u), style);
03108                                         }
03109                                         else if (chat_fade_amt < 3.f)
03110                                         {
03111                                                 // *NOTE: only remove lines down to minimum number
03112                                                 mNameText->addLine(utf8str_to_wstring(chat_iter->mText), old_chat, style);
03113                                         }
03114                                 }
03115                                 mNameText->setVisibleOffScreen(TRUE);
03116 
03117                                 if (mTyping)
03118                                 {
03119                                         S32 dot_count = (llfloor(mTypingTimer.getElapsedTimeF32() * 3.f) + 2) % 3 + 1;
03120                                         switch(dot_count)
03121                                         {
03122                                         case 1:
03123                                                 mNameText->addLine(".", new_chat);
03124                                                 break;
03125                                         case 2:
03126                                                 mNameText->addLine("..", new_chat);
03127                                                 break;
03128                                         case 3:
03129                                                 mNameText->addLine("...", new_chat);
03130                                                 break;
03131                                         }
03132 
03133                                 }
03134                         }
03135                         else
03136                         {
03137                                 if (gSavedSettings.getBOOL("SmallAvatarNames"))
03138                                 {
03139                                         mNameText->setFont(LLFontGL::sSansSerif);
03140                                 }
03141                                 else
03142                                 {
03143                                         mNameText->setFont(LLFontGL::sSansSerifBig);
03144                                 }
03145                                 mNameText->setTextAlignment(LLHUDText::ALIGN_TEXT_CENTER);
03146                                 mNameText->setFadeDistance(CHAT_NORMAL_RADIUS, 5.f);
03147                                 mNameText->setVisibleOffScreen(FALSE);
03148                                 if (new_name)
03149                                 {
03150                                         mNameText->setLabel("");
03151                                         mNameText->setString(mNameString);
03152                                 }
03153                         }
03154                 }
03155         }
03156         else if (mNameText)
03157         {
03158                 mNameText->markDead();
03159                 mNameText = NULL;
03160                 sNumVisibleChatBubbles--;
03161         }
03162 
03163         shame();
03164 
03165         //--------------------------------------------------------------------
03166         // draw tractor beam when editing objects
03167         //--------------------------------------------------------------------
03168         if (!mIsSelf)
03169         {
03170                 return TRUE;
03171         }
03172 
03173         // This is only done for yourself (maybe it should be in the agent?)
03174         if (!needsRenderBeam() || !mIsBuilt)
03175         {
03176                 mBeam = NULL;
03177         }
03178         else if (!mBeam || mBeam->isDead())
03179         {
03180                 // VEFFECT: Tractor Beam
03181                 mBeam = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM);
03182                 mBeam->setColor(LLColor4U(gAgent.getEffectColor()));
03183                 mBeam->setSourceObject(this);
03184                 mBeamTimer.reset();
03185         }
03186 
03187         if (!mBeam.isNull())
03188         {
03189                 LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
03190 
03191                 if (gAgent.mPointAt.notNull())
03192                 {
03193                         // get point from pointat effect
03194                         mBeam->setPositionGlobal(gAgent.mPointAt->getPointAtPosGlobal());
03195                         mBeam->triggerLocal();
03196                 }
03197                 else if (selection->getFirstRootObject() && 
03198                                 selection->getSelectType() != SELECT_TYPE_HUD)
03199                 {
03200                         LLViewerObject* objectp = selection->getFirstRootObject();
03201                         mBeam->setTargetObject(objectp);
03202                 }
03203                 else
03204                 {
03205                         mBeam->setTargetObject(NULL);
03206                         LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
03207                         if (tool->isEditing())
03208                         {
03209                                 if (tool->getEditingObject())
03210                                 {
03211                                         mBeam->setTargetObject(tool->getEditingObject());
03212                                 }
03213                                 else
03214                                 {
03215                                         mBeam->setPositionGlobal(tool->getEditingPointGlobal());
03216                                 }
03217                         }
03218                         else
03219                         {
03220                                 mBeam->setPositionGlobal(gLastHitNonFloraPosGlobal + gLastHitNonFloraObjectOffset);
03221                         }
03222 
03223                 }
03224                 if (mBeamTimer.getElapsedTimeF32() > 0.25f)
03225                 {
03226                         mBeam->setColor(LLColor4U(gAgent.getEffectColor()));
03227                         mBeam->setNeedsSendToSim(TRUE);
03228                         mBeamTimer.reset();
03229                 }
03230         }
03231 
03232         F32 avatar_height = (F32)(getPositionGlobal().mdV[VZ]);
03233 
03234         F32 water_height;
03235         water_height = getRegion()->getWaterHeight();
03236 
03237         mBelowWater =  avatar_height < water_height;
03238         
03239         return TRUE;
03240 }
03241 
03242 void LLVOAvatar::slamPosition()
03243 {
03244         gAgent.setPositionAgent(getPositionAgent());
03245         mRoot.setWorldPosition(getPositionAgent()); // teleport
03246         setChanged(TRANSLATED);
03247         if (mDrawable.notNull())
03248         {
03249                 gPipeline.updateMoveNormalAsync(mDrawable);
03250         }
03251         mRoot.updateWorldMatrixChildren();
03252 }
03253 
03254 //------------------------------------------------------------------------
03255 // updateCharacter()
03256 // called on both your avatar and other avatars
03257 //------------------------------------------------------------------------
03258 BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
03259 {
03260         LLMemType mt(LLMemType::MTYPE_AVATAR);
03261         // update screen joint size
03262 
03263         if (mScreenp)
03264         {
03265                 F32 aspect = LLViewerCamera::getInstance()->getAspect();
03266                 LLVector3 scale(1.f, aspect, 1.f);
03267                 mScreenp->setScale(scale);
03268                 mScreenp->updateWorldMatrixChildren();
03269                 resetHUDAttachments();
03270         }
03271 
03272         // clear debug text
03273         mDebugText.clear();
03274         if (LLVOAvatar::sShowAnimationDebug)
03275         {
03276                 for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin();
03277                          iter != mMotionController.getActiveMotions().end(); ++iter)
03278                 {
03279                         LLMotion* motionp = *iter;
03280                         if (motionp->getMinPixelArea() < getPixelArea())
03281                         {
03282                                 std::string output;
03283                                 if (motionp->getName().empty())
03284                                 {
03285                                         output = llformat("%s - %d",
03286                                                                           motionp->getID().asString().c_str(),
03287                                                                           (U32)motionp->getPriority());
03288                                 }
03289                                 else
03290                                 {
03291                                         output = llformat("%s - %d",
03292                                                                           motionp->getName().c_str(),
03293                                                                           (U32)motionp->getPriority());
03294                                 }
03295                                 addDebugText(output);
03296                         }
03297                 }
03298         }
03299 
03300         if (gNoRender)
03301         {
03302                 // Hack if we're running drones...
03303                 if (mIsSelf)
03304                 {
03305                         gAgent.setPositionAgent(getPositionAgent());
03306                 }
03307                 return FALSE;
03308         }
03309 
03310 
03311         LLVector3d root_pos_global;
03312 
03313         if (!mIsBuilt)
03314         {
03315                 return FALSE;
03316         }
03317 
03318         BOOL visible = isVisible();
03319 
03320         // For fading out the names above heads, only let the timer
03321         // run if we're visible.
03322         if (mDrawable.notNull() && !visible)
03323         {
03324                 mTimeVisible.reset();
03325         }
03326 
03327 
03328         //--------------------------------------------------------------------
03329         // the rest should only be done occasionally for far away avatars
03330         //--------------------------------------------------------------------
03331 
03332         if (!mIsSelf && sUseImpostors && !mNeedsAnimUpdate && !sFreezeCounter)
03333         {
03334                 F32 impostor_area = 256.f*512.f*(8.125f - LLVOAvatar::sLODFactor*8.f);
03335                 if (LLMuteList::getInstance()->isMuted(getID()))
03336                 {
03337                         mUpdatePeriod = 16;
03338                         visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE;
03339                 }
03340                 else if (visible && mPixelArea <= impostor_area)
03341                 {
03342                         mUpdatePeriod = llclamp((S32) sqrtf(impostor_area*4.f/mPixelArea), 2, 8);
03343 
03344                         visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE;
03345                 }
03346                 else
03347                 {
03348                         mUpdatePeriod = 1;
03349                 }
03350 
03351                 if (!visible)
03352                 {
03353                         if (!mMotionController.isPaused())
03354                         {
03355                                 mMotionController.pause();
03356                                 mMotionController.updateMotion();
03357                                 mMotionController.unpause();
03358                         }
03359                         else
03360                         {                       
03361                                 mMotionController.updateMotion();
03362                         }
03363                         return FALSE;
03364                 }
03365         }
03366 
03367         // change animation time quanta based on avatar render load
03368         if (!mIsSelf)
03369         {
03370                 F32 time_quantum = clamp_rescale((F32)sInstances.size(), 10.f, 35.f, 0.f, 0.25f);
03371                 F32 pixel_area_scale = clamp_rescale(mPixelArea, 100, 5000, 1.f, 0.f);
03372                 F32 time_step = time_quantum * pixel_area_scale;
03373                 if (time_step != 0.f)
03374                 {
03375                         // disable walk motion servo controller as it doesn't work with motion timesteps
03376                         stopMotion(ANIM_AGENT_WALK_ADJUST);
03377                         removeAnimationData("Walk Speed");
03378                 }
03379                 mMotionController.setTimeStep(time_step);
03380 //              llinfos << "Setting timestep to " << time_quantum * pixel_area_scale << llendl;
03381         }
03382 
03383         if (getParent() && !mIsSitting)
03384         {
03385                 sitOnObject((LLViewerObject*)getParent());
03386         }
03387         else if (!getParent() && mIsSitting && !isMotionActive(ANIM_AGENT_SIT_GROUND_CONSTRAINED))
03388         {
03389                 getOffObject();
03390         }
03391 
03392         //--------------------------------------------------------------------
03393         // create local variables in world coords for region position values
03394         //--------------------------------------------------------------------
03395         F32 speed;
03396         LLVector3 normal;
03397 
03398         LLVector3 xyVel = getVelocity();
03399         xyVel.mV[VZ] = 0.0f;
03400         speed = xyVel.magVec();
03401 
03402         BOOL throttle = TRUE;
03403 
03404         if (!(mIsSitting && getParent()))
03405         {
03406                 //--------------------------------------------------------------------
03407                 // get timing info
03408                 // handle initial condition case
03409                 //--------------------------------------------------------------------
03410                 F32 animation_time = mAnimTimer.getElapsedTimeF32();
03411                 if (mTimeLast == 0.0f)
03412                 {
03413                         mTimeLast = animation_time;
03414                         throttle = FALSE;
03415 
03416                         // put the pelvis at slaved position/mRotation
03417                         mRoot.setWorldPosition( getPositionAgent() ); // first frame
03418                         mRoot.setWorldRotation( getRotation() );
03419                 }
03420         
03421                 //--------------------------------------------------------------------
03422                 // dont' let dT get larger than 1/5th of a second
03423                 //--------------------------------------------------------------------
03424                 F32 deltaTime = animation_time - mTimeLast;
03425 
03426                 deltaTime = llclamp( deltaTime, DELTA_TIME_MIN, DELTA_TIME_MAX );
03427                 mTimeLast = animation_time;
03428 
03429                 mSpeedAccum = (mSpeedAccum * 0.95f) + (speed * 0.05f);
03430 
03431                 //--------------------------------------------------------------------
03432                 // compute the position of the avatar's root
03433                 //--------------------------------------------------------------------
03434                 LLVector3d root_pos;
03435                 LLVector3d ground_under_pelvis;
03436 
03437                 if (mIsSelf)
03438                 {
03439                         gAgent.setPositionAgent(getRenderPosition());
03440                 }
03441 
03442                 root_pos = gAgent.getPosGlobalFromAgent(getRenderPosition());
03443 
03444                 resolveHeightGlobal(root_pos, ground_under_pelvis, normal);
03445                 F32 foot_to_ground = (F32) (root_pos.mdV[VZ] - mPelvisToFoot - ground_under_pelvis.mdV[VZ]);
03446                 BOOL in_air = ( (!LLWorld::getInstance()->getRegionFromPosGlobal(ground_under_pelvis)) || 
03447                                 foot_to_ground > FOOT_GROUND_COLLISION_TOLERANCE);
03448 
03449                 if (in_air && !mInAir)
03450                 {
03451                         mTimeInAir.reset();
03452                 }
03453                 mInAir = in_air;
03454 
03455                 // correct for the fact that the pelvis is not necessarily the center 
03456                 // of the agent's physical representation
03457                 root_pos.mdV[VZ] -= (0.5f * mBodySize.mV[VZ]) - mPelvisToFoot;
03458                 
03459 
03460                 LLVector3 newPosition = gAgent.getPosAgentFromGlobal(root_pos);
03461 
03462                 if (newPosition != mRoot.getXform()->getWorldPosition())
03463                 {               
03464                         mRoot.touch();
03465                         mRoot.setWorldPosition(newPosition ); // regular update
03466                 }
03467 
03468 
03469                 //--------------------------------------------------------------------
03470                 // Propagate viewer object rotation to root of avatar
03471                 //--------------------------------------------------------------------
03472                 if (!isAnyAnimationSignaled(AGENT_NO_ROTATE_ANIMS, NUM_AGENT_NO_ROTATE_ANIMS))
03473                 {
03474                         LLQuaternion iQ;
03475                         LLVector3 upDir( 0.0f, 0.0f, 1.0f );
03476                         
03477                         // Compute a forward direction vector derived from the primitive rotation
03478                         // and the velocity vector.  When walking or jumping, don't let body deviate
03479                         // more than 90 from the view, if necessary, flip the velocity vector.
03480 
03481                         LLVector3 primDir;
03482                         if (mIsSelf)
03483                         {
03484                                 primDir = agent.getAtAxis() - projected_vec(agent.getAtAxis(), agent.getReferenceUpVector());
03485                                 primDir.normVec();
03486                         }
03487                         else
03488                         {
03489                                 primDir = getRotation().getMatrix3().getFwdRow();
03490                         }
03491                         LLVector3 velDir = getVelocity();
03492                         velDir.normVec();
03493                         if ( mSignaledAnimations.find(ANIM_AGENT_WALK) != mSignaledAnimations.end())
03494                         {
03495                                 F32 vpD = velDir * primDir;
03496                                 if (vpD < -0.5f)
03497                                 {
03498                                         velDir *= -1.0f;
03499                                 }
03500                         }
03501                         LLVector3 fwdDir = lerp(primDir, velDir, clamp_rescale(speed, 0.5f, 2.0f, 0.0f, 1.0f));
03502                         if (mIsSelf && gAgent.cameraMouselook())
03503                         {
03504                                 // make sure fwdDir stays in same general direction as primdir
03505                                 if (gAgent.getFlying())
03506                                 {
03507                                         fwdDir = LLViewerCamera::getInstance()->getAtAxis();
03508                                 }
03509                                 else
03510                                 {
03511                                         LLVector3 at_axis = LLViewerCamera::getInstance()->getAtAxis();
03512                                         LLVector3 up_vector = gAgent.getReferenceUpVector();
03513                                         at_axis -= up_vector * (at_axis * up_vector);
03514                                         at_axis.normVec();
03515                                         
03516                                         F32 dot = fwdDir * at_axis;
03517                                         if (dot < 0.f)
03518                                         {
03519                                                 fwdDir -= 2.f * at_axis * dot;
03520                                                 fwdDir.normVec();
03521                                         }
03522                                 }
03523                                 
03524                         }
03525 
03526                         LLQuaternion root_rotation = mRoot.getWorldMatrix().quaternion();
03527                         F32 root_roll, root_pitch, root_yaw;
03528                         root_rotation.getEulerAngles(&root_roll, &root_pitch, &root_yaw);
03529 
03530                         if (gDebugAvatarRotation)
03531                         {
03532                                 llinfos << "root_roll " << RAD_TO_DEG * root_roll 
03533                                         << " root_pitch " << RAD_TO_DEG * root_pitch
03534                                         << " root_yaw " << RAD_TO_DEG * root_yaw
03535                                         << llendl;
03536                         }
03537 
03538                         // When moving very slow, the pelvis is allowed to deviate from the
03539                         // forward direction to allow it to hold it's position while the torso
03540                         // and head turn.  Once in motion, it must conform however.
03541                         BOOL self_in_mouselook = mIsSelf && gAgent.cameraMouselook();
03542 
03543                         LLVector3 pelvisDir( mRoot.getWorldMatrix().getFwdRow4().mV );
03544                         F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, PELVIS_ROT_THRESHOLD_SLOW, PELVIS_ROT_THRESHOLD_FAST);
03545                                                 
03546                         if (self_in_mouselook)
03547                         {
03548                                 pelvis_rot_threshold *= MOUSELOOK_PELVIS_FOLLOW_FACTOR;
03549                         }
03550                         pelvis_rot_threshold *= DEG_TO_RAD;
03551 
03552                         F32 angle = angle_between( pelvisDir, fwdDir );
03553 
03554                         // The avatar's root is allowed to have a yaw that deviates widely
03555                         // from the forward direction, but if roll or pitch are off even
03556                         // a little bit we need to correct the rotation.
03557                         if(root_roll < 1.f * DEG_TO_RAD
03558                                 && root_pitch < 5.f * DEG_TO_RAD)
03559                         {
03560                                 // smaller correction vector means pelvis follows prim direction more closely
03561                                 if (!mTurning && angle > pelvis_rot_threshold*0.75f)
03562                                 {
03563                                         mTurning = TRUE;
03564                                 }
03565 
03566                                 // use tighter threshold when turning
03567                                 if (mTurning)
03568                                 {
03569                                         pelvis_rot_threshold *= 0.4f;
03570                                 }
03571 
03572                                 // am I done turning?
03573                                 if (angle < pelvis_rot_threshold)
03574                                 {
03575                                         mTurning = FALSE;
03576                                 }
03577 
03578                                 LLVector3 correction_vector = (pelvisDir - fwdDir) * clamp_rescale(angle, pelvis_rot_threshold*0.75f, pelvis_rot_threshold, 1.0f, 0.0f);
03579                                 fwdDir += correction_vector;
03580                         }
03581                         else
03582                         {
03583                                 mTurning = FALSE;
03584                         }
03585 
03586                         // Now compute the full world space rotation for the whole body (wQv)
03587                         LLVector3 leftDir = upDir % fwdDir;
03588                         leftDir.normVec();
03589                         fwdDir = leftDir % upDir;
03590                         LLQuaternion wQv( fwdDir, leftDir, upDir );
03591 
03592                         if (mIsSelf && mTurning)
03593                         {
03594                                 if ((fwdDir % pelvisDir) * upDir > 0.f)
03595                                 {
03596                                         gAgent.setControlFlags(AGENT_CONTROL_TURN_RIGHT);
03597                                 }
03598                                 else
03599                                 {
03600                                         gAgent.setControlFlags(AGENT_CONTROL_TURN_LEFT);
03601                                 }
03602                         }
03603 
03604                         // Set the root rotation, but do so incrementally so that it
03605                         // lags in time by some fixed amount.
03606                         //F32 u = LLCriticalDamp::getInterpolant(PELVIS_LAG);
03607                         F32 pelvis_lag_time = 0.f;
03608                         if (self_in_mouselook)
03609                         {
03610                                 pelvis_lag_time = PELVIS_LAG_MOUSELOOK;
03611                         }
03612                         else if (mInAir)
03613                         {
03614                                 pelvis_lag_time = PELVIS_LAG_FLYING;
03615                                 // increase pelvis lag time when moving slowly
03616                                 pelvis_lag_time *= clamp_rescale(mSpeedAccum, 0.f, 15.f, 3.f, 1.f);
03617                         }
03618                         else
03619                         {
03620                                 pelvis_lag_time = PELVIS_LAG_WALKING;
03621                         }
03622 
03623                         F32 u = llclamp((deltaTime / pelvis_lag_time), 0.0f, 1.0f);     
03624 
03625                         mRoot.setWorldRotation( slerp(u, mRoot.getWorldRotation(), wQv) );
03626                         
03627                 }
03628         }
03629         else if (mDrawable.notNull())
03630         {
03631                 mRoot.setPosition(mDrawable->getPosition());
03632                 mRoot.setRotation(mDrawable->getRotation());
03633         }
03634         
03635         //-------------------------------------------------------------------------
03636         // Update character motions
03637         //-------------------------------------------------------------------------
03638         // store data relevant to motions
03639         mSpeed = speed;
03640 
03641         // update animations
03642         {
03643                 LLFastTimer t(LLFastTimer::FTM_UPDATE_ANIMATION);
03644                 updateMotion();
03645         }
03646 
03647         // update head position
03648         updateHeadOffset();
03649 
03650         //-------------------------------------------------------------------------
03651         // Find the ground under each foot, these are used for a variety
03652         // of things that follow
03653         //-------------------------------------------------------------------------
03654         LLVector3 ankle_left_pos_agent = mFootLeftp->getWorldPosition();
03655         LLVector3 ankle_right_pos_agent = mFootRightp->getWorldPosition();
03656 
03657         LLVector3 ankle_left_ground_agent = ankle_left_pos_agent;
03658         LLVector3 ankle_right_ground_agent = ankle_right_pos_agent;
03659         resolveHeightAgent(ankle_left_pos_agent, ankle_left_ground_agent, normal);
03660         resolveHeightAgent(ankle_right_pos_agent, ankle_right_ground_agent, normal);
03661 
03662         F32 leftElev = llmax(-0.2f, ankle_left_pos_agent.mV[VZ] - ankle_left_ground_agent.mV[VZ]);
03663         F32 rightElev = llmax(-0.2f, ankle_right_pos_agent.mV[VZ] - ankle_right_ground_agent.mV[VZ]);
03664 
03665         if (!mIsSitting)
03666         {
03667                 //-------------------------------------------------------------------------
03668                 // Figure out which foot is on ground
03669                 //-------------------------------------------------------------------------
03670                 if (!mInAir)
03671                 {
03672                         if ((leftElev < 0.0f) || (rightElev < 0.0f))
03673                         {
03674                                 ankle_left_pos_agent = mFootLeftp->getWorldPosition();
03675                                 ankle_right_pos_agent = mFootRightp->getWorldPosition();
03676                                 leftElev = ankle_left_pos_agent.mV[VZ] - ankle_left_ground_agent.mV[VZ];
03677                                 rightElev = ankle_right_pos_agent.mV[VZ] - ankle_right_ground_agent.mV[VZ];
03678                         }
03679                 }
03680         }
03681         
03682         //-------------------------------------------------------------------------
03683         // Generate footstep sounds when feet hit the ground
03684         //-------------------------------------------------------------------------
03685         const LLUUID AGENT_FOOTSTEP_ANIMS[] = {ANIM_AGENT_WALK, ANIM_AGENT_RUN, ANIM_AGENT_LAND};
03686         const S32 NUM_AGENT_FOOTSTEP_ANIMS = sizeof(AGENT_FOOTSTEP_ANIMS) / sizeof(LLUUID);
03687 
03688         if ( gAudiop && isAnyAnimationSignaled(AGENT_FOOTSTEP_ANIMS, NUM_AGENT_FOOTSTEP_ANIMS) )
03689         {
03690                 BOOL playSound = FALSE;
03691                 LLVector3 foot_pos_agent;
03692 
03693                 BOOL onGroundLeft = (leftElev <= 0.05f);
03694                 BOOL onGroundRight = (rightElev <= 0.05f);
03695 
03696                 // did left foot hit the ground?
03697                 if ( onGroundLeft && !mWasOnGroundLeft )
03698                 {
03699                         foot_pos_agent = ankle_left_pos_agent;
03700                         playSound = TRUE;
03701                 }
03702 
03703                 // did right foot hit the ground?
03704                 if ( onGroundRight && !mWasOnGroundRight )
03705                 {
03706                         foot_pos_agent = ankle_right_pos_agent;
03707                         playSound = TRUE;
03708                 }
03709 
03710                 mWasOnGroundLeft = onGroundLeft;
03711                 mWasOnGroundRight = onGroundRight;
03712 
03713                 if ( playSound )
03714                 {
03715 //                      F32 gain = clamp_rescale( mSpeedAccum,
03716 //                                                      AUDIO_STEP_LO_SPEED, AUDIO_STEP_HI_SPEED,
03717 //                                                      AUDIO_STEP_LO_GAIN, AUDIO_STEP_HI_GAIN );
03718 
03719                         F32 ambient_volume = gSavedSettings.getF32("AudioLevelAmbient");
03720                         F32 gain = gSavedSettings.getBOOL("MuteAmbient") 
03721                                 ? 0.f 
03722                                 : (.50f * ambient_volume * ambient_volume);
03723                         LLUUID& step_sound_id = getStepSound();
03724 
03725                         LLVector3d foot_pos_global = gAgent.getPosGlobalFromAgent(foot_pos_agent);
03726 
03727                         if (LLViewerParcelMgr::getInstance()->canHearSound(foot_pos_global)
03728                                 && !LLMuteList::getInstance()->isMuted(getID(), LLMute::flagObjectSounds))
03729                         {
03730                                 gAudiop->triggerSound(step_sound_id, getID(), gain, foot_pos_global);
03731                         }
03732                 }
03733         }
03734 
03735         mRoot.updateWorldMatrixChildren();
03736 
03737         // Send the speaker position to the spatialized voice system.
03738         if(mIsSelf)
03739         {
03740                 LLMatrix3 rot;
03741                 LLVector3d pos;
03742 #if 1
03743                 // character rotation (stable, shouldn't move with animations)
03744                 rot = mRoot.getWorldRotation().getMatrix3();
03745 #else   
03746                 // actual head rotation (moves with animations, probably a bit too much)
03747                 rot.setRows(
03748                                 LLVector3::x_axis * mSkullp->getWorldRotation(), 
03749                                 LLVector3::y_axis * mSkullp->getWorldRotation(),  
03750                                 LLVector3::z_axis * mSkullp->getWorldRotation());               
03751 #endif
03752         
03753                 pos = getPositionGlobal();
03754                 pos += LLVector3d(mHeadOffset);
03755                 
03756                 // MBW -- XXX -- Setting velocity to 0 for now.  May figure it out later...
03757                 gVoiceClient->setAvatarPosition(
03758                                 pos,                            // position
03759                                 LLVector3::zero,        // velocity
03760                                 rot);                           // rotation matrix
03761         }
03762 
03763         if (!mDebugText.size() && mText.notNull())
03764         {
03765                 mText->markDead();
03766                 mText = NULL;
03767         }
03768         else if (mDebugText.size())
03769         {
03770                 setDebugText(mDebugText);
03771         }
03772 
03773         //mesh vertices need to be reskinned
03774         mNeedsSkin = TRUE;
03775 
03776         return TRUE;
03777 }
03778 
03779 //-----------------------------------------------------------------------------
03780 // updateHeadOffset()
03781 //-----------------------------------------------------------------------------
03782 void LLVOAvatar::updateHeadOffset()
03783 {
03784         // since we only care about Z, just grab one of the eyes
03785         LLVector3 midEyePt = mEyeLeftp->getWorldPosition();
03786         midEyePt -= mDrawable.notNull() ? mDrawable->getWorldPosition() : mRoot.getWorldPosition();
03787         midEyePt.mV[VZ] = llmax(-mPelvisToFoot + LLViewerCamera::getInstance()->getNear(), midEyePt.mV[VZ]);
03788 
03789         if (mDrawable.notNull())
03790         {
03791                 midEyePt = midEyePt * ~mDrawable->getWorldRotation();
03792         }
03793         if (mIsSitting)
03794         {
03795                 mHeadOffset = midEyePt; 
03796         }
03797         else
03798         {
03799                 F32 u = llmax(0.f, HEAD_MOVEMENT_AVG_TIME - (1.f / gFPSClamped));
03800                 mHeadOffset = lerp(midEyePt, mHeadOffset,  u);
03801         }
03802 }
03803 
03804 //------------------------------------------------------------------------
03805 // updateVisibility()
03806 //------------------------------------------------------------------------
03807 void LLVOAvatar::updateVisibility()
03808 {
03809         BOOL visible = FALSE;
03810 
03811         if (mIsDummy)
03812         {
03813                 visible = TRUE;
03814         }
03815         else if (mDrawable.isNull())
03816         {
03817                 visible = FALSE;
03818         }
03819         else
03820         {
03821                 // calculate avatar distance wrt head
03822                 mDrawable->updateDistance(*LLViewerCamera::getInstance());
03823                 
03824                 if (!mDrawable->getSpatialGroup() || mDrawable->getSpatialGroup()->isVisible())
03825                 {
03826                         visible = TRUE;
03827                 }
03828                 else
03829                 {
03830                         visible = FALSE;
03831                 }
03832 
03833                 if( mIsSelf )
03834                 {
03835                         if( !gAgent.areWearablesLoaded())
03836                         {
03837                                 visible = FALSE;
03838                         }
03839                 }
03840                 else
03841                 if( !mFirstAppearanceMessageReceived )
03842                 {
03843                         visible = FALSE;
03844                 }
03845 
03846                 if (sDebugInvisible)
03847                 {
03848                         LLNameValue* firstname = getNVPair("FirstName");
03849                         if (firstname)
03850                         {
03851                                 llinfos << "Avatar " << firstname->getString() << " updating visiblity" << llendl;
03852                         }
03853                         else
03854                         {
03855                                 llinfos << "Avatar " << this << " updating visiblity" << llendl;
03856                         }
03857 
03858                         if (visible)
03859                         {
03860                                 llinfos << "Visible" << llendl;
03861                         }
03862                         else
03863                         {
03864                                 llinfos << "Not visible" << llendl;
03865                         }
03866 
03867                         /*if (avatar_in_frustum)
03868                         {
03869                                 llinfos << "Avatar in frustum" << llendl;
03870                         }
03871                         else
03872                         {
03873                                 llinfos << "Avatar not in frustum" << llendl;
03874                         }*/
03875 
03876                         /*if (LLViewerCamera::getInstance()->sphereInFrustum(sel_pos_agent, 2.0f))
03877                         {
03878                                 llinfos << "Sel pos visible" << llendl;
03879                         }
03880                         if (LLViewerCamera::getInstance()->sphereInFrustum(wrist_right_pos_agent, 0.2f))
03881                         {
03882                                 llinfos << "Wrist pos visible" << llendl;
03883                         }
03884                         if (LLViewerCamera::getInstance()->sphereInFrustum(getPositionAgent(), getMaxScale()*2.f))
03885                         {
03886                                 llinfos << "Agent visible" << llendl;
03887                         }*/
03888                         llinfos << "PA: " << getPositionAgent() << llendl;
03889                         /*llinfos << "SPA: " << sel_pos_agent << llendl;
03890                         llinfos << "WPA: " << wrist_right_pos_agent << llendl;*/
03891                         for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
03892                                  iter != mAttachmentPoints.end(); )
03893                         {
03894                                 attachment_map_t::iterator curiter = iter++;
03895                                 LLViewerJointAttachment* attachment = curiter->second;
03896                                 if (attachment->getObject())
03897                                 {
03898                                         if(attachment->getObject()->mDrawable->isVisible())
03899                                         {
03900                                                 llinfos << attachment->getName() << " visible" << llendl;
03901                                         }
03902                                         else
03903                                         {
03904                                                 llinfos << attachment->getName() << " not visible at " << mDrawable->getWorldPosition() << " and radius " << mDrawable->getRadius() << llendl;
03905                                         }
03906                                 }
03907                         }
03908                 }
03909         }
03910 
03911         if (!visible && mVisible)
03912         {
03913                 mMeshInvisibleTime.reset();
03914         }
03915 
03916         if (visible)
03917         {
03918                 if (!mMeshValid)
03919                 {
03920                         restoreMeshData();
03921                 }
03922         }
03923         else
03924         {
03925                 if (mMeshValid && mMeshInvisibleTime.getElapsedTimeF32() > TIME_BEFORE_MESH_CLEANUP)
03926                 {
03927                         releaseMeshData();
03928                 }
03929                 // this breaks off-screen chat bubbles
03930                 //if (mNameText)
03931                 //{
03932                 //      mNameText->markDead();
03933                 //      mNameText = NULL;
03934                 //      sNumVisibleChatBubbles--;
03935                 //}
03936         }
03937 
03938         mVisible = visible;
03939 }
03940 
03941 //------------------------------------------------------------------------
03942 // needsRenderBeam()
03943 //------------------------------------------------------------------------
03944 BOOL LLVOAvatar::needsRenderBeam()
03945 {
03946         if (gNoRender)
03947         {
03948                 return FALSE;
03949         }
03950         LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
03951 
03952         BOOL is_touching_or_grabbing = (tool == LLToolGrab::getInstance() && LLToolGrab::getInstance()->isEditing());
03953         if (LLToolGrab::getInstance()->getEditingObject() && 
03954                 LLToolGrab::getInstance()->getEditingObject()->isAttachment())
03955         {
03956                 // don't render selection beam on hud objects
03957                 is_touching_or_grabbing = FALSE;
03958         }
03959         return is_touching_or_grabbing || (mState & AGENT_STATE_EDITING && LLSelectMgr::getInstance()->shouldShowSelection());
03960 }
03961 
03962 //-----------------------------------------------------------------------------
03963 // renderSkinned()
03964 //-----------------------------------------------------------------------------
03965 U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
03966 {
03967         U32 num_indices = 0;
03968 
03969         if (!mIsBuilt)
03970         {
03971                 return num_indices;
03972         }
03973 
03974         if (mDirtyMesh || mDrawable->isState(LLDrawable::REBUILD_GEOMETRY))
03975         {       //LOD changed or new mesh created, allocate new vertex buffer if needed
03976                 updateMeshData();
03977                 mDirtyMesh = FALSE;
03978                 mNeedsSkin = TRUE;
03979                 mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY);
03980         }
03981 
03982         if (LLShaderMgr::getVertexShaderLevel(LLShaderMgr::SHADER_AVATAR) <= 0)
03983         {
03984                 if (mNeedsSkin)
03985                 {
03986                         //generate animated mesh
03987                         mLowerBodyLOD.updateGeometry();
03988                         mUpperBodyLOD.updateGeometry();
03989 
03990                         if( isWearingWearableType( WT_SKIRT ) )
03991                         {
03992                                 mSkirtLOD.updateGeometry();
03993                         }
03994 
03995                         if (!mIsSelf || gAgent.needsRenderHead())
03996                         {
03997                                 mEyeLashLOD.updateGeometry();
03998                                 mHeadLOD.updateGeometry();
03999                                 mHairLOD.updateGeometry();                              
04000                         }
04001                         mNeedsSkin = FALSE;
04002                         
04003                         LLVertexBuffer* vb = mDrawable->getFace(0)->mVertexBuffer;
04004                         if (vb)
04005                         {
04006                                 vb->setBuffer(0);
04007                         }
04008                 }
04009         }
04010         else
04011         {
04012                 mNeedsSkin = FALSE;
04013         }
04014 
04015         if (sDebugInvisible)
04016         {
04017                 LLNameValue* firstname = getNVPair("FirstName");
04018                 if (firstname)
04019                 {
04020                         llinfos << "Avatar " << firstname->getString() << " in render" << llendl;
04021                 }
04022                 else
04023                 {
04024                         llinfos << "Avatar " << this << " in render" << llendl;
04025                 }
04026                 if (!mIsBuilt)
04027                 {
04028                         llinfos << "Not built!" << llendl;
04029                 }
04030                 else if (!gAgent.needsRenderAvatar())
04031                 {
04032                         llinfos << "Doesn't need avatar render!" << llendl;
04033                 }
04034                 else
04035                 {
04036                         llinfos << "Rendering!" << llendl;
04037                 }
04038         }
04039 
04040         if (!mIsBuilt)
04041         {
04042                 return num_indices;
04043         }
04044 
04045         if (mIsSelf && !gAgent.needsRenderAvatar())
04046         {
04047                 return num_indices;
04048         }
04049 
04050         // render collision normal
04051         // *NOTE: this is disabled (there is no UI for enabling sShowFootPlane) due
04052         // to DEV-14477.  the code is left here to aid in tracking down the cause
04053         // of the crash in the future. -brad
04054         if (!gRenderForSelect && sShowFootPlane && mDrawable.notNull())
04055         {
04056                 LLVector3 slaved_pos = mDrawable->getPositionAgent();
04057                 LLVector3 foot_plane_normal(mFootPlane.mV[VX], mFootPlane.mV[VY], mFootPlane.mV[VZ]);
04058                 F32 dist_from_plane = (slaved_pos * foot_plane_normal) - mFootPlane.mV[VW];
04059                 LLVector3 collide_point = slaved_pos;
04060                 collide_point.mV[VZ] -= foot_plane_normal.mV[VZ] * (dist_from_plane + COLLISION_TOLERANCE - FOOT_COLLIDE_FUDGE);
04061 
04062                 gGL.begin(LLVertexBuffer::LINES);
04063                 {
04064                         F32 SQUARE_SIZE = 0.2f;
04065                         gGL.color4f(1.f, 0.f, 0.f, 1.f);
04066                         
04067                         gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]);
04068                         gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]);
04069 
04070                         gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]);
04071                         gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]);
04072                         
04073                         gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]);
04074                         gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]);
04075                         
04076                         gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]);
04077                         gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]);
04078                         
04079                         gGL.vertex3f(collide_point.mV[VX], collide_point.mV[VY], collide_point.mV[VZ]);
04080                         gGL.vertex3f(collide_point.mV[VX] + mFootPlane.mV[VX], collide_point.mV[VY] + mFootPlane.mV[VY], collide_point.mV[VZ] + mFootPlane.mV[VZ]);
04081 
04082                 }
04083                 gGL.end();
04084                 gGL.flush();
04085         }
04086         //--------------------------------------------------------------------
04087         // render all geomety attached to the skeleton
04088         //--------------------------------------------------------------------
04089         static LLStat render_stat;
04090 
04091         LLViewerJointMesh::sRenderPass = pass;
04092 
04093         if (pass == AVATAR_RENDER_PASS_SINGLE)
04094         {
04095                 BOOL first_pass = TRUE;
04096                 if (!mIsSelf || gAgent.needsRenderHead())
04097                 {
04098                         num_indices += mHeadLOD.render(mAdjustedPixelArea);
04099                         first_pass = FALSE;
04100                 }
04101                 num_indices += mUpperBodyLOD.render(mAdjustedPixelArea, first_pass);
04102                 num_indices += mLowerBodyLOD.render(mAdjustedPixelArea, FALSE);
04103 
04104                 {
04105                         LLGLEnable blend(GL_BLEND);
04106                         LLGLEnable test(GL_ALPHA_TEST);
04107                         num_indices += renderTransparent();
04108                 }
04109         }
04110         
04111         LLViewerJointMesh::sRenderPass = AVATAR_RENDER_PASS_SINGLE;
04112         
04113         //llinfos << "Avatar render: " << render_timer.getElapsedTimeF32() << llendl;
04114 
04115         //render_stat.addValue(render_timer.getElapsedTimeF32()*1000.f);
04116 
04117         return num_indices;
04118 }
04119 
04120 U32 LLVOAvatar::renderTransparent()
04121 {
04122         U32 num_indices = 0;
04123         BOOL first_pass = FALSE;
04124         if( isWearingWearableType( WT_SKIRT ) )
04125         {
04126                 glAlphaFunc(GL_GREATER,0.25f);
04127                 num_indices += mSkirtLOD.render(mAdjustedPixelArea, FALSE);
04128                 first_pass = FALSE;
04129                 glAlphaFunc(GL_GREATER,0.01f);
04130         }
04131 
04132         if (!mIsSelf || gAgent.needsRenderHead())
04133         {
04134                 if (LLPipeline::sImpostorRender)
04135                 {
04136                         glAlphaFunc(GL_GREATER, 0.5f);
04137                 }
04138                 num_indices += mEyeLashLOD.render(mAdjustedPixelArea, first_pass);
04139                 num_indices += mHairLOD.render(mAdjustedPixelArea, FALSE);
04140                 if (LLPipeline::sImpostorRender)
04141                 {
04142                         glAlphaFunc(GL_GREATER, 0.01f);
04143                 }
04144         }
04145 
04146         return num_indices;
04147 }
04148 
04149 //-----------------------------------------------------------------------------
04150 // renderRigid()
04151 //-----------------------------------------------------------------------------
04152 U32 LLVOAvatar::renderRigid()
04153 {
04154         U32 num_indices = 0;
04155 
04156         if (!mIsBuilt)
04157         {
04158                 return 0;
04159         }
04160 
04161         if (mIsSelf && (!gAgent.needsRenderAvatar() || !gAgent.needsRenderHead()))
04162         {
04163                 return 0;
04164         }
04165         
04166         if (!mIsBuilt)
04167         {
04168                 return 0;
04169         }
04170 
04171         num_indices += mEyeBallLeftLOD.render(mAdjustedPixelArea);
04172         num_indices += mEyeBallRightLOD.render(mAdjustedPixelArea);
04173         
04174         return num_indices;
04175 }
04176 
04177 U32 LLVOAvatar::renderFootShadows()
04178 {
04179         U32 num_indices = 0;
04180 
04181         if (!mIsBuilt)
04182         {
04183                 return 0;
04184         }
04185 
04186         if (mIsSelf && (!gAgent.needsRenderAvatar() || !gAgent.needsRenderHead()))
04187         {
04188                 return 0;
04189         }
04190         
04191         if (!mIsBuilt)
04192         {
04193                 return 0;
04194         }
04195 
04196         // Update the shadow, tractor, and text label geometry.
04197         if (mDrawable->isState(LLDrawable::REBUILD_SHADOW) && !isImpostor())
04198         {
04199                 updateShadowFaces();
04200                 mDrawable->clearState(LLDrawable::REBUILD_SHADOW);
04201         }
04202 
04203         U32 foot_mask = LLVertexBuffer::MAP_VERTEX |
04204                                         LLVertexBuffer::MAP_TEXCOORD;
04205 
04206         LLGLDepthTest test(GL_TRUE, GL_FALSE);
04207         //render foot shadows
04208         LLGLEnable blend(GL_BLEND);
04209         mShadowImagep->bind();
04210         glColor4fv(mShadow0Facep->getRenderColor().mV);
04211         mShadow0Facep->renderIndexed(foot_mask);
04212         glColor4fv(mShadow1Facep->getRenderColor().mV);
04213         mShadow1Facep->renderIndexed(foot_mask);
04214         
04215         return num_indices;
04216 }
04217 
04218 U32 LLVOAvatar::renderImpostor(LLColor4U color)
04219 {
04220         if (!mImpostor.isComplete())
04221         {
04222                 return 0;
04223         }
04224 
04225         LLVector3 pos(getRenderPosition()+mImpostorOffset);
04226         LLVector3 at = (pos - LLViewerCamera::getInstance()->getOrigin());
04227         at.normVec();
04228         LLVector3 left = LLViewerCamera::getInstance()->getUpAxis() % at;
04229         LLVector3 up = at%left;
04230 
04231         left *= mImpostorDim.mV[0];
04232         up *= mImpostorDim.mV[1];
04233 
04234         LLGLEnable test(GL_ALPHA_TEST);
04235         glAlphaFunc(GL_GREATER, 0.f);
04236 
04237         gGL.color4f(1,1,1,1);
04238         gGL.color4ubv(color.mV);
04239         mImpostor.bindTexture();
04240         gGL.begin(LLVertexBuffer::QUADS);
04241         gGL.texCoord2f(0,0);
04242         gGL.vertex3fv((pos+left-up).mV);
04243         gGL.texCoord2f(1,0);
04244         gGL.vertex3fv((pos-left-up).mV);
04245         gGL.texCoord2f(1,1);
04246         gGL.vertex3fv((pos-left+up).mV);
04247         gGL.texCoord2f(0,1);
04248         gGL.vertex3fv((pos+left+up).mV);
04249         gGL.end();
04250         gGL.flush();
04251 
04252         return 6;
04253 }
04254 
04255 //-----------------------------------------------------------------------------
04256 // renderCollisionVolumes()
04257 //-----------------------------------------------------------------------------
04258 void LLVOAvatar::renderCollisionVolumes()
04259 {
04260         for (S32 i = 0; i < mNumCollisionVolumes; i++)
04261         {
04262                 mCollisionVolumes[i].renderCollision();
04263         }
04264 }
04265 
04266 //------------------------------------------------------------------------
04267 // LLVOAvatar::updateTextures()
04268 //------------------------------------------------------------------------
04269 void LLVOAvatar::updateTextures(LLAgent &agent)
04270 {
04271         BOOL render_avatar = TRUE;
04272 
04273         if (mIsDummy || gNoRender)
04274         {
04275                 return;
04276         }
04277         
04278         BOOL head_baked = ( getTEImage( TEX_HEAD_BAKED )->getID() != IMG_DEFAULT_AVATAR );
04279         BOOL upper_baked = ( getTEImage( TEX_UPPER_BAKED )->getID() != IMG_DEFAULT_AVATAR );
04280         BOOL lower_baked = ( getTEImage( TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR );
04281         BOOL eyes_baked = ( getTEImage( TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR );
04282         BOOL skirt_baked = ( getTEImage( TEX_SKIRT_BAKED )->getID() != IMG_DEFAULT_AVATAR );
04283 
04284         if( mIsSelf )
04285         {
04286                 render_avatar = TRUE;
04287         }
04288         else
04289         {
04290                 render_avatar = isVisible() && !mCulled;
04291         }
04292 
04293         // bind the texture so that they'll be decoded
04294         // slightly inefficient, we can short-circuit this
04295         // if we have to
04296         if( render_avatar && !gGLManager.mIsDisabled )
04297         {
04298                 if( head_baked && ! mHeadBakedLoaded )
04299                 {
04300                         getTEImage( TEX_HEAD_BAKED )->bind();
04301                 }
04302                 if( upper_baked && ! mUpperBakedLoaded )
04303                 {
04304                         getTEImage( TEX_UPPER_BAKED )->bind();
04305                 }
04306                 if( lower_baked && ! mLowerBakedLoaded )
04307                 {
04308                         getTEImage( TEX_LOWER_BAKED )->bind();
04309                 }
04310                 if( eyes_baked && ! mEyesBakedLoaded )
04311                 {
04312                         getTEImage( TEX_EYES_BAKED )->bind();
04313                 }
04314                 if( skirt_baked && ! mSkirtBakedLoaded )
04315                 {
04316                         getTEImage( TEX_SKIRT_BAKED )->bind();
04317                 }
04318         }
04319 
04320         /*
04321         // JAMESDEBUG
04322         if (mIsSelf)
04323         {
04324                 S32 null_count = 0;
04325                 S32 default_count = 0;
04326                 for (U32 i = 0; i < getNumTEs(); i++)
04327                 {
04328                         const LLTextureEntry* te = getTE(i);
04329                         if (te)
04330                         {
04331                                 if (te->getID() == LLUUID::null)
04332                                 {
04333                                         null_count++;
04334                                 }
04335                                 else if (te->getID() == IMG_DEFAULT_AVATAR)
04336                                 {
04337                                         default_count++;
04338                                 }
04339                         }
04340                 }
04341                 llinfos << "JAMESDEBUG my avatar TE null " << null_count << " default " << default_count << llendl;
04342         }
04343         */
04344 
04345         mMaxPixelArea = 0.f;
04346         mMinPixelArea = 99999999.f;
04347         for (U32 i = 0; i < getNumTEs(); i++)
04348         {
04349                 LLViewerImage *imagep = getTEImage(i);
04350                 if (imagep)
04351                 {
04352                         // Debugging code - maybe non-self avatars are downloading textures?
04353                         //llinfos << "avatar self " << mIsSelf << " tex " << i 
04354                         //      << " decode " << imagep->getDecodePriority()
04355                         //      << " boost " << boost_avatar 
04356                         //      << " size " << imagep->getWidth() << "x" << imagep->getHeight()
04357                         //      << " discard " << imagep->getDiscardLevel()
04358                         //      << " desired " << imagep->getDesiredDiscardLevel()
04359                         //      << llendl;
04360                         
04361                         const LLTextureEntry *te = getTE(i);
04362                         F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT);
04363 //                      BOOL boost_aux = (imagep->needsAux() && (!imagep->mFullWidth || !imagep->mFullHeight));
04364                         S32 boost_level = mIsSelf ? LLViewerImage::BOOST_AVATAR_BAKED_SELF : LLViewerImage::BOOST_AVATAR_BAKED;
04365                         
04366                         // Spam if this is a baked texture, not set to default image, without valid host info
04367                         if (isTextureIndexBaked(i)
04368                                 && imagep->getID() != IMG_DEFAULT_AVATAR
04369                                 && !imagep->getTargetHost().isOk())
04370                         {
04371                                 llwarns << "LLVOAvatar::updateTextures No host for texture "
04372                                         << imagep->getID() << " for avatar "
04373                                         << (mIsSelf ? "<myself>" : getID().asString().c_str()) 
04374                                         << " on host " << getRegion()->getHost() << llendl;
04375                         }
04376                         
04377                         switch( i )
04378                         {
04379                         // Head
04380                         case TEX_HEAD_BODYPAINT:
04381                                 addLocalTextureStats( LOCTEX_HEAD_BODYPAINT, imagep, texel_area_ratio, render_avatar, head_baked );
04382                                 break;
04383 
04384                         // Upper
04385                         case TEX_UPPER_JACKET:
04386                                 addLocalTextureStats( LOCTEX_UPPER_JACKET, imagep, texel_area_ratio, render_avatar, upper_baked );
04387                                 break;
04388 
04389                         case TEX_UPPER_SHIRT:
04390                                 addLocalTextureStats( LOCTEX_UPPER_SHIRT, imagep, texel_area_ratio, render_avatar, upper_baked );
04391                                 break;
04392 
04393                         case TEX_UPPER_GLOVES:
04394                                 addLocalTextureStats( LOCTEX_UPPER_GLOVES, imagep, texel_area_ratio, render_avatar, upper_baked );
04395                                 break;
04396                         
04397                         case TEX_UPPER_UNDERSHIRT:
04398                                 addLocalTextureStats( LOCTEX_UPPER_UNDERSHIRT, imagep, texel_area_ratio, render_avatar, upper_baked );
04399                                 break;
04400 
04401                         case TEX_UPPER_BODYPAINT:
04402                                 addLocalTextureStats( LOCTEX_UPPER_BODYPAINT, imagep, texel_area_ratio, render_avatar, upper_baked );
04403                                 break;
04404 
04405                         // Lower
04406                         case TEX_LOWER_JACKET:
04407                                 addLocalTextureStats( LOCTEX_LOWER_JACKET, imagep, texel_area_ratio, render_avatar, lower_baked );
04408                                 break;
04409 
04410                         case TEX_LOWER_PANTS:
04411                                 addLocalTextureStats( LOCTEX_LOWER_PANTS, imagep, texel_area_ratio, render_avatar, lower_baked );
04412                                 break;
04413 
04414                         case TEX_LOWER_SHOES:
04415                                 addLocalTextureStats( LOCTEX_LOWER_SHOES, imagep, texel_area_ratio, render_avatar, lower_baked );
04416                                 break;
04417 
04418                         case TEX_LOWER_SOCKS:
04419                                 addLocalTextureStats( LOCTEX_LOWER_SOCKS, imagep, texel_area_ratio, render_avatar, lower_baked );
04420                                 break;
04421 
04422                         case TEX_LOWER_UNDERPANTS:
04423                                 addLocalTextureStats( LOCTEX_LOWER_UNDERPANTS, imagep, texel_area_ratio, render_avatar, lower_baked );
04424                                 break;
04425 
04426                         case TEX_LOWER_BODYPAINT:
04427                                 addLocalTextureStats( LOCTEX_LOWER_BODYPAINT, imagep, texel_area_ratio, render_avatar, lower_baked );
04428                                 break;
04429 
04430                         // Eyes
04431                         case TEX_EYES_IRIS:
04432                                 addLocalTextureStats( LOCTEX_EYES_IRIS, imagep, texel_area_ratio, render_avatar, eyes_baked );
04433                                 break;
04434 
04435                         // Skirt
04436                         case TEX_SKIRT:
04437                                 addLocalTextureStats( LOCTEX_SKIRT, imagep, texel_area_ratio, render_avatar, skirt_baked );
04438                                 break;
04439 
04440                         // Baked
04441                         case TEX_HEAD_BAKED:
04442                                 if (head_baked)
04443                                 {
04444                                         addBakedTextureStats( imagep, mPixelArea, texel_area_ratio, boost_level );
04445                                 }
04446                                 break;
04447 
04448                         case TEX_UPPER_BAKED:
04449                                 if (upper_baked)
04450                                 {
04451                                         addBakedTextureStats( imagep, mPixelArea, texel_area_ratio, boost_level );
04452                                 }
04453                                 break;
04454                         
04455                         case TEX_LOWER_BAKED:
04456                                 if (lower_baked)
04457                                 {
04458                                         addBakedTextureStats( imagep, mPixelArea, texel_area_ratio, boost_level );
04459                                 }
04460                                 break;
04461                         
04462                         case TEX_EYES_BAKED:
04463                                 if (eyes_baked)
04464                                 {
04465                                         addBakedTextureStats( imagep, mPixelArea, texel_area_ratio, boost_level );
04466                                 }
04467                                 break;
04468 
04469                         case TEX_SKIRT_BAKED:
04470                                 if (skirt_baked)
04471                                 {
04472                                         addBakedTextureStats( imagep, mPixelArea, texel_area_ratio, boost_level );
04473                                 }
04474                                 break;
04475 
04476                         case TEX_HAIR:
04477                                 // Hair is neither a local texture used for baking, nor the output
04478                                 // of the baking process.  It's just a texture that happens to be
04479                                 // used to draw avatars.  Hence BOOST_AVATAR.  JC
04480                                 boost_level = mIsSelf ? LLViewerImage::BOOST_AVATAR_SELF : LLViewerImage::BOOST_AVATAR;
04481                                 addBakedTextureStats( imagep, mPixelArea, texel_area_ratio, boost_level );
04482                                 break;
04483                         
04484                         default:
04485                                 llassert(0);
04486                                 break;
04487                         }
04488                 }
04489         }
04490 
04491         if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
04492         {
04493                 setDebugText(llformat("%4.0f:%4.0f", fsqrtf(mMinPixelArea),fsqrtf(mMaxPixelArea)));
04494         }       
04495         
04496         if( render_avatar )
04497         {
04498                 mShadowImagep->addTextureStats(mPixelArea);
04499         }
04500 }
04501 
04502 
04503 void LLVOAvatar::addLocalTextureStats( LLVOAvatar::ELocTexIndex idx, LLViewerImage* imagep,
04504                                                                            F32 texel_area_ratio, BOOL render_avatar, BOOL covered_by_baked )
04505 {
04506         if (!covered_by_baked &&
04507                 render_avatar && // always true if mIsSelf
04508                 mLocalTexture[ idx ].notNull() && mLocalTexture[idx]->getID() != IMG_DEFAULT_AVATAR)
04509         {       
04510                 F32 desired_pixels;
04511                 if( mIsSelf )
04512                 {
04513                         desired_pixels = llmin(mPixelArea, (F32)LOCTEX_IMAGE_AREA_SELF );
04514                         imagep->setBoostLevel(LLViewerImage::BOOST_AVATAR_SELF);
04515                 }
04516                 else
04517                 {
04518                         desired_pixels = llmin(mPixelArea, (F32)LOCTEX_IMAGE_AREA_OTHER );
04519                         imagep->setBoostLevel(LLViewerImage::BOOST_AVATAR);
04520                 }
04521                 imagep->addTextureStats( desired_pixels, texel_area_ratio );
04522         }
04523 }
04524 
04525                             
04526 void LLVOAvatar::addBakedTextureStats( LLViewerImage* imagep, F32 pixel_area, F32 texel_area_ratio, S32 boost_level)
04527 {
04528         mMaxPixelArea = llmax(pixel_area, mMaxPixelArea);
04529         mMinPixelArea = llmin(pixel_area, mMinPixelArea);
04530         imagep->addTextureStats(pixel_area, texel_area_ratio);
04531         imagep->setBoostLevel(boost_level);
04532 }
04533 
04534 //-----------------------------------------------------------------------------
04535 // resolveHeight()
04536 //-----------------------------------------------------------------------------
04537 
04538 void LLVOAvatar::resolveHeightAgent(const LLVector3 &in_pos_agent, LLVector3 &out_pos_agent, LLVector3 &out_norm)
04539 {
04540         LLVector3d in_pos_global, out_pos_global;
04541 
04542         in_pos_global = gAgent.getPosGlobalFromAgent(in_pos_agent);
04543         resolveHeightGlobal(in_pos_global, out_pos_global, out_norm);
04544         out_pos_agent = gAgent.getPosAgentFromGlobal(out_pos_global);
04545 }
04546 
04547 
04548 void LLVOAvatar::resolveRayCollisionAgent(const LLVector3d start_pt, const LLVector3d end_pt, LLVector3d &out_pos, LLVector3 &out_norm)
04549 {
04550         LLViewerObject *obj;
04551         LLWorld::getInstance()->resolveStepHeightGlobal(this, start_pt, end_pt, out_pos, out_norm, &obj);
04552 }
04553 
04554 
04555 void LLVOAvatar::resolveHeightGlobal(const LLVector3d &inPos, LLVector3d &outPos, LLVector3 &outNorm)
04556 {
04557         LLVector3d zVec(0.0f, 0.0f, 0.5f);
04558         LLVector3d p0 = inPos + zVec;
04559         LLVector3d p1 = inPos - zVec;
04560         LLViewerObject *obj;
04561         LLWorld::getInstance()->resolveStepHeightGlobal(this, p0, p1, outPos, outNorm, &obj);
04562         if (!obj)
04563         {
04564                 mStepOnLand = TRUE;
04565                 mStepMaterial = 0;
04566                 mStepObjectVelocity.setVec(0.0f, 0.0f, 0.0f);
04567         }
04568         else
04569         {
04570                 mStepOnLand = FALSE;
04571                 mStepMaterial = obj->getMaterial();
04572 
04573                 // We want the primitive velocity, not our velocity... (which actually subtracts the
04574                 // step object velocity)
04575                 LLVector3 angularVelocity = obj->getAngularVelocity();
04576                 LLVector3 relativePos = gAgent.getPosAgentFromGlobal(outPos) - obj->getPositionAgent();
04577 
04578                 LLVector3 linearComponent = angularVelocity % relativePos;
04579 //              llinfos << "Linear Component of Rotation Velocity " << linearComponent << llendl;
04580                 mStepObjectVelocity = obj->getVelocity() + linearComponent;
04581         }
04582 }
04583 
04584 
04585 //-----------------------------------------------------------------------------
04586 // getStepSound()
04587 //-----------------------------------------------------------------------------
04588 LLUUID& LLVOAvatar::getStepSound()
04589 {
04590         if ( mStepOnLand )
04591         {
04592                 return sStepSoundOnLand;
04593         }
04594 
04595         return sStepSounds[mStepMaterial];
04596 }
04597 
04598 
04599 //-----------------------------------------------------------------------------
04600 // processAnimationStateChanges()
04601 //-----------------------------------------------------------------------------
04602 void LLVOAvatar::processAnimationStateChanges()
04603 {
04604         LLMemType mt(LLMemType::MTYPE_AVATAR);
04605         
04606         if (gNoRender)
04607         {
04608                 return;
04609         }
04610 
04611         if ( isAnyAnimationSignaled(AGENT_WALK_ANIMS, NUM_AGENT_WALK_ANIMS) )
04612         {
04613                 startMotion(ANIM_AGENT_WALK_ADJUST);
04614                 stopMotion(ANIM_AGENT_FLY_ADJUST);
04615         }
04616         else if (mInAir && !mIsSitting)
04617         {
04618                 stopMotion(ANIM_AGENT_WALK_ADJUST);
04619                 startMotion(ANIM_AGENT_FLY_ADJUST);
04620         }
04621         else
04622         {
04623                 stopMotion(ANIM_AGENT_WALK_ADJUST);
04624                 stopMotion(ANIM_AGENT_FLY_ADJUST);
04625         }
04626 
04627         if ( isAnyAnimationSignaled(AGENT_GUN_AIM_ANIMS, NUM_AGENT_GUN_AIM_ANIMS) )
04628         {
04629                 startMotion(ANIM_AGENT_TARGET);
04630                 stopMotion(ANIM_AGENT_BODY_NOISE);
04631         }
04632         else
04633         {
04634                 stopMotion(ANIM_AGENT_TARGET);
04635                 startMotion(ANIM_AGENT_BODY_NOISE);
04636         }
04637         
04638         // clear all current animations
04639         AnimIterator anim_it;
04640         for (anim_it = mPlayingAnimations.begin(); anim_it != mPlayingAnimations.end();)
04641         {
04642                 AnimIterator found_anim = mSignaledAnimations.find(anim_it->first);
04643 
04644                 // playing, but not signaled, so stop
04645                 if (found_anim == mSignaledAnimations.end())
04646                 {
04647                         processSingleAnimationStateChange(anim_it->first, FALSE);
04648                         mPlayingAnimations.erase(anim_it++);
04649                         continue;
04650                 }
04651 
04652                 ++anim_it;
04653         }
04654 
04655         // start up all new anims
04656         for (anim_it = mSignaledAnimations.begin(); anim_it != mSignaledAnimations.end();)
04657         {
04658                 AnimIterator found_anim = mPlayingAnimations.find(anim_it->first);
04659 
04660                 // signaled but not playing, or different sequence id, start motion
04661                 if (found_anim == mPlayingAnimations.end() || found_anim->second != anim_it->second)
04662                 {
04663                         if (processSingleAnimationStateChange(anim_it->first, TRUE))
04664                         {
04665                                 mPlayingAnimations[anim_it->first] = anim_it->second;
04666                                 ++anim_it;
04667                                 continue;
04668                         }
04669                 }
04670 
04671                 ++anim_it;
04672         }
04673 
04674         // clear source information for animations which have been stopped
04675         if (mIsSelf)
04676         {
04677                 AnimSourceIterator source_it = mAnimationSources.begin();
04678 
04679                 for (source_it = mAnimationSources.begin(); source_it != mAnimationSources.end();)
04680                 {
04681                         if (mSignaledAnimations.find(source_it->second) == mSignaledAnimations.end())
04682                         {
04683                                 mAnimationSources.erase(source_it++);
04684                         }
04685                         else
04686                         {
04687                                 ++source_it;
04688                         }
04689                 }
04690         }
04691 
04692         stop_glerror();
04693 }
04694 
04695 
04696 //-----------------------------------------------------------------------------
04697 // processSingleAnimationStateChange();
04698 //-----------------------------------------------------------------------------
04699 BOOL LLVOAvatar::processSingleAnimationStateChange( const LLUUID& anim_id, BOOL start )
04700 {
04701         LLMemType mt(LLMemType::MTYPE_AVATAR);
04702         
04703         BOOL result = FALSE;
04704 
04705         if ( start ) // start animation
04706         {
04707                 if (anim_id == ANIM_AGENT_TYPE)
04708                 {
04709                         if (gAudiop)
04710                         {
04711                                 LLVector3d char_pos_global = gAgent.getPosGlobalFromAgent(getCharacterPosition());
04712                                 if (LLViewerParcelMgr::getInstance()->canHearSound(char_pos_global)
04713                                     && !LLMuteList::getInstance()->isMuted(getID(), LLMute::flagObjectSounds))
04714                                 {
04715                                         // RN: uncomment this to play on typing sound at fixed volume once sound engine is fixed
04716                                         // to support both spatialized and non-spatialized instances of the same sound
04717                                         //if (mIsSelf)
04718                                         //{
04719                                         //  F32 volume = gain * gSavedSettings.getF32("AudioLevelUI")
04720                                         //      gAudiop->triggerSound(LLUUID(gSavedSettings.getString("UISndTyping")), volume);
04721                                         //}
04722                                         //else
04723                                         {
04724                                                 LLUUID sound_id = LLUUID(gSavedSettings.getString("UISndTyping"));
04725                                                 F32 volume = gSavedSettings.getBOOL("MuteSounds") ? 0.f : gSavedSettings.getF32("AudioLevelSFX");
04726                                                 gAudiop->triggerSound(sound_id, getID(), volume, char_pos_global);
04727                                         }
04728                                 }
04729                         }
04730                 }
04731                 else if (anim_id == ANIM_AGENT_SIT_GROUND_CONSTRAINED)
04732                 {
04733                         mIsSitting = TRUE;
04734                 }
04735 
04736 
04737                 if (startMotion(anim_id))
04738                 {
04739                         result = TRUE;
04740                 }
04741                 else
04742                 {
04743                         llwarns << "Failed to start motion!" << llendl;
04744                 }
04745         }
04746         else //stop animation
04747         {
04748                 if (anim_id == ANIM_AGENT_SIT_GROUND_CONSTRAINED)
04749                 {
04750                         mIsSitting = FALSE;
04751                 }
04752                 stopMotion(anim_id);
04753                 result = TRUE;
04754         }
04755 
04756         return result;
04757 }
04758 
04759 //-----------------------------------------------------------------------------
04760 // isAnyAnimationSignaled()
04761 //-----------------------------------------------------------------------------
04762 BOOL LLVOAvatar::isAnyAnimationSignaled(const LLUUID *anim_array, const S32 num_anims)
04763 {
04764         for (S32 i = 0; i < num_anims; i++)
04765         {
04766                 if(mSignaledAnimations.find(anim_array[i]) != mSignaledAnimations.end())
04767                 {
04768                         return TRUE;
04769                 }
04770         }
04771         return FALSE;
04772 }
04773 
04774 //-----------------------------------------------------------------------------
04775 // resetAnimations()
04776 //-----------------------------------------------------------------------------
04777 void LLVOAvatar::resetAnimations()
04778 {
04779         LLKeyframeMotion::flushKeyframeCache();
04780         flushAllMotions();
04781 }
04782 
04783 //-----------------------------------------------------------------------------
04784 // startMotion()
04785 // id is the asset if of the animation to start
04786 // time_offset is the offset into the animation at which to start playing
04787 //-----------------------------------------------------------------------------
04788 BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset)
04789 {
04790         LLMemType mt(LLMemType::MTYPE_AVATAR);
04791         
04792         // start special case female walk for female avatars
04793         if (getSex() == SEX_FEMALE)
04794         {
04795                 if (id == ANIM_AGENT_WALK)
04796                 {
04797                         return LLCharacter::startMotion(ANIM_AGENT_FEMALE_WALK, time_offset);
04798                 }
04799                 else if (id == ANIM_AGENT_SIT)
04800                 {
04801                         return LLCharacter::startMotion(ANIM_AGENT_SIT_FEMALE, time_offset);
04802                 }
04803         }
04804 
04805         if (mIsSelf && id == ANIM_AGENT_AWAY)
04806         {
04807                 gAgent.setAFK();
04808         }
04809 
04810         return LLCharacter::startMotion(id, time_offset);
04811 }
04812 
04813 //-----------------------------------------------------------------------------
04814 // stopMotion()
04815 //-----------------------------------------------------------------------------
04816 BOOL LLVOAvatar::stopMotion(const LLUUID& id, BOOL stop_immediate)
04817 {
04818         if (mIsSelf)
04819         {
04820                 gAgent.onAnimStop(id);
04821         }
04822 
04823         if (id == ANIM_AGENT_WALK)
04824         {
04825                 LLCharacter::stopMotion(ANIM_AGENT_FEMALE_WALK, stop_immediate);
04826         }
04827         else if (id == ANIM_AGENT_SIT)
04828         {
04829                 LLCharacter::stopMotion(ANIM_AGENT_SIT_FEMALE, stop_immediate);
04830         }
04831 
04832         return LLCharacter::stopMotion(id, stop_immediate);
04833 }
04834 
04835 //-----------------------------------------------------------------------------
04836 // stopMotionFromSource()
04837 //-----------------------------------------------------------------------------
04838 void LLVOAvatar::stopMotionFromSource(const LLUUID& source_id)
04839 {
04840         if (!mIsSelf)
04841         {
04842                 return;
04843         }
04844         AnimSourceIterator motion_it;
04845 
04846         for(motion_it = mAnimationSources.find(source_id); motion_it != mAnimationSources.end();)
04847         {
04848                 gAgent.sendAnimationRequest( motion_it->second, ANIM_REQUEST_STOP );
04849                 mAnimationSources.erase(motion_it++);
04850         }
04851 
04852         LLViewerObject* object = gObjectList.findObject(source_id);
04853         if (object)
04854         {
04855                 object->mFlags &= ~FLAGS_ANIM_SOURCE;
04856         }
04857 }
04858 
04859 //-----------------------------------------------------------------------------
04860 // getVolumePos()
04861 //-----------------------------------------------------------------------------
04862 LLVector3 LLVOAvatar::getVolumePos(S32 joint_index, LLVector3& volume_offset)
04863 {
04864         if (joint_index > mNumCollisionVolumes)
04865         {
04866                 return LLVector3::zero;
04867         }
04868 
04869         return mCollisionVolumes[joint_index].getVolumePos(volume_offset);
04870 }
04871 
04872 //-----------------------------------------------------------------------------
04873 // findCollisionVolume()
04874 //-----------------------------------------------------------------------------
04875 LLJoint* LLVOAvatar::findCollisionVolume(U32 volume_id)
04876 {
04877         if ((S32)volume_id > mNumCollisionVolumes)
04878         {
04879                 return NULL;
04880         }
04881         
04882         return &mCollisionVolumes[volume_id];
04883 }
04884 
04885 //-----------------------------------------------------------------------------
04886 // findCollisionVolume()
04887 //-----------------------------------------------------------------------------
04888 S32 LLVOAvatar::getCollisionVolumeID(std::string &name)
04889 {
04890         for (S32 i = 0; i < mNumCollisionVolumes; i++)
04891         {
04892                 if (mCollisionVolumes[i].getName() == name)
04893                 {
04894                         return i;
04895                 }
04896         }
04897 
04898         return -1;
04899 }
04900 
04901 //-----------------------------------------------------------------------------
04902 // addDebugText()
04903 //-----------------------------------------------------------------------------
04904  void LLVOAvatar::addDebugText(const std::string& text)
04905 {
04906         mDebugText.append(1, '\n');
04907         mDebugText.append(text);
04908 }
04909 
04910 //-----------------------------------------------------------------------------
04911 // getID()
04912 //-----------------------------------------------------------------------------
04913 const LLUUID& LLVOAvatar::getID()
04914 {
04915         return mID;
04916 }
04917 
04918 //-----------------------------------------------------------------------------
04919 // getJoint()
04920 //-----------------------------------------------------------------------------
04921 // RN: avatar joints are multi-rooted to include screen-based attachments
04922 LLJoint *LLVOAvatar::getJoint( const std::string &name )
04923 {
04924         LLJoint* jointp = NULL;
04925         if (mScreenp)
04926         {
04927                 jointp = mScreenp->findJoint(name);
04928         }
04929         if (!jointp)
04930         {
04931                 jointp = mRoot.findJoint(name);
04932         }
04933         return jointp;
04934 }
04935 
04936 //-----------------------------------------------------------------------------
04937 // getCharacterPosition()
04938 //-----------------------------------------------------------------------------
04939 LLVector3 LLVOAvatar::getCharacterPosition()
04940 {
04941         if (mDrawable.notNull())
04942         {
04943                 return mDrawable->getPositionAgent();
04944         }
04945         else
04946         {
04947                 return getPositionAgent();
04948         }
04949 }
04950 
04951 
04952 //-----------------------------------------------------------------------------
04953 // LLVOAvatar::getCharacterRotation()
04954 //-----------------------------------------------------------------------------
04955 LLQuaternion LLVOAvatar::getCharacterRotation()
04956 {
04957         return getRotation();
04958 }
04959 
04960 
04961 //-----------------------------------------------------------------------------
04962 // LLVOAvatar::getCharacterVelocity()
04963 //-----------------------------------------------------------------------------
04964 LLVector3 LLVOAvatar::getCharacterVelocity()
04965 {
04966         return getVelocity() - mStepObjectVelocity;
04967 }
04968 
04969 
04970 //-----------------------------------------------------------------------------
04971 // LLVOAvatar::getCharacterAngularVelocity()
04972 //-----------------------------------------------------------------------------
04973 LLVector3 LLVOAvatar::getCharacterAngularVelocity()
04974 {
04975         return getAngularVelocity();
04976 }
04977 
04978 //-----------------------------------------------------------------------------
04979 // LLVOAvatar::getGround()
04980 //-----------------------------------------------------------------------------
04981 void LLVOAvatar::getGround(const LLVector3 &in_pos_agent, LLVector3 &out_pos_agent, LLVector3 &outNorm)
04982 {
04983         LLVector3d z_vec(0.0f, 0.0f, 1.0f);
04984         LLVector3d p0_global, p1_global;
04985 
04986         if (gNoRender || mIsDummy)
04987         {
04988                 outNorm.setVec(z_vec);
04989                 out_pos_agent = in_pos_agent;
04990                 return;
04991         }
04992         
04993         p0_global = gAgent.getPosGlobalFromAgent(in_pos_agent) + z_vec;
04994         p1_global = gAgent.getPosGlobalFromAgent(in_pos_agent) - z_vec;
04995         LLViewerObject *obj;
04996         LLVector3d out_pos_global;
04997         LLWorld::getInstance()->resolveStepHeightGlobal(this, p0_global, p1_global, out_pos_global, outNorm, &obj);
04998         out_pos_agent = gAgent.getPosAgentFromGlobal(out_pos_global);
04999 }
05000 
05001 //-----------------------------------------------------------------------------
05002 // LLVOAvatar::getTimeDilation()
05003 //-----------------------------------------------------------------------------
05004 F32 LLVOAvatar::getTimeDilation()
05005 {
05006         return mTimeDilation;
05007 }
05008 
05009 
05010 //-----------------------------------------------------------------------------
05011 // LLVOAvatar::getPixelArea()
05012 //-----------------------------------------------------------------------------
05013 F32 LLVOAvatar::getPixelArea() const
05014 {
05015         if (mIsDummy)
05016         {
05017                 return 100000.f;
05018         }
05019         return mPixelArea;
05020 }
05021 
05022 
05023 //-----------------------------------------------------------------------------
05024 // LLVOAvatar::getHeadMesh()
05025 //-----------------------------------------------------------------------------
05026 LLPolyMesh*     LLVOAvatar::getHeadMesh()
05027 {
05028         return mHeadMesh0.getMesh();
05029 }
05030 
05031 
05032 //-----------------------------------------------------------------------------
05033 // LLVOAvatar::getUpperBodyMesh()
05034 //-----------------------------------------------------------------------------
05035 LLPolyMesh*     LLVOAvatar::getUpperBodyMesh()
05036 {
05037         return mUpperBodyMesh0.getMesh();
05038 }
05039 
05040 
05041 //-----------------------------------------------------------------------------
05042 // LLVOAvatar::getPosGlobalFromAgent()
05043 //-----------------------------------------------------------------------------
05044 LLVector3d      LLVOAvatar::getPosGlobalFromAgent(const LLVector3 &position)
05045 {
05046         return gAgent.getPosGlobalFromAgent(position);
05047 }
05048 
05049 //-----------------------------------------------------------------------------
05050 // getPosAgentFromGlobal()
05051 //-----------------------------------------------------------------------------
05052 LLVector3       LLVOAvatar::getPosAgentFromGlobal(const LLVector3d &position)
05053 {
05054         return gAgent.getPosAgentFromGlobal(position);
05055 }
05056 
05057 //-----------------------------------------------------------------------------
05058 // allocateCharacterJoints()
05059 //-----------------------------------------------------------------------------
05060 BOOL LLVOAvatar::allocateCharacterJoints( U32 num )
05061 {
05062         delete [] mSkeleton;
05063         mSkeleton = NULL;
05064         mNumJoints = 0;
05065 
05066         mSkeleton = new LLViewerJoint[num];
05067         
05068         for(S32 joint_num = 0; joint_num < (S32)num; joint_num++)
05069         {
05070                 mSkeleton[joint_num].setJointNum(joint_num);
05071         }
05072 
05073         if (!mSkeleton)
05074         {
05075                 return FALSE;
05076         }
05077 
05078         mNumJoints = num;
05079         return TRUE;
05080 }
05081 
05082 //-----------------------------------------------------------------------------
05083 // allocateCollisionVolumes()
05084 //-----------------------------------------------------------------------------
05085 BOOL LLVOAvatar::allocateCollisionVolumes( U32 num )
05086 {
05087         delete [] mCollisionVolumes;
05088         mCollisionVolumes = NULL;
05089         mNumCollisionVolumes = 0;
05090 
05091         mCollisionVolumes = new LLViewerJointCollisionVolume[num];
05092         if (!mCollisionVolumes)
05093         {
05094                 return FALSE;
05095         }
05096 
05097         mNumCollisionVolumes = num;
05098         return TRUE;
05099 }
05100 
05101 
05102 //-----------------------------------------------------------------------------
05103 // getCharacterJoint()
05104 //-----------------------------------------------------------------------------
05105 LLJoint *LLVOAvatar::getCharacterJoint( U32 num )
05106 {
05107         if ((S32)num >= mNumJoints 
05108             || (S32)num < 0)
05109         {
05110                 return NULL;
05111         }
05112         return (LLJoint*)&mSkeleton[num];
05113 }
05114 
05115 //-----------------------------------------------------------------------------
05116 // requestStopMotion()
05117 //-----------------------------------------------------------------------------
05118 void LLVOAvatar::requestStopMotion( LLMotion* motion )
05119 {
05120         // Only agent avatars should handle the stop motion notifications.
05121         if ( mIsSelf )
05122         {
05123                 // Notify agent that motion has stopped
05124                 gAgent.requestStopMotion( motion );
05125         }
05126 }
05127 
05128 //-----------------------------------------------------------------------------
05129 // loadAvatar()
05130 //-----------------------------------------------------------------------------
05131 BOOL LLVOAvatar::loadAvatar()
05132 {
05133 //      LLFastTimer t(LLFastTimer::FTM_LOAD_AVATAR);
05134         
05135         // avatar_skeleton.xml
05136         if( !buildSkeleton(sSkeletonInfo) )
05137         {
05138                 llwarns << "avatar file: buildSkeleton() failed" << llendl;
05139                 return FALSE;
05140         }
05141 
05142         // avatar_lad.xml : <skeleton>
05143         if( !loadSkeletonNode() )
05144         {
05145                 llwarns << "avatar file: loadNodeSkeleton() failed" << llendl;
05146                 return FALSE;
05147         }
05148         
05149         // avatar_lad.xml : <mesh>
05150         if( !loadMeshNodes() )
05151         {
05152                 llwarns << "avatar file: loadNodeMesh() failed" << llendl;
05153                 return FALSE;
05154         }
05155         
05156         // avatar_lad.xml : <global_color>
05157         if( sAvatarInfo->mTexSkinColorInfo )
05158         {
05159                 mTexSkinColor = new LLTexGlobalColor( this );
05160                 if( !mTexSkinColor->setInfo( sAvatarInfo->mTexSkinColorInfo ) )
05161                 {
05162                         llwarns << "avatar file: mTexSkinColor->setInfo() failed" << llendl;
05163                         return FALSE;
05164                 }
05165         }
05166         else
05167         {
05168                 llwarns << "<global_color> name=\"skin_color\" not found" << llendl;
05169                 return FALSE;
05170         }
05171         if( sAvatarInfo->mTexHairColorInfo )
05172         {
05173                 mTexHairColor = new LLTexGlobalColor( this );
05174                 if( !mTexHairColor->setInfo( sAvatarInfo->mTexHairColorInfo ) )
05175                 {
05176                         llwarns << "avatar file: mTexHairColor->setInfo() failed" << llendl;
05177                         return FALSE;
05178                 }
05179         }
05180         else
05181         {
05182                 llwarns << "<global_color> name=\"hair_color\" not found" << llendl;
05183                 return FALSE;
05184         }
05185         if( sAvatarInfo->mTexEyeColorInfo )
05186         {
05187                 mTexEyeColor = new LLTexGlobalColor( this );
05188                 if( !mTexEyeColor->setInfo( sAvatarInfo->mTexEyeColorInfo ) )
05189                 {
05190                         llwarns << "avatar file: mTexEyeColor->setInfo() failed" << llendl;
05191                         return FALSE;
05192                 }
05193         }
05194         else
05195         {
05196                 llwarns << "<global_color> name=\"eye_color\" not found" << llendl;
05197                 return FALSE;
05198         }
05199         
05200         // avatar_lad.xml : <layer_set>
05201         if (sAvatarInfo->mLayerInfoList.empty())
05202         {
05203                 llwarns << "avatar file: missing <layer_set> node" << llendl;
05204         }
05205         else
05206         {
05207                 LLVOAvatarInfo::layer_info_list_t::iterator iter;
05208                 for (iter = sAvatarInfo->mLayerInfoList.begin();
05209                          iter != sAvatarInfo->mLayerInfoList.end(); iter++)
05210                 {
05211                         LLTexLayerSetInfo *info = *iter;
05212                         LLTexLayerSet* layer_set = new LLTexLayerSet( this );
05213                         if (!layer_set->setInfo(info))
05214                         {
05215                                 stop_glerror();
05216                                 delete layer_set;
05217                                 llwarns << "avatar file: layer_set->parseData() failed" << llendl;
05218                                 return FALSE;
05219                         }
05220                         if( layer_set->isBodyRegion( "head" ) )
05221                         {
05222                                 mHeadLayerSet = layer_set;
05223                         }
05224                         else if( layer_set->isBodyRegion( "upper_body" ) )
05225                         {
05226                                 mUpperBodyLayerSet = layer_set;
05227                         }
05228                         else if( layer_set->isBodyRegion( "lower_body" ) )
05229                         {
05230                                 mLowerBodyLayerSet = layer_set;
05231                         }
05232                         else if( layer_set->isBodyRegion( "eyes" ) )
05233                         {
05234                                 mEyesLayerSet = layer_set;
05235                         }
05236                         else if( layer_set->isBodyRegion( "skirt" ) )
05237                         {
05238                                 mSkirtLayerSet = layer_set;
05239                         }
05240                         else
05241                         {
05242                                 llwarns << "<layer_set> has invalid body_region attribute" << llendl;
05243                                 delete layer_set;
05244                                 return FALSE;
05245                         }
05246                 }
05247         }
05248         
05249         // avatar_lad.xml : <driver_parameters>
05250         {
05251                 LLVOAvatarInfo::driver_info_list_t::iterator iter;
05252                 for (iter = sAvatarInfo->mDriverInfoList.begin();
05253                          iter != sAvatarInfo->mDriverInfoList.end(); iter++)
05254                 {
05255                         LLDriverParamInfo *info = *iter;
05256                         LLDriverParam* driver_param = new LLDriverParam( this );
05257                         if (driver_param->setInfo(info))
05258                         {
05259                                 addVisualParam( driver_param );
05260                         }
05261                         else
05262                         {
05263                                 delete driver_param;
05264                                 llwarns << "avatar file: driver_param->parseData() failed" << llendl;
05265                                 return FALSE;
05266                         }
05267                 }
05268         }
05269         
05270         return TRUE;
05271 }
05272 
05273 //-----------------------------------------------------------------------------
05274 // loadSkeletonNode(): loads <skeleton> node from XML tree
05275 //-----------------------------------------------------------------------------
05276 BOOL LLVOAvatar::loadSkeletonNode ()
05277 {
05278         mRoot.addChild( &mSkeleton[0] );
05279 
05280         mRoot.addChild( &mHeadLOD );
05281                 mHeadLOD.mUpdateXform = FALSE;
05282                 mHeadLOD.addChild( &mHeadMesh0 );
05283                 mHeadLOD.addChild( &mHeadMesh1 );
05284                 mHeadLOD.addChild( &mHeadMesh2 );
05285                 mHeadLOD.addChild( &mHeadMesh3 );
05286                 mHeadLOD.addChild( &mHeadMesh4 );
05287         
05288         mRoot.addChild( &mEyeLashLOD );
05289                 mEyeLashLOD.mUpdateXform = FALSE;
05290                 mEyeLashLOD.addChild( &mEyeLashMesh0 );
05291 
05292         mRoot.addChild( &mUpperBodyLOD );
05293                 mUpperBodyLOD.mUpdateXform = FALSE;
05294                 mUpperBodyLOD.addChild( &mUpperBodyMesh0 );
05295                 mUpperBodyLOD.addChild( &mUpperBodyMesh1 );
05296                 mUpperBodyLOD.addChild( &mUpperBodyMesh2 );
05297                 mUpperBodyLOD.addChild( &mUpperBodyMesh3 );
05298                 mUpperBodyLOD.addChild( &mUpperBodyMesh4 );
05299 
05300         mRoot.addChild( &mLowerBodyLOD );
05301                 mLowerBodyLOD.mUpdateXform = FALSE;
05302                 mLowerBodyLOD.addChild( &mLowerBodyMesh0 );
05303                 mLowerBodyLOD.addChild( &mLowerBodyMesh1 );
05304                 mLowerBodyLOD.addChild( &mLowerBodyMesh2 );
05305                 mLowerBodyLOD.addChild( &mLowerBodyMesh3 );
05306                 mLowerBodyLOD.addChild( &mLowerBodyMesh4 );
05307 
05308         mRoot.addChild( &mSkirtLOD );
05309                 mSkirtLOD.mUpdateXform = FALSE;
05310                 mSkirtLOD.addChild( &mSkirtMesh0 );
05311                 mSkirtLOD.addChild( &mSkirtMesh1 );
05312                 mSkirtLOD.addChild( &mSkirtMesh2 );
05313                 mSkirtLOD.addChild( &mSkirtMesh3 );
05314                 mSkirtLOD.addChild( &mSkirtMesh4 );
05315 
05316         LLViewerJoint *skull = (LLViewerJoint*)mRoot.findJoint("mSkull");
05317         if (skull)
05318         {
05319                 skull->addChild( &mHairLOD );
05320                         mHairLOD.mUpdateXform = FALSE;
05321                         mHairLOD.addChild( &mHairMesh0 );
05322                         mHairLOD.addChild( &mHairMesh1 );
05323                         mHairLOD.addChild( &mHairMesh2 );
05324                         mHairLOD.addChild( &mHairMesh3 );
05325                         mHairLOD.addChild( &mHairMesh4 );
05326                         mHairLOD.addChild( &mHairMesh5 );
05327         }
05328 
05329         LLViewerJoint *eyeL = (LLViewerJoint*)mRoot.findJoint("mEyeLeft");
05330         if (eyeL)
05331         {
05332                 eyeL->addChild( &mEyeBallLeftLOD );
05333                         mEyeBallLeftLOD.mUpdateXform = FALSE;
05334                         mEyeBallLeftLOD.addChild( &mEyeBallLeftMesh0 );
05335                         mEyeBallLeftLOD.addChild( &mEyeBallLeftMesh1 );
05336         }
05337 
05338         LLViewerJoint *eyeR = (LLViewerJoint*)mRoot.findJoint("mEyeRight");
05339         if (eyeR)
05340         {
05341                 eyeR->addChild( &mEyeBallRightLOD );
05342                         mEyeBallRightLOD.mUpdateXform = FALSE;
05343                         mEyeBallRightLOD.addChild( &mEyeBallRightMesh0 );
05344                         mEyeBallRightLOD.addChild( &mEyeBallRightMesh1 );
05345         }
05346 
05347         // SKELETAL DISTORTIONS
05348         {
05349                 LLVOAvatarInfo::skeletal_distortion_info_list_t::iterator iter;
05350                 for (iter = sAvatarInfo->mSkeletalDistortionInfoList.begin();
05351                          iter != sAvatarInfo->mSkeletalDistortionInfoList.end(); iter++)
05352                 {
05353                         LLPolySkeletalDistortionInfo *info = *iter;
05354                         LLPolySkeletalDistortion *param = new LLPolySkeletalDistortion(this);
05355                         if (!param->setInfo(info))
05356                         {
05357                                 delete param;
05358                                 return FALSE;
05359                         }
05360                         else
05361                         {
05362                                 addVisualParam(param);
05363                         }                               
05364                 }
05365         }
05366         
05367         // ATTACHMENTS
05368         {
05369                 LLVOAvatarInfo::attachment_info_list_t::iterator iter;
05370                 for (iter = sAvatarInfo->mAttachmentInfoList.begin();
05371                          iter != sAvatarInfo->mAttachmentInfoList.end(); iter++)
05372                 {
05373                         LLVOAvatarInfo::LLVOAvatarAttachmentInfo *info = *iter;
05374                         if (!isSelf() && info->mJointName == "mScreen")
05375                         { //don't process screen joint for other avatars
05376                                 continue;
05377                         }
05378 
05379                         LLViewerJointAttachment* attachment = new LLViewerJointAttachment();
05380 
05381                         attachment->setName(info->mName);
05382                         LLJoint *parentJoint = getJoint(info->mJointName);
05383                         if (!parentJoint)
05384                         {
05385                                 llwarns << "No parent joint by name " << info->mJointName << " found for attachment point " << info->mName << llendl;
05386                                 delete attachment;
05387                                 continue;
05388                         }
05389 
05390                         if (info->mHasPosition)
05391                         {
05392                                 attachment->setOriginalPosition(info->mPosition);
05393                         }
05394 
05395                         if (info->mHasRotation)
05396                         {
05397                                 LLQuaternion rotation;
05398                                 rotation.setQuat(info->mRotationEuler.mV[VX] * DEG_TO_RAD,
05399                                                                  info->mRotationEuler.mV[VY] * DEG_TO_RAD,
05400                                                                  info->mRotationEuler.mV[VZ] * DEG_TO_RAD);
05401                                 attachment->setRotation(rotation);
05402                         }
05403 
05404                         int group = info->mGroup;
05405                         if (group >= 0)
05406                         {
05407                                 if (group < 0 || group >= 9)
05408                                 {
05409                                         llwarns << "Invalid group number (" << group << ") for attachment point " << info->mName << llendl;
05410                                 }
05411                                 else
05412                                 {
05413                                         attachment->setGroup(group);
05414                                 }
05415                         }
05416 
05417                         S32 attachmentID = info->mAttachmentID;
05418                         if (attachmentID < 1 || attachmentID > 255)
05419                         {
05420                                 llwarns << "Attachment point out of range [1-255]: " << attachmentID << " on attachment point " << info->mName << llendl;
05421                                 delete attachment;
05422                                 continue;
05423                         }
05424                         if (mAttachmentPoints.find(attachmentID) != mAttachmentPoints.end())
05425                         {
05426                                 llwarns << "Attachment point redefined with id " << attachmentID << " on attachment point " << info->mName << llendl;
05427                                 delete attachment;
05428                                 continue;
05429                         }
05430 
05431                         attachment->setPieSlice(info->mPieMenuSlice);
05432                         attachment->setVisibleInFirstPerson(info->mVisibleFirstPerson);
05433                         attachment->setIsHUDAttachment(info->mIsHUDAttachment);
05434 
05435                         mAttachmentPoints[attachmentID] = attachment;
05436 
05437                         // now add attachment joint
05438                         parentJoint->addChild(attachment);
05439                 }
05440         }
05441 
05442         return TRUE;
05443 }
05444 
05445 //-----------------------------------------------------------------------------
05446 // loadMeshNodes(): loads <mesh> nodes from XML tree
05447 //-----------------------------------------------------------------------------
05448 BOOL LLVOAvatar::loadMeshNodes()
05449 {
05450         LLVOAvatarInfo::mesh_info_list_t::iterator iter;
05451         for (iter = sAvatarInfo->mMeshInfoList.begin();
05452                  iter != sAvatarInfo->mMeshInfoList.end(); iter++)
05453         {
05454                 LLVOAvatarInfo::LLVOAvatarMeshInfo *info = *iter;
05455                 LLString &type = info->mType;
05456                 S32 lod = info->mLOD;
05457 
05458                 LLViewerJointMesh* mesh = NULL;
05459                 if (type == "hairMesh")
05460                 {
05461                         switch (lod)
05462                         {
05463                           case 0:
05464                                 mesh = &mHairMesh0;
05465                                 break;
05466                           case 1:
05467                                 mesh = &mHairMesh1;
05468                                 break;
05469                           case 2:
05470                                 mesh = &mHairMesh2;
05471                                 break;
05472                           case 3:
05473                                 mesh = &mHairMesh3;
05474                                 break;
05475                           case 4:
05476                                 mesh = &mHairMesh4;
05477                                 break;
05478                           case 5:
05479                                 mesh = &mHairMesh5;
05480                                 break;
05481                           default:
05482                                 llwarns << "Avatar file: <mesh> has invalid lod setting " << lod << llendl;
05483                                 return FALSE;
05484                         }
05485                 }
05486                 else if (type == "headMesh")
05487                 {
05488                         switch (lod)
05489                         {
05490                           case 0:
05491                                 mesh = &mHeadMesh0;
05492                                 break;
05493                           case 1:
05494                                 mesh = &mHeadMesh1;
05495                                 break;
05496                           case 2:
05497                                 mesh = &mHeadMesh2;
05498                                 break;
05499                           case 3:
05500                                 mesh = &mHeadMesh3;
05501                                 break;
05502                           case 4:
05503                                 mesh = &mHeadMesh4;
05504                                 break;
05505                           default:
05506                                 llwarns << "Avatar file: <mesh> has invalid lod setting " << lod << llendl;
05507                                 return FALSE;
05508                         }
05509                 }
05510                 else if (type == "upperBodyMesh")
05511                 {
05512                         switch (lod)
05513                         {
05514                           case 0:
05515                                 mesh = &mUpperBodyMesh0;
05516                                 break;
05517                           case 1:
05518                                 mesh = &mUpperBodyMesh1;
05519                                 break;
05520                           case 2:
05521                                 mesh = &mUpperBodyMesh2;
05522                                 break;
05523                           case 3:
05524                                 mesh = &mUpperBodyMesh3;
05525                                 break;
05526                           case 4:
05527                                 mesh = &mUpperBodyMesh4;
05528                                 break;
05529                           default:
05530                                 llwarns << "Avatar file: <mesh> has invalid lod setting " << lod << llendl;
05531                                 return FALSE;
05532                         }
05533                 }
05534                 else if (type == "lowerBodyMesh")
05535                 {
05536                         switch (lod)
05537                         {
05538                           case 0:
05539                                 mesh = &mLowerBodyMesh0;
05540                                 break;
05541                           case 1:
05542                                 mesh = &mLowerBodyMesh1;
05543                                 break;
05544                           case 2:
05545                                 mesh = &mLowerBodyMesh2;
05546                                 break;
05547                           case 3:
05548                                 mesh = &mLowerBodyMesh3;
05549                                 break;
05550                           case 4:
05551                                 mesh = &mLowerBodyMesh4;
05552                                 break;
05553                           default:
05554                                 llwarns << "Avatar file: <mesh> has invalid lod setting " << lod << llendl;
05555                                 return FALSE;
05556                         }
05557                 }       
05558                 else if (type == "skirtMesh")
05559                 {
05560                         switch (lod)
05561                         {
05562                           case 0:
05563                                 mesh = &mSkirtMesh0;
05564                                 break;
05565                           case 1:
05566                                 mesh = &mSkirtMesh1;
05567                                 break;
05568                           case 2:
05569                                 mesh = &mSkirtMesh2;
05570                                 break;
05571                           case 3:
05572                                 mesh = &mSkirtMesh3;
05573                                 break;
05574                           case 4:
05575                                 mesh = &mSkirtMesh4;
05576                                 break;
05577                           default:
05578                                 llwarns << "Avatar file: <mesh> has invalid lod setting " << lod << llendl;
05579                                 return FALSE;
05580                         }
05581                 }
05582                 else if (type == "eyelashMesh")
05583                 {
05584                         mesh = &mEyeLashMesh0;
05585                 }
05586                 else if (type == "eyeBallLeftMesh")
05587                 {
05588                         switch (lod)
05589                         {
05590                           case 0:
05591                                 mesh = &mEyeBallLeftMesh0;
05592                                 break;
05593                           case 1:
05594                                 mesh = &mEyeBallLeftMesh1;
05595                                 break;
05596                           default:
05597                                 llwarns << "Avatar file: <mesh> has invalid lod setting " << lod << llendl;
05598                                 return FALSE;
05599                         }
05600                 }
05601                 else if (type == "eyeBallRightMesh")
05602                 {
05603                         switch (lod)
05604                         {
05605                           case 0:
05606                                 mesh = &mEyeBallRightMesh0;
05607                                 break;
05608                           case 1:
05609                                 mesh = &mEyeBallRightMesh1;
05610                                 break;
05611                           default:
05612                                 llwarns << "Avatar file: <mesh> has invalid lod setting " << lod << llendl;
05613                                 return FALSE;
05614                         }
05615                 }
05616 
05617                 if( !mesh )
05618                 {
05619                         llwarns << "Ignoring unrecognized mesh type: " << type << llendl;
05620                         return FALSE;
05621                 }
05622 
05623                 //      llinfos << "Parsing mesh data for " << type << "..." << llendl;
05624 
05625                 mesh->setColor( 0.8f, 0.8f, 0.8f, 1.0f );
05626 
05627                 LLPolyMesh *poly_mesh = NULL;
05628 
05629                 if (!info->mReferenceMeshName.empty())
05630                 {
05631                         mesh_map_t::iterator iter = mMeshes.find(info->mReferenceMeshName);
05632                         if (iter != mMeshes.end())
05633                         {
05634                                 poly_mesh = LLPolyMesh::getMesh(info->mMeshFileName, iter->second);
05635                                 poly_mesh->setAvatar(this);
05636                         }
05637                         else
05638                         {
05639                                 // This should never happen
05640                         }
05641                 }
05642                 else
05643                 {
05644                         poly_mesh = LLPolyMesh::getMesh(info->mMeshFileName);
05645                         poly_mesh->setAvatar(this);
05646                 }
05647 
05648                 if( !poly_mesh )
05649                 {
05650                         llwarns << "Failed to load mesh of type " << type << llendl;
05651                         return FALSE;
05652                 }
05653 
05654                 // Multimap insert
05655                 mMeshes.insert(std::pair<LLString, LLPolyMesh*>(info->mMeshFileName, poly_mesh));
05656         
05657                 mesh->setMesh( poly_mesh );
05658 
05659                 mesh->setLOD( info->mMinPixelArea );
05660 
05661                 LLVOAvatarInfo::LLVOAvatarMeshInfo::morph_info_list_t::iterator iter;
05662                 for (iter = info->mPolyMorphTargetInfoList.begin();
05663                          iter != info->mPolyMorphTargetInfoList.end(); iter++)
05664                 {
05665                         LLVOAvatarInfo::LLVOAvatarMeshInfo::morph_info_pair_t *info_pair = &(*iter);
05666                         LLPolyMorphTarget *param = new LLPolyMorphTarget(mesh->getMesh());
05667                         if (!param->setInfo(info_pair->first))
05668                         {
05669                                 delete param;
05670                                 return FALSE;
05671                         }
05672                         else
05673                         {
05674                                 if (info_pair->second)
05675                                 {
05676                                         addSharedVisualParam(param);
05677                                 }
05678                                 else
05679                                 {
05680                                         addVisualParam(param);
05681                                 }
05682                         }                               
05683                 }
05684         }
05685 
05686         return TRUE;
05687 }
05688 
05689 //-----------------------------------------------------------------------------
05690 // updateVisualParams()
05691 //-----------------------------------------------------------------------------
05692 void LLVOAvatar::updateVisualParams()
05693 {
05694         if (gNoRender)
05695         {
05696                 return;
05697         }
05698 
05699         setSex( (getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE );
05700 
05701         LLCharacter::updateVisualParams();
05702 
05703         if (mLastSkeletonSerialNum != mSkeletonSerialNum)
05704         {
05705                 computeBodySize();
05706                 mLastSkeletonSerialNum = mSkeletonSerialNum;
05707                 mRoot.updateWorldMatrixChildren();
05708         }
05709 
05710         dirtyMesh();
05711         updateHeadOffset();
05712 }
05713 
05714 //-----------------------------------------------------------------------------
05715 // isActive()
05716 //-----------------------------------------------------------------------------
05717 BOOL LLVOAvatar::isActive() const
05718 {
05719         return TRUE;
05720 }
05721 
05722 //-----------------------------------------------------------------------------
05723 // setPixelAreaAndAngle()
05724 //-----------------------------------------------------------------------------
05725 void LLVOAvatar::setPixelAreaAndAngle(LLAgent &agent)
05726 {
05727         LLMemType mt(LLMemType::MTYPE_AVATAR);
05728 
05729         const LLVector3* ext = mDrawable->getSpatialExtents();
05730         LLVector3 center = (ext[1] + ext[0]) * 0.5f;
05731         LLVector3 size = (ext[1]-ext[0])*0.5f;
05732 
05733         mPixelArea = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance());
05734 
05735         F32 range = mDrawable->mDistanceWRTCamera;
05736 
05737         if (range < 0.001f)             // range == zero
05738         {
05739                 mAppAngle = 180.f;
05740         }
05741         else
05742         {
05743                 F32 radius = size.magVec();
05744                 mAppAngle = (F32) atan2( radius, range) * RAD_TO_DEG;
05745         }
05746 
05747         // We always want to look good to ourselves
05748         if( mIsSelf )
05749         {
05750                 mPixelArea = llmax( mPixelArea, F32(LOCTEX_IMAGE_SIZE_SELF / 16) );
05751         }
05752 }
05753 
05754 //-----------------------------------------------------------------------------
05755 // updateJointLODs()
05756 //-----------------------------------------------------------------------------
05757 BOOL LLVOAvatar::updateJointLODs()
05758 {
05759         F32 lod_factor = (sLODFactor * AVATAR_LOD_TWEAK_RANGE + (1.f - AVATAR_LOD_TWEAK_RANGE));
05760         F32 avatar_num_min_factor = clamp_rescale(sLODFactor, 0.f, 1.f, 0.25f, 0.6f);
05761         F32 avatar_num_factor = clamp_rescale((F32)sNumVisibleAvatars, 8, 25, 1.f, avatar_num_min_factor);
05762         F32 area_scale = 0.16f;
05763 
05764         {
05765                 if (mIsSelf)
05766                 {
05767                         if(gAgent.cameraCustomizeAvatar() || gAgent.cameraMouselook())
05768                         {
05769                                 mAdjustedPixelArea = 1000000;
05770                         }
05771                         else
05772                         {
05773                                 mAdjustedPixelArea = mPixelArea*area_scale;
05774                         }
05775                 }
05776                 else if (mIsDummy)
05777                 {
05778                         mAdjustedPixelArea = 1000000;
05779                 }
05780                 else
05781                 {
05782                         // reported avatar pixel area is dependent on avatar render load, based on number of visible avatars
05783                         mAdjustedPixelArea = (F32)mPixelArea * area_scale * lod_factor * lod_factor * avatar_num_factor * avatar_num_factor;
05784                 }
05785 
05786                 // now select meshes to render based on adjusted pixel area
05787                 BOOL res = mRoot.updateLOD(mAdjustedPixelArea, TRUE);
05788                 if (res)
05789                 {
05790                         sNumLODChangesThisFrame++;
05791                         dirtyMesh();
05792                         return TRUE;
05793                 }
05794         }
05795 
05796         return FALSE;
05797 }
05798 
05799 //-----------------------------------------------------------------------------
05800 // createDrawable()
05801 //-----------------------------------------------------------------------------
05802 LLDrawable *LLVOAvatar::createDrawable(LLPipeline *pipeline)
05803 {
05804         pipeline->allocDrawable(this);
05805         mDrawable->setLit(FALSE);
05806 
05807         LLDrawPoolAvatar *poolp = (LLDrawPoolAvatar*) gPipeline.getPool(LLDrawPool::POOL_AVATAR);
05808 
05809         // Only a single face (one per avatar)
05810         mDrawable->setState(LLDrawable::ACTIVE);
05811         mDrawable->addFace(poolp, NULL);
05812         mDrawable->setRenderType(LLPipeline::RENDER_TYPE_AVATAR);
05813         
05814         LLFace *facep;
05815 
05816         // Add faces for the foot shadows
05817         facep = mDrawable->addFace((LLFacePool*) NULL, mShadowImagep);
05818         mShadow0Facep = facep;
05819 
05820         facep = mDrawable->addFace((LLFacePool*) NULL, mShadowImagep);
05821         mShadow1Facep = facep;
05822 
05823         dirtyMesh();
05824         return mDrawable;
05825 }
05826 
05827 
05828 //-----------------------------------------------------------------------------
05829 // updateGeometry()
05830 //-----------------------------------------------------------------------------
05831 BOOL LLVOAvatar::updateGeometry(LLDrawable *drawable)
05832 {
05833         LLFastTimer ftm(LLFastTimer::FTM_UPDATE_AVATAR);
05834         if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR)))
05835         {
05836                 return TRUE;
05837         }
05838         
05839         if (!mMeshValid)
05840         {
05841                 return TRUE;
05842         }
05843 
05844         if (!drawable)
05845         {
05846                 llerrs << "LLVOAvatar::updateGeometry() called with NULL drawable" << llendl;
05847         }
05848 
05849         return TRUE;
05850 }
05851 
05852 //-----------------------------------------------------------------------------
05853 // updateShadowFaces()
05854 //-----------------------------------------------------------------------------
05855 void LLVOAvatar::updateShadowFaces()
05856 {
05857         LLFace *face0p = mShadow0Facep;
05858         LLFace *face1p = mShadow1Facep;
05859 
05860         //
05861         // render avatar shadows
05862         //
05863         if (mInAir || mUpdatePeriod >= VOAVATAR_IMPOSTOR_PERIOD)
05864         {
05865                 face0p->setSize(0, 0);
05866                 face1p->setSize(0, 0);
05867                 return;
05868         }
05869 
05870         LLSprite sprite(mShadowImagep.notNull() ? mShadowImagep->getID() : LLUUID::null);
05871         sprite.setFollow(FALSE);
05872         const F32 cos_angle = gSky.getSunDirection().mV[2];
05873         F32 cos_elev = sqrt(1 - cos_angle * cos_angle);
05874         if (cos_angle < 0) cos_elev = -cos_elev;
05875         sprite.setSize(0.4f + cos_elev * 0.8f, 0.3f);
05876         LLVector3 sun_vec = gSky.mVOSkyp ? gSky.mVOSkyp->getToSun() : LLVector3(0.f, 0.f, 0.f);
05877 
05878         if (mShadowImagep->getHasGLTexture())
05879         {
05880                 LLVector3 normal;
05881                 LLVector3d shadow_pos;
05882                 LLVector3 shadow_pos_agent;
05883                 F32 foot_height;
05884 
05885                 if (mFootLeftp)
05886                 {
05887                         LLVector3 joint_world_pos = mFootLeftp->getWorldPosition();
05888                         // this only does a ray straight down from the foot, as our client-side ray-tracing is very limited now
05889                         // but we make an explicit ray trace call in expectation of future improvements
05890                         resolveRayCollisionAgent(gAgent.getPosGlobalFromAgent(joint_world_pos), 
05891                                 gAgent.getPosGlobalFromAgent(gSky.getSunDirection() + joint_world_pos), shadow_pos, normal);
05892                         shadow_pos_agent = gAgent.getPosAgentFromGlobal(shadow_pos);
05893                         foot_height = joint_world_pos.mV[VZ] - shadow_pos_agent.mV[VZ];
05894 
05895                         // Pull sprite in direction of surface normal
05896                         shadow_pos_agent += normal * SHADOW_OFFSET_AMT;
05897 
05898                         // Render sprite
05899                         sprite.setNormal(normal);
05900                         if (mIsSelf && gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
05901                         {
05902                                 sprite.setColor(0.f, 0.f, 0.f, 0.f);
05903                         }
05904                         else
05905                         {
05906                                 sprite.setColor(0.f, 0.f, 0.f, clamp_rescale(foot_height, MIN_SHADOW_HEIGHT, MAX_SHADOW_HEIGHT, 0.5f, 0.f));
05907                         }
05908                         sprite.setPosition(shadow_pos_agent);
05909 
05910                         LLVector3 foot_to_knee = mKneeLeftp->getWorldPosition() - joint_world_pos;
05911                         //foot_to_knee.normVec();
05912                         foot_to_knee -= projected_vec(foot_to_knee, sun_vec);
05913                         sprite.setYaw(azimuth(sun_vec - foot_to_knee));
05914                 
05915                         sprite.updateFace(*face0p);
05916                 }
05917 
05918                 if (mFootRightp)
05919                 {
05920                         LLVector3 joint_world_pos = mFootRightp->getWorldPosition();
05921                         // this only does a ray straight down from the foot, as our client-side ray-tracing is very limited now
05922                         // but we make an explicit ray trace call in expectation of future improvements
05923                         resolveRayCollisionAgent(gAgent.getPosGlobalFromAgent(joint_world_pos), 
05924                                 gAgent.getPosGlobalFromAgent(gSky.getSunDirection() + joint_world_pos), shadow_pos, normal);
05925                         shadow_pos_agent = gAgent.getPosAgentFromGlobal(shadow_pos);
05926                         foot_height = joint_world_pos.mV[VZ] - shadow_pos_agent.mV[VZ];
05927 
05928                         // Pull sprite in direction of surface normal
05929                         shadow_pos_agent += normal * SHADOW_OFFSET_AMT;
05930 
05931                         // Render sprite
05932                         sprite.setNormal(normal);
05933                         if (mIsSelf && gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
05934                         {
05935                                 sprite.setColor(0.f, 0.f, 0.f, 0.f);
05936                         }
05937                         else
05938                         {
05939                                 sprite.setColor(0.f, 0.f, 0.f, clamp_rescale(foot_height, MIN_SHADOW_HEIGHT, MAX_SHADOW_HEIGHT, 0.5f, 0.f));
05940                         }
05941                         sprite.setPosition(shadow_pos_agent);
05942 
05943                         LLVector3 foot_to_knee = mKneeRightp->getWorldPosition() - joint_world_pos;
05944                         //foot_to_knee.normVec();
05945                         foot_to_knee -= projected_vec(foot_to_knee, sun_vec);
05946                         sprite.setYaw(azimuth(sun_vec - foot_to_knee));
05947         
05948                         sprite.updateFace(*face1p);
05949                 }
05950         }
05951 }
05952 
05953 //-----------------------------------------------------------------------------
05954 // updateSexDependentLayerSets()
05955 //-----------------------------------------------------------------------------
05956 void LLVOAvatar::updateSexDependentLayerSets( BOOL set_by_user )
05957 {
05958         invalidateComposite( mHeadLayerSet,                     set_by_user );
05959         invalidateComposite( mLowerBodyLayerSet,        set_by_user );
05960         invalidateComposite( mUpperBodyLayerSet,        set_by_user );
05961         updateMeshTextures();
05962 }
05963 
05964 //-----------------------------------------------------------------------------
05965 // dirtyMesh()
05966 //-----------------------------------------------------------------------------
05967 void LLVOAvatar::dirtyMesh()
05968 {
05969         mDirtyMesh = TRUE;
05970 }
05971 
05972 //-----------------------------------------------------------------------------
05973 // requestLayerSetUpdate()
05974 //-----------------------------------------------------------------------------
05975 void LLVOAvatar::requestLayerSetUpdate( LLVOAvatar::ELocTexIndex i )
05976 {
05977         switch( i )
05978         {
05979         case LOCTEX_HEAD_BODYPAINT:
05980                 if( mHeadLayerSet )
05981                 {
05982                         mHeadLayerSet->requestUpdate();
05983                 }
05984                 break;
05985 
05986         case LOCTEX_UPPER_BODYPAINT:  
05987         case LOCTEX_UPPER_SHIRT:
05988         case LOCTEX_UPPER_GLOVES:
05989         case LOCTEX_UPPER_UNDERSHIRT:
05990                 if( mUpperBodyLayerSet )
05991                 {
05992                         mUpperBodyLayerSet->requestUpdate();
05993                 }
05994                 break;
05995 
05996         case LOCTEX_LOWER_BODYPAINT:  
05997         case LOCTEX_LOWER_PANTS:
05998         case LOCTEX_LOWER_SHOES:
05999         case LOCTEX_LOWER_SOCKS:
06000         case LOCTEX_LOWER_UNDERPANTS:
06001                 if( mLowerBodyLayerSet )
06002                 {
06003                         mLowerBodyLayerSet->requestUpdate();
06004                 }
06005                 break;
06006 
06007         case LOCTEX_EYES_IRIS:
06008                 if( mEyesLayerSet )
06009                 {
06010                         mEyesLayerSet->requestUpdate();
06011                 }
06012                 break;
06013 
06014 
06015         case LOCTEX_SKIRT:
06016                 if( mSkirtLayerSet )
06017                 {
06018                         mSkirtLayerSet->requestUpdate();
06019                 }
06020                 break;
06021 
06022 
06023         case LOCTEX_UPPER_JACKET:
06024         case LOCTEX_LOWER_JACKET:
06025                 if( mUpperBodyLayerSet )
06026                 {
06027                         mUpperBodyLayerSet->requestUpdate();
06028                 }
06029 
06030                 if( mLowerBodyLayerSet )
06031                 {
06032                         mLowerBodyLayerSet->requestUpdate();
06033                 }
06034                 break;
06035 
06036         case LOCTEX_NUM_ENTRIES:
06037                 llerrs << "Bogus texture value " << i << llendl;
06038                 break;
06039         }
06040 
06041 }
06042 
06043 void LLVOAvatar::setParent(LLViewerObject* parent)
06044 {
06045         if (parent == NULL)
06046         {
06047                 getOffObject();
06048                 LLViewerObject::setParent(parent);
06049                 if (isSelf())
06050                 {
06051                         gAgent.resetCamera();
06052                 }
06053         }
06054         else
06055         {
06056                 LLViewerObject::setParent(parent);
06057                 sitOnObject(parent);
06058         }
06059 }
06060 
06061 void LLVOAvatar::addChild(LLViewerObject *childp)
06062 {
06063         LLViewerObject::addChild(childp);
06064         if (childp->mDrawable)
06065         {
06066                 attachObject(childp);
06067         }
06068         else
06069         {
06070                 mPendingAttachment.push_back(childp);
06071         }
06072 }
06073 
06074 void LLVOAvatar::removeChild(LLViewerObject *childp)
06075 {
06076         LLViewerObject::removeChild(childp);
06077         detachObject(childp);
06078 }
06079 
06080 LLViewerJointAttachment* LLVOAvatar::getTargetAttachmentPoint(LLViewerObject* viewer_object)
06081 {
06082         S32 attachmentID = ATTACHMENT_ID_FROM_STATE(viewer_object->getState());
06083 
06084         LLViewerJointAttachment* attachment = get_if_there(mAttachmentPoints, attachmentID, (LLViewerJointAttachment*)NULL);
06085 
06086         if (!attachment)
06087         {
06088                 llwarns << "Object attachment point invalid: " << attachmentID << llendl;
06089         }
06090 
06091         return attachment;
06092 }
06093 
06094 //-----------------------------------------------------------------------------
06095 // attachObject()
06096 //-----------------------------------------------------------------------------
06097 BOOL LLVOAvatar::attachObject(LLViewerObject *viewer_object)
06098 {
06099         LLViewerJointAttachment* attachment = getTargetAttachmentPoint(viewer_object);
06100 
06101         if (!attachment || !attachment->addObject(viewer_object))
06102         {
06103                 return FALSE;
06104         }
06105 
06106         if (viewer_object->isSelected())
06107         {
06108                 LLSelectMgr::getInstance()->updateSelectionCenter();
06109                 LLSelectMgr::getInstance()->updatePointAt();
06110         }
06111 
06112         if (mIsSelf)
06113         {
06114                 updateAttachmentVisibility(gAgent.getCameraMode());
06115                 
06116                 // Then make sure the inventory is in sync with the avatar.
06117                 gInventory.addChangedMask( LLInventoryObserver::LABEL, attachment->getItemID() );
06118                 gInventory.notifyObservers();
06119         }
06120 
06121         return TRUE;
06122 }
06123 
06124 //-----------------------------------------------------------------------------
06125 // lazyAttach()
06126 //-----------------------------------------------------------------------------
06127 void LLVOAvatar::lazyAttach()
06128 {
06129         for (U32 i = 0; i < mPendingAttachment.size(); i++)
06130         {
06131                 if (mPendingAttachment[i]->mDrawable)
06132                 {
06133                         attachObject(mPendingAttachment[i]);
06134                 }
06135         }
06136 
06137         mPendingAttachment.clear();
06138 }
06139 
06140 void LLVOAvatar::resetHUDAttachments()
06141 {
06142         for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
06143                  iter != mAttachmentPoints.end(); )
06144         {
06145                 attachment_map_t::iterator curiter = iter++;
06146                 LLViewerJointAttachment* attachment = curiter->second;
06147                 if (attachment->getIsHUDAttachment())
06148                 {
06149                         LLViewerObject* obj = attachment->getObject();
06150                         if (obj && obj->mDrawable.notNull())
06151                         {
06152                                 gPipeline.markMoved(obj->mDrawable);
06153                         }
06154                 }
06155         }
06156 }
06157 
06158 //-----------------------------------------------------------------------------
06159 // detachObject()
06160 //-----------------------------------------------------------------------------
06161 BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object)
06162 {
06163         for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
06164                  iter != mAttachmentPoints.end(); )
06165         {
06166                 attachment_map_t::iterator curiter = iter++;
06167                 LLViewerJointAttachment* attachment = curiter->second;
06168                 // only one object per attachment point for now
06169                 if (attachment->getObject() == viewer_object)
06170                 {
06171                         LLUUID item_id = attachment->getItemID();
06172                         attachment->removeObject(viewer_object);
06173                         if (mIsSelf)
06174                         {
06175                                 // the simulator should automatically handle
06176                                 // permission revocation
06177 
06178                                 stopMotionFromSource(viewer_object->getID());
06179                                 LLFollowCamMgr::setCameraActive(viewer_object->getID(), FALSE);
06180 
06181                                 for (S32 i = 0; i < (S32)viewer_object->mChildList.size(); i++)
06182                                 {
06183                                         LLViewerObject* child_objectp = viewer_object->mChildList[i];
06184                                         // the simulator should automatically handle
06185                                         // permissions revocation
06186 
06187                                         stopMotionFromSource(child_objectp->getID());
06188                                         LLFollowCamMgr::setCameraActive(child_objectp->getID(), FALSE);
06189                                 }
06190 
06191                         }
06192                         lldebugs << "Detaching object " << viewer_object->mID << " from " << attachment->getName() << llendl;
06193                         if (mIsSelf)
06194                         {
06195                                 // Then make sure the inventory is in sync with the avatar.
06196                                 gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
06197                                 gInventory.notifyObservers();
06198                         }
06199                         return TRUE;
06200                 }
06201         }
06202 
06203         
06204         return FALSE;
06205 }
06206 
06207 //-----------------------------------------------------------------------------
06208 // sitOnObject()
06209 //-----------------------------------------------------------------------------
06210 void LLVOAvatar::sitOnObject(LLViewerObject *sit_object)
06211 {
06212         if (mDrawable.isNull())
06213         {
06214                 return;
06215         }
06216         LLQuaternion inv_obj_rot = ~sit_object->getRenderRotation();
06217         LLVector3 obj_pos = sit_object->getRenderPosition();
06218 
06219         LLVector3 rel_pos = getRenderPosition() - obj_pos;
06220         rel_pos.rotVec(inv_obj_rot);
06221 
06222         mDrawable->mXform.setPosition(rel_pos);
06223         mDrawable->mXform.setRotation(mDrawable->getWorldRotation() * inv_obj_rot);
06224 
06225         gPipeline.markMoved(mDrawable, TRUE);
06226         mIsSitting = TRUE;
06227         mRoot.getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject
06228         mRoot.setPosition(getPosition());
06229         mRoot.updateWorldMatrixChildren();
06230 
06231         stopMotion(ANIM_AGENT_BODY_NOISE);
06232 
06233         if (mIsSelf)
06234         {
06235                 // Might be first sit
06236                 LLFirstUse::useSit();
06237 
06238                 gAgent.setFlying(FALSE);
06239                 gAgent.setThirdPersonHeadOffset(LLVector3::zero);
06240                 //interpolate to new camera position
06241                 gAgent.startCameraAnimation();
06242                 // make sure we are not trying to autopilot
06243                 gAgent.stopAutoPilot();
06244                 gAgent.setupSitCamera();
06245                 if (gAgent.mForceMouselook) gAgent.changeCameraToMouselook();
06246         }
06247 }
06248 
06249 //-----------------------------------------------------------------------------
06250 // getOffObject()
06251 //-----------------------------------------------------------------------------
06252 void LLVOAvatar::getOffObject()
06253 {
06254         if (mDrawable.isNull())
06255         {
06256                 return;
06257         }
06258         
06259         LLViewerObject* sit_object = (LLViewerObject*)getParent();
06260 
06261         if (sit_object) 
06262         {
06263                 stopMotionFromSource(sit_object->getID());
06264                 LLFollowCamMgr::setCameraActive(sit_object->getID(), FALSE);
06265 
06266                 for (S32 i = 0; i < (S32)sit_object->mChildList.size(); i++)
06267                 {
06268                         LLViewerObject* child_objectp = sit_object->mChildList[i];
06269 
06270                         stopMotionFromSource(child_objectp->getID());
06271                         LLFollowCamMgr::setCameraActive(child_objectp->getID(), FALSE);
06272                 }
06273         }
06274 
06275         // assumes that transform will not be updated with drawable still having a parent
06276         LLVector3 cur_position_world = mDrawable->getWorldPosition();
06277         LLQuaternion cur_rotation_world = mDrawable->getWorldRotation();
06278 
06279         // set *local* position based on last *world* position, since we're unparenting the avatar
06280         mDrawable->mXform.setPosition(cur_position_world);
06281         mDrawable->mXform.setRotation(cur_rotation_world);
06282 
06283         gPipeline.markMoved(mDrawable, TRUE);
06284 
06285         mIsSitting = FALSE;
06286         mRoot.getXform()->setParent(NULL); // LLVOAvatar::getOffObject
06287         mRoot.setPosition(cur_position_world);
06288         mRoot.setRotation(cur_rotation_world);
06289         mRoot.getXform()->update();
06290 
06291         startMotion(ANIM_AGENT_BODY_NOISE);
06292 
06293         if (mIsSelf)
06294         {
06295                 LLQuaternion av_rot = gAgent.getFrameAgent().getQuaternion();
06296                 LLQuaternion obj_rot = sit_object ? sit_object->getRenderRotation() : LLQuaternion::DEFAULT;
06297                 av_rot = av_rot * obj_rot;
06298                 LLVector3 at_axis = LLVector3::x_axis;
06299                 at_axis = at_axis * av_rot;
06300                 at_axis.mV[VZ] = 0.f;
06301                 at_axis.normVec();
06302                 gAgent.resetAxes(at_axis);
06303 
06304                 //reset orientation
06305 //              mRoot.setRotation(avWorldRot);
06306                 gAgent.setThirdPersonHeadOffset(LLVector3(0.f, 0.f, 1.f));
06307 
06308                 gAgent.setSitCamera(LLUUID::null);
06309         }
06310 }
06311 
06312 //-----------------------------------------------------------------------------
06313 // findAvatarFromAttachment()
06314 //-----------------------------------------------------------------------------
06315 // static 
06316 LLVOAvatar* LLVOAvatar::findAvatarFromAttachment( LLViewerObject* obj )
06317 {
06318         if( obj->isAttachment() )
06319         {
06320                 do
06321                 {
06322                         obj = (LLViewerObject*) obj->getParent();
06323                 }
06324                 while( obj && !obj->isAvatar() );
06325 
06326                 if( obj && !obj->isDead() )
06327                 {
06328                         return (LLVOAvatar*)obj;
06329                 }
06330         }
06331         return NULL;
06332 }
06333 
06334 //-----------------------------------------------------------------------------
06335 // isWearingAttachment()
06336 //-----------------------------------------------------------------------------
06337 BOOL LLVOAvatar::isWearingAttachment( const LLUUID& inv_item_id )
06338 {
06339         for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
06340                  iter != mAttachmentPoints.end(); )
06341         {
06342                 attachment_map_t::iterator curiter = iter++;
06343                 LLViewerJointAttachment* attachment = curiter->second;
06344                 if( attachment->getItemID() == inv_item_id )
06345                 {
06346                         return TRUE;
06347                 }
06348         }
06349         return FALSE;
06350 }
06351 
06352 //-----------------------------------------------------------------------------
06353 // getWornAttachment()
06354 //-----------------------------------------------------------------------------
06355 LLViewerObject* LLVOAvatar::getWornAttachment( const LLUUID& inv_item_id )
06356 {
06357         for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
06358                  iter != mAttachmentPoints.end(); )
06359         {
06360                 attachment_map_t::iterator curiter = iter++;
06361                 LLViewerJointAttachment* attachment = curiter->second;
06362                 if( attachment->getItemID() == inv_item_id )
06363                 {
06364                         return attachment->getObject();
06365                 }
06366         }
06367         return NULL;
06368 }
06369 
06370 const LLString LLVOAvatar::getAttachedPointName(const LLUUID& inv_item_id)
06371 {
06372         for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
06373                  iter != mAttachmentPoints.end(); )
06374         {
06375                 attachment_map_t::iterator curiter = iter++;
06376                 LLViewerJointAttachment* attachment = curiter->second;
06377                 if( attachment->getItemID() == inv_item_id )
06378                 {
06379                         return (LLString)attachment->getName();
06380                 }
06381         }
06382 
06383         return LLString::null;
06384 }
06385 
06386 
06387 //-----------------------------------------------------------------------------
06388 // static 
06389 // onLocalTextureLoaded()
06390 //-----------------------------------------------------------------------------
06391 void LLVOAvatar::onLocalTextureLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src_raw, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata )
06392 {
06393         //llinfos << "onLocalTextureLoaded: " << src_vi->getID() << llendl;
06394 
06395         const LLUUID& src_id = src_vi->getID();
06396         LLAvatarTexData *data = (LLAvatarTexData *)userdata;
06397         if (success)
06398         {
06399                 LLVOAvatar *self = (LLVOAvatar *)gObjectList.findObject(data->mAvatarID);
06400                 LLVOAvatar::ELocTexIndex idx = data->mIndex;
06401                 if( self &&
06402                         (!self->mLocalTextureBaked[ idx ]) &&
06403                         (self->mLocalTexture[ idx ].notNull()) &&
06404                         (self->mLocalTexture[ idx ]->getID() == src_id) &&
06405                         (discard_level < self->mLocalTextureDiscard[idx]))
06406                 {
06407                         self->mLocalTextureDiscard[idx] = discard_level;
06408                         self->requestLayerSetUpdate( idx );
06409                         if( self->mIsSelf && gAgent.cameraCustomizeAvatar() )
06410                         {
06411                                 LLVisualParamHint::requestHintUpdates();
06412                         }
06413                         self->updateMeshTextures();
06414                 }
06415         }
06416         else if (final)
06417         {
06418                 LLVOAvatar *self = (LLVOAvatar *)gObjectList.findObject(data->mAvatarID);
06419                 LLVOAvatar::ELocTexIndex idx = data->mIndex;
06420                 // Failed: asset is missing
06421                 if( self &&
06422                         (!self->mLocalTextureBaked[ idx ]) &&
06423                         (self->mLocalTexture[ idx ].notNull()) &&
06424                         (self->mLocalTexture[ idx ]->getID() == src_id))
06425                 {
06426                         self->mLocalTextureDiscard[idx] = 0; // we check that it's missing later
06427                         self->requestLayerSetUpdate( idx );
06428                         self->updateMeshTextures();
06429                 }
06430                 
06431         }
06432 
06433         if( final || !success )
06434         {
06435                 delete data;
06436         }
06437 }
06438 
06439 void LLVOAvatar::updateComposites()
06440 {
06441         if( mHeadLayerSet )
06442         {
06443                 mHeadLayerSet->updateComposite();
06444         }
06445 
06446         if( mUpperBodyLayerSet )
06447         {
06448                 mUpperBodyLayerSet->updateComposite();
06449         }
06450 
06451         if( mLowerBodyLayerSet )
06452         {
06453                 mLowerBodyLayerSet->updateComposite();
06454         }
06455 
06456         if( mEyesLayerSet )
06457         {
06458                 mEyesLayerSet->updateComposite();
06459         }
06460 
06461         if( mSkirtLayerSet && isWearingWearableType( WT_SKIRT ))
06462         {
06463                 mSkirtLayerSet->updateComposite();
06464         }
06465 }
06466 
06467 LLColor4 LLVOAvatar::getGlobalColor( const LLString& color_name )
06468 {
06469         if( color_name=="skin_color" && mTexSkinColor )
06470         {
06471                 return mTexSkinColor->getColor();
06472         }
06473         else
06474         if( color_name=="hair_color" && mTexHairColor )
06475         {
06476                 return mTexHairColor->getColor();
06477         }
06478         if( color_name=="eye_color" && mTexEyeColor )
06479         {
06480                 return mTexEyeColor->getColor();
06481         }
06482         else
06483         {
06484 //              return LLColor4( .5f, .5f, .5f, .5f );
06485                 return LLColor4( 0.f, 1.f, 1.f, 1.f ); // good debugging color
06486         }
06487 }
06488 
06489 
06490 void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL set_by_user )
06491 {
06492         if( !layerset || !layerset->getUpdatesEnabled() )
06493         {
06494                 return;
06495         }
06496 
06497         /* Debug spam. JC
06498         const char* layer_name = "";
06499         if (layerset == mHeadLayerSet)
06500         {
06501                 layer_name = "head";
06502         }
06503         else if (layerset == mUpperBodyLayerSet)
06504         {
06505                 layer_name = "upperbody";
06506         }
06507         else if (layerset == mLowerBodyLayerSet)
06508         {
06509                 layer_name = "lowerbody";
06510         }
06511         else if (layerset == mEyesLayerSet)
06512         {
06513                 layer_name = "eyes";
06514         }
06515         else if (layerset == mSkirtLayerSet)
06516         {
06517                 layer_name = "skirt";
06518         }
06519         else
06520         {
06521                 layer_name = "unknown";
06522         }
06523         llinfos << "LLVOAvatar::invalidComposite() " << layer_name << llendl;
06524         */
06525 
06526         layerset->requestUpdate();
06527 
06528         if( set_by_user )
06529         {
06530                 llassert( mIsSelf );
06531 
06532                 ETextureIndex baked_te = getBakedTE( layerset );
06533                 if( gAgent.cameraCustomizeAvatar() )
06534                 {
06535                         mSavedTE[ baked_te ].setNull();  
06536                 }
06537                 else
06538                 {
06539                         setTEImage( baked_te, gImageList.getImage(IMG_DEFAULT_AVATAR) );
06540                         layerset->requestUpload();
06541                 }
06542         }
06543 }
06544 
06545 
06546 void LLVOAvatar::onGlobalColorChanged( LLTexGlobalColor* global_color, BOOL set_by_user )
06547 {
06548         if( global_color == mTexSkinColor )
06549         {
06550 //              llinfos << "invalidateComposite cause: onGlobalColorChanged( skin color )" << llendl; 
06551                 invalidateComposite( mHeadLayerSet,                     set_by_user );
06552                 invalidateComposite( mUpperBodyLayerSet,        set_by_user );
06553                 invalidateComposite( mLowerBodyLayerSet,        set_by_user );
06554         }
06555         else
06556         if( global_color == mTexHairColor )
06557         {
06558 //              llinfos << "invalidateComposite cause: onGlobalColorChanged( hair color )" << llendl; 
06559                 invalidateComposite( mHeadLayerSet, set_by_user );
06560 
06561                 LLColor4 color = mTexHairColor->getColor();
06562                 mHairMesh0.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
06563                 mHairMesh1.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
06564                 mHairMesh2.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
06565                 mHairMesh3.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
06566                 mHairMesh4.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
06567                 mHairMesh5.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
06568         }
06569         else
06570         if( global_color == mTexEyeColor )
06571         {
06572 //              llinfos << "invalidateComposite cause: onGlobalColorChanged( eyecolor )" << llendl; 
06573                 invalidateComposite( mEyesLayerSet, set_by_user );
06574         }
06575         updateMeshTextures();
06576 }
06577 
06578 void LLVOAvatar::forceBakeAllTextures(bool slam_for_debug)
06579 {
06580         llinfos << "TAT: forced full rebake. " << llendl;
06581 
06582         for (S32 i = 0; i < BAKED_TEXTURE_COUNT; i++)
06583         {
06584                 ETextureIndex baked_index = sBakedTextureIndices[i];
06585                 LLTexLayerSet* layer_set = getLayerSet(baked_index);
06586                 if (layer_set)
06587                 {
06588                         if (slam_for_debug)
06589                         {
06590                                 layer_set->setUpdatesEnabled(TRUE);
06591                                 layer_set->cancelUpload();
06592                         }
06593 
06594                         BOOL set_by_user = TRUE;
06595                         invalidateComposite(layer_set, set_by_user);
06596                         LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_REBAKES);
06597                 }
06598                 else
06599                 {
06600                         llwarns << "TAT: NO LAYER SET FOR " << (S32)baked_index << llendl;
06601                 }
06602         }
06603 
06604         // Don't know if this is needed
06605         updateMeshTextures();
06606 }
06607 
06608 
06609 // static
06610 void LLVOAvatar::processRebakeAvatarTextures(LLMessageSystem* msg, void**)
06611 {
06612         LLUUID texture_id;
06613         msg->getUUID("TextureData", "TextureID", texture_id);
06614 
06615         LLVOAvatar* self = gAgent.getAvatarObject();
06616         if (!self) return;
06617 
06618         // If this is a texture corresponding to one of our baked entries, 
06619         // just rebake that layer set.
06620         BOOL found = FALSE;
06621         for (S32 i = 0; i < BAKED_TEXTURE_COUNT; i++)
06622         {
06623                 ETextureIndex baked_index = sBakedTextureIndices[i];
06624                 if (texture_id == self->getTEImage(baked_index)->getID())
06625                 {
06626                         LLTexLayerSet* layer_set = self->getLayerSet(baked_index);
06627                         if (layer_set)
06628                         {
06629                                 llinfos << "TAT: rebake - matched entry " << (S32)baked_index << llendl;
06630                                 // Apparently set_by_user == force upload
06631                                 BOOL set_by_user = TRUE;
06632                                 self->invalidateComposite(layer_set, set_by_user);
06633                                 found = TRUE;
06634                                 LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_REBAKES);
06635                         }
06636                 }
06637         }
06638 
06639         // If texture not found, rebake all entries.
06640         if (!found)
06641         {
06642                 self->forceBakeAllTextures();
06643         }
06644         else
06645         {
06646                 // Not sure if this is necessary, but forceBakeAllTextures() does it.
06647                 self->updateMeshTextures();
06648         }
06649 }
06650 
06651 
06652 BOOL LLVOAvatar::getLocalTextureRaw(S32 index, LLImageRaw* image_raw)
06653 {
06654     BOOL success = FALSE;
06655 
06656         if( (0 <= index) && (index < LOCTEX_NUM_ENTRIES) )
06657         {
06658                 if (mLocalTexture[ index ].isNull() || mLocalTexture[ index ]->getID() == IMG_DEFAULT_AVATAR )
06659                 {
06660                         success = TRUE;
06661                 }
06662                 else
06663                 {
06664                         if( mLocalTexture[ index ]->readBackRaw(-1, image_raw, false) )
06665                         {
06666                                 success = TRUE;
06667                         }
06668                         else
06669                         {
06670                                 // No data loaded yet
06671                                 setLocalTexture( (ELocTexIndex)index, getTEImage( index ), FALSE );
06672                         }
06673                 }
06674         }
06675         return success;
06676 }
06677 
06678 BOOL LLVOAvatar::getLocalTextureGL(S32 index, LLImageGL** image_gl_pp)
06679 {
06680         BOOL success = FALSE;
06681         *image_gl_pp = NULL;
06682 
06683         if( (0 <= index) && (index < LOCTEX_NUM_ENTRIES) )
06684         {
06685                 if( mLocalTexture[ index ].isNull() || mLocalTexture[ index ]->getID() == IMG_DEFAULT_AVATAR)
06686                 {
06687                         success = TRUE;
06688                 }
06689                 else
06690                 {
06691                         *image_gl_pp = mLocalTexture[ index ];
06692                         success = TRUE;
06693                 }
06694         }
06695 
06696         if( !success )
06697         {
06698 //              llinfos << "getLocalTextureGL(" << index << ") had no data" << llendl;
06699         }
06700         return success;
06701 }
06702 
06703 const LLUUID& LLVOAvatar::getLocalTextureID( S32 index )
06704 {
06705         if (index >= 0 && mLocalTexture[index].notNull())
06706         {
06707                 return mLocalTexture[index]->getID();
06708         }
06709         else
06710         {
06711                 return IMG_DEFAULT_AVATAR;
06712         }
06713 }
06714 
06715 // static
06716 void LLVOAvatar::dumpTotalLocalTextureByteCount()
06717 {
06718         S32 total_gl_bytes = 0;
06719         for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
06720                 iter != LLCharacter::sInstances.end(); ++iter)
06721         {
06722                 LLVOAvatar* cur = (LLVOAvatar*) *iter;
06723                 S32 gl_bytes = 0;
06724                 cur->getLocalTextureByteCount(&gl_bytes );
06725                 total_gl_bytes += gl_bytes;
06726         }
06727         llinfos << "Total Avatar LocTex GL:" << (total_gl_bytes/1024) << "KB" << llendl;
06728 }
06729 
06730 BOOL LLVOAvatar::isVisible()
06731 {
06732         return mDrawable.notNull() && mDrawable->isVisible(); 
06733 }
06734 
06735 
06736 // call periodically to keep isFullyLoaded up to date.
06737 // returns true if the value has changed.
06738 BOOL LLVOAvatar::updateIsFullyLoaded()
06739 {
06740     // a "heuristic" to determine if we have enough avatar data to render
06741     // (to avoid rendering a "Ruth" - DEV-3168)
06742 
06743         BOOL loading = FALSE;
06744 
06745         // do we have a shape?
06746         if (visualParamWeightsAreDefault())
06747         {
06748                 loading = TRUE;
06749         }
06750 
06751         // are our texture settings still default?
06752         if ((getTEImage( TEX_HAIR )->getID() == IMG_DEFAULT))
06753         {
06754                 loading = TRUE;
06755         }
06756         
06757         // special case to keep nudity off orientation island -
06758         // this is fragilely dependent on the compositing system,
06759         // which gets available textures in the following order:
06760         //
06761         // 1) use the baked texture
06762         // 2) use the layerset
06763         // 3) use the previously baked texture
06764         //
06765         // on orientation island case (3) can show naked skin.
06766         // so we test for that here:
06767         //
06768         // if we were previously unloaded, and we don't have enough
06769         // texture info for our shirt/pants, stay unloaded:
06770         if (!mPreviousFullyLoaded)
06771         {
06772                 if ((!isLocalTextureDataAvailable(mLowerBodyLayerSet)) &&
06773                         (getTEImage(TEX_LOWER_BAKED)->getID() == IMG_DEFAULT_AVATAR))
06774                 {
06775                         loading = TRUE;
06776                 }
06777 
06778                 if ((!isLocalTextureDataAvailable(mUpperBodyLayerSet)) &&
06779                         (getTEImage(TEX_UPPER_BAKED)->getID() == IMG_DEFAULT_AVATAR))
06780                 {
06781                         loading = TRUE;
06782                 }
06783         }
06784 
06785         
06786         // we wait a little bit before giving the all clear,
06787         // to let textures settle down
06788         const F32 PAUSE = 1.f;
06789         if (loading)
06790                 mFullyLoadedTimer.reset();
06791         
06792         mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > PAUSE);
06793 
06794         
06795         // did our loading state "change" from last call?
06796         const S32 UPDATE_RATE = 30;
06797         BOOL changed =
06798                 ((mFullyLoaded != mPreviousFullyLoaded) ||         // if the value is different from the previous call
06799                  (!mFullyLoadedInitialized) ||                     // if we've never been called before
06800                  (mFullyLoadedFrameCounter % UPDATE_RATE == 0));   // every now and then issue a change
06801 
06802         mPreviousFullyLoaded = mFullyLoaded;
06803         mFullyLoadedInitialized = TRUE;
06804         mFullyLoadedFrameCounter++;
06805         
06806         return changed;
06807 }
06808 
06809 
06810 BOOL LLVOAvatar::isFullyLoaded()
06811 {
06812         if (gSavedSettings.getBOOL("RenderUnloadedAvatar"))
06813                 return TRUE;
06814         else
06815                 return mFullyLoaded;
06816 }
06817 
06818 
06819 //-----------------------------------------------------------------------------
06820 // findMotion()
06821 //-----------------------------------------------------------------------------
06822 LLMotion*               LLVOAvatar::findMotion(const LLUUID& id)
06823 {
06824         return mMotionController.findMotion(id);
06825 }
06826 
06827 // Counts the memory footprint of local textures.
06828 void LLVOAvatar::getLocalTextureByteCount( S32* gl_bytes )
06829 {
06830         *gl_bytes = 0;
06831         for( S32 i = 0; i < LOCTEX_NUM_ENTRIES; i++ )
06832         {
06833                 LLViewerImage* image_gl = mLocalTexture[i];
06834                 if( image_gl )
06835                 {
06836                         S32 bytes = (S32)image_gl->getWidth() * image_gl->getHeight() * image_gl->getComponents();
06837 
06838                         if( image_gl->getHasGLTexture() )
06839                         {
06840                                 *gl_bytes += bytes;
06841                         }
06842                 }
06843         }
06844 }
06845 
06846 
06847 BOOL LLVOAvatar::bindScratchTexture( LLGLenum format )
06848 {
06849         U32 texture_bytes = 0;
06850         GLuint gl_name = getScratchTexName( format, &texture_bytes );
06851         if( gl_name )
06852         {
06853                 LLImageGL::bindExternalTexture( gl_name, 0, GL_TEXTURE_2D );
06854                 stop_glerror();
06855 
06856                 F32* last_bind_time = LLVOAvatar::sScratchTexLastBindTime.getIfThere( format );
06857                 if( last_bind_time )
06858                 {
06859                         if( *last_bind_time != LLImageGL::sLastFrameTime )
06860                         {
06861                                 *last_bind_time = LLImageGL::sLastFrameTime;
06862                                 LLImageGL::updateBoundTexMem(texture_bytes);
06863                         }
06864                 }
06865                 else
06866                 {
06867                         LLImageGL::updateBoundTexMem(texture_bytes);
06868                         LLVOAvatar::sScratchTexLastBindTime.addData( format, new F32(LLImageGL::sLastFrameTime) );
06869                 }
06870 
06871                 
06872                 return TRUE;
06873         }
06874         else
06875         {
06876                 return FALSE;
06877         }
06878 }
06879 
06880 
06881 LLGLuint LLVOAvatar::getScratchTexName( LLGLenum format, U32* texture_bytes )
06882 {
06883         S32 components;
06884         GLenum internal_format;
06885         switch( format )
06886         {
06887         case GL_LUMINANCE:                      components = 1; internal_format = GL_LUMINANCE8;                break;
06888         case GL_ALPHA:                          components = 1; internal_format = GL_ALPHA8;                    break;
06889         case GL_COLOR_INDEX:            components = 1; internal_format = GL_COLOR_INDEX8_EXT;  break;
06890         case GL_LUMINANCE_ALPHA:        components = 2; internal_format = GL_LUMINANCE8_ALPHA8; break;
06891         case GL_RGB:                            components = 3; internal_format = GL_RGB8;                              break;
06892         case GL_RGBA:                           components = 4; internal_format = GL_RGBA8;                             break;
06893         default:        llassert(0);    components = 4; internal_format = GL_RGBA8;                             break;
06894         }
06895 
06896         *texture_bytes = components * VOAVATAR_SCRATCH_TEX_WIDTH * VOAVATAR_SCRATCH_TEX_HEIGHT;
06897         
06898         if( LLVOAvatar::sScratchTexNames.checkData( format ) )
06899         {
06900                 return *( LLVOAvatar::sScratchTexNames.getData( format ) );
06901         }
06902         else
06903         {
06904 
06905                 LLGLSUIDefault gls_ui;
06906 
06907                 GLuint name = 0;
06908                 glGenTextures(1, &name );
06909                 stop_glerror();
06910 
06911                 LLImageGL::bindExternalTexture( name, 0, GL_TEXTURE_2D ); 
06912                 stop_glerror();
06913 
06914                 glTexImage2D(
06915                         GL_TEXTURE_2D, 0, internal_format, 
06916                         VOAVATAR_SCRATCH_TEX_WIDTH, VOAVATAR_SCRATCH_TEX_HEIGHT,
06917                         0, format, GL_UNSIGNED_BYTE, NULL );
06918                 stop_glerror();
06919 
06920                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
06921                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
06922                 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
06923                 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
06924                 stop_glerror();
06925 
06926                 LLImageGL::unbindTexture(0, GL_TEXTURE_2D); 
06927                 stop_glerror();
06928 
06929                 LLVOAvatar::sScratchTexNames.addData( format, new LLGLuint( name ) );
06930 
06931                 LLVOAvatar::sScratchTexBytes += *texture_bytes;
06932                 LLImageGL::sGlobalTextureMemory += *texture_bytes;
06933                 return name;
06934         }
06935 }
06936 
06937 
06938 
06939 //-----------------------------------------------------------------------------
06940 // setLocalTextureTE()
06941 //-----------------------------------------------------------------------------
06942 void LLVOAvatar::setLocTexTE( U8 te, LLViewerImage* image, BOOL set_by_user )
06943 {
06944         if( !mIsSelf )
06945         {
06946                 llassert( 0 );
06947                 return;
06948         }
06949 
06950         if( te >= TEX_NUM_ENTRIES )
06951         {
06952                 llassert(0);
06953                 return;
06954         }
06955 
06956         if( getTEImage( te )->getID() == image->getID() )
06957         {
06958                 return;
06959         }
06960 
06961         if (isTextureIndexBaked(te))
06962         {
06963                 llassert(0);
06964                 return;
06965         }
06966 
06967         LLTexLayerSet* layer_set = getLayerSet((ETextureIndex)te);
06968         if (layer_set)
06969         {
06970                 invalidateComposite(layer_set, set_by_user);
06971         }
06972 
06973         setTEImage( te, image );
06974         updateMeshTextures();
06975 
06976         if( gAgent.cameraCustomizeAvatar() )
06977         {
06978                 LLVisualParamHint::requestHintUpdates();
06979         }
06980 }
06981 
06982 void LLVOAvatar::setupComposites()
06983 {
06984         // Don't invalidate the baked textures we had on start-up.
06985         BOOL head_baked =  ( getTEImage( TEX_HEAD_BAKED  )->getID() != IMG_DEFAULT_AVATAR );
06986         BOOL upper_baked = ( getTEImage( TEX_UPPER_BAKED )->getID() != IMG_DEFAULT_AVATAR );
06987         BOOL lower_baked = ( getTEImage( TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR );
06988         BOOL eyes_baked =  ( getTEImage( TEX_EYES_BAKED  )->getID() != IMG_DEFAULT_AVATAR );
06989         BOOL skirt_baked = ( getTEImage( TEX_SKIRT_BAKED )->getID() != IMG_DEFAULT_AVATAR );
06990         
06991         if (mHeadLayerSet)
06992         {
06993                 mHeadLayerSet->setUpdatesEnabled(               !head_baked  );
06994         }
06995         if (mUpperBodyLayerSet)
06996         {
06997                 mUpperBodyLayerSet->setUpdatesEnabled(  !upper_baked );
06998         }
06999         if (mLowerBodyLayerSet)
07000         {
07001                 mLowerBodyLayerSet->setUpdatesEnabled(  !lower_baked );
07002         }
07003         if (mEyesLayerSet)
07004         {
07005                 mEyesLayerSet->setUpdatesEnabled(               !eyes_baked  );
07006         }
07007         if (mSkirtLayerSet)
07008         {
07009                 mSkirtLayerSet->setUpdatesEnabled(              !skirt_baked  );
07010         }
07011 }
07012 
07013 //-----------------------------------------------------------------------------
07014 // updateMeshTextures()
07015 // Uses the current TE values to set the meshes' and layersets' textures.
07016 //-----------------------------------------------------------------------------
07017 void LLVOAvatar::updateMeshTextures()
07018 {
07019 //      llinfos << "updateMeshTextures" << llendl;
07020         if (gNoRender)
07021         {
07022                 return;
07023         }
07024         // if user has never specified a texture, assign the default
07025         LLViewerImage* default_tex = gImageList.getImage(IMG_DEFAULT);
07026         U8 num_TEs = getNumTEs();
07027         for (U32 i=0; i<num_TEs; i++)
07028         {
07029                 LLViewerImage* te_image = getTEImage(i);
07030                 if( (NULL == te_image) || te_image->getID().isNull() || (te_image->getID() == IMG_DEFAULT) )
07031                 {
07032                         if( TEX_HAIR == i )
07033                         {
07034                                 setTEImage(i, default_tex );
07035                         }
07036                         else
07037                         {
07038                                 setTEImage(i, gImageList.getImage(IMG_DEFAULT_AVATAR)); // a special texture that's never rendered.
07039                         }
07040                 }
07041         }
07042 
07043         // During face edit mode, we don't use baked textures
07044         BOOL self_customize = mIsSelf && gAgent.cameraCustomizeAvatar();
07045 
07046         BOOL head_baked = (getTEImage( TEX_HEAD_BAKED )->getID() != IMG_DEFAULT_AVATAR );
07047         BOOL upper_baked = (getTEImage( TEX_UPPER_BAKED )->getID() != IMG_DEFAULT_AVATAR );
07048         BOOL lower_baked = (getTEImage( TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR );
07049         BOOL eyes_baked = (getTEImage( TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR );
07050         BOOL skirt_baked = (getTEImage( TEX_SKIRT_BAKED )->getID() != IMG_DEFAULT_AVATAR );
07051 
07052         // Nothing should be baked if we're in customize avatar mode.
07053         llassert( !( self_customize && 
07054                 ( head_baked || upper_baked || lower_baked || eyes_baked ) ) );
07055 
07056         BOOL use_lkg_head_baked =  FALSE;
07057         BOOL use_lkg_upper_baked = FALSE;
07058         BOOL use_lkg_lower_baked = FALSE;
07059         BOOL use_lkg_eyes_baked =  FALSE;
07060         BOOL use_lkg_skirt_baked =  FALSE;
07061 
07062         BOOL other_culled = !mIsSelf && mCulled;
07063         if( other_culled )
07064         {
07065                 use_lkg_head_baked =  !head_baked  && (mLastHeadBakedID != IMG_DEFAULT_AVATAR);
07066                 use_lkg_upper_baked = !upper_baked && (mLastUpperBodyBakedID != IMG_DEFAULT_AVATAR);
07067                 use_lkg_lower_baked = !lower_baked && (mLastLowerBodyBakedID != IMG_DEFAULT_AVATAR);
07068                 use_lkg_eyes_baked =  !eyes_baked  && (mLastEyesBakedID != IMG_DEFAULT_AVATAR);
07069                 use_lkg_skirt_baked = !skirt_baked && (mLastSkirtBakedID != IMG_DEFAULT_AVATAR);
07070 
07071                 if( mHeadLayerSet )
07072                 {
07073                         mHeadLayerSet->destroyComposite();
07074                 }
07075 
07076                 if( mUpperBodyLayerSet )
07077                 {
07078                         mUpperBodyLayerSet->destroyComposite();
07079                 }
07080 
07081                 if( mLowerBodyLayerSet )
07082                 {
07083                         mLowerBodyLayerSet->destroyComposite();
07084                 }
07085 
07086                 if( mEyesLayerSet )
07087                 {
07088                         mEyesLayerSet->destroyComposite();
07089                 }
07090 
07091                 if( mSkirtLayerSet )
07092                 {
07093                         mSkirtLayerSet->destroyComposite();
07094                 }
07095 
07096         }
07097         else
07098         if( !self_customize )
07099         {
07100                 // When you're changing clothes and you're not in Appearance mode,
07101                 // use the last-known good baked texture until you finish the first
07102                 // render of the new layerset.
07103                 use_lkg_head_baked =  !head_baked  && (mLastHeadBakedID      != IMG_DEFAULT_AVATAR) && mHeadLayerSet      && !mHeadLayerSet->getComposite()->isInitialized();
07104                 use_lkg_upper_baked = !upper_baked && (mLastUpperBodyBakedID != IMG_DEFAULT_AVATAR) && mUpperBodyLayerSet && !mUpperBodyLayerSet->getComposite()->isInitialized();
07105                 use_lkg_lower_baked = !lower_baked && (mLastLowerBodyBakedID != IMG_DEFAULT_AVATAR) && mLowerBodyLayerSet && !mLowerBodyLayerSet->getComposite()->isInitialized();
07106                 use_lkg_eyes_baked =  !eyes_baked  && (mLastEyesBakedID      != IMG_DEFAULT_AVATAR) && mEyesLayerSet      && !mEyesLayerSet->getComposite()->isInitialized();
07107                 use_lkg_skirt_baked = !skirt_baked && (mLastSkirtBakedID     != IMG_DEFAULT_AVATAR) && mSkirtLayerSet     && !mSkirtLayerSet->getComposite()->isInitialized();
07108 
07109                 if( use_lkg_head_baked ) 
07110                 {
07111                         mHeadLayerSet->setUpdatesEnabled( TRUE );
07112                 }
07113 
07114                 if( use_lkg_upper_baked ) 
07115                 {
07116                         mUpperBodyLayerSet->setUpdatesEnabled( TRUE );
07117                 }
07118 
07119                 if( use_lkg_lower_baked )
07120                 {
07121                         mLowerBodyLayerSet->setUpdatesEnabled( TRUE );
07122                 }
07123 
07124                 if( use_lkg_eyes_baked )  
07125                 {
07126                         mEyesLayerSet->setUpdatesEnabled( TRUE );
07127                 }
07128 
07129                 if( use_lkg_skirt_baked )  
07130                 {
07131                         mSkirtLayerSet->setUpdatesEnabled( TRUE );
07132                 }
07133         }
07134 
07135         // Baked textures should be requested from the sim this avatar is on. JC
07136         LLHost target_host = getObjectHost();
07137         if (!target_host.isOk())
07138         {
07139                 llwarns << "updateMeshTextures: invalid host for object: " << getID() << llendl;
07140         }
07141                 
07142         // Head
07143         if( use_lkg_head_baked )
07144         {
07145                 LLViewerImage* baked = gImageList.getImageFromHost( mLastHeadBakedID, target_host );
07146                 mHeadMesh0.setTexture( baked );
07147                 mHeadMesh1.setTexture( baked );
07148                 mHeadMesh2.setTexture( baked );
07149                 mHeadMesh3.setTexture( baked );
07150                 mHeadMesh4.setTexture( baked );
07151                 mEyeLashMesh0.setTexture( baked );
07152         }
07153         else
07154         if( !self_customize && head_baked )
07155         {
07156                 LLViewerImage* baked = getTEImage( TEX_HEAD_BAKED );
07157                 if( baked->getID() == mLastHeadBakedID )
07158                 {
07159                         // Even though the file may not be finished loading, we'll consider it loaded and use it (rather than doing compositing).
07160                         useBakedTexture( baked->getID() );
07161                 }
07162                 else
07163                 {
07164                         mHeadBakedLoaded = FALSE;
07165                         mHeadMaskDiscard = -1;
07166                         baked->setNeedsAux(TRUE);
07167                         baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID ));  
07168                         baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) );
07169                 }
07170         }
07171         else
07172         if( mHeadLayerSet && !other_culled )
07173         {
07174                 mHeadLayerSet->createComposite();
07175                 mHeadLayerSet->setUpdatesEnabled( TRUE );
07176                 mHeadMesh0.setLayerSet( mHeadLayerSet );
07177                 mHeadMesh1.setLayerSet( mHeadLayerSet );
07178                 mHeadMesh2.setLayerSet( mHeadLayerSet );
07179                 mHeadMesh3.setLayerSet( mHeadLayerSet );
07180                 mHeadMesh4.setLayerSet( mHeadLayerSet );
07181                 mEyeLashMesh0.setLayerSet( mHeadLayerSet );
07182         }
07183         else
07184         {
07185                 mHeadMesh0.setTexture( default_tex );
07186                 mHeadMesh1.setTexture( default_tex );
07187                 mHeadMesh2.setTexture( default_tex );
07188                 mHeadMesh3.setTexture( default_tex );
07189                 mHeadMesh4.setTexture( default_tex );
07190                 mEyeLashMesh0.setTexture( default_tex );
07191         }
07192 
07193         // Upper body
07194         if( use_lkg_upper_baked )
07195         {
07196                 LLViewerImage* baked = gImageList.getImageFromHost( mLastUpperBodyBakedID, target_host );
07197                 mUpperBodyMesh0.setTexture( baked );
07198                 mUpperBodyMesh1.setTexture( baked );
07199                 mUpperBodyMesh2.setTexture( baked );
07200                 mUpperBodyMesh3.setTexture( baked );
07201                 mUpperBodyMesh4.setTexture( baked );
07202         }
07203         else
07204         if( !self_customize && upper_baked )
07205         {
07206                 LLViewerImage* baked = getTEImage( TEX_UPPER_BAKED );
07207 
07208                 if( baked->getID() == mLastUpperBodyBakedID )
07209                 {
07210                         // Even though the file may not be finished loading, we'll consider it loaded and use it (rather than doing compositing).
07211                         useBakedTexture( baked->getID() );
07212                 }
07213                 else
07214                 {
07215                         mUpperBakedLoaded = FALSE;
07216                         mUpperMaskDiscard = -1;
07217                         baked->setNeedsAux(TRUE);
07218                         baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID ));
07219                         baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) );
07220                 }
07221         }
07222         else
07223         if( mUpperBodyLayerSet && !other_culled )
07224         {
07225                 mUpperBodyLayerSet->createComposite();
07226                 mUpperBodyLayerSet->setUpdatesEnabled( TRUE );
07227                 mUpperBodyMesh0.setLayerSet( mUpperBodyLayerSet );
07228                 mUpperBodyMesh1.setLayerSet( mUpperBodyLayerSet );
07229                 mUpperBodyMesh2.setLayerSet( mUpperBodyLayerSet );
07230                 mUpperBodyMesh3.setLayerSet( mUpperBodyLayerSet );
07231                 mUpperBodyMesh4.setLayerSet( mUpperBodyLayerSet );
07232         }
07233         else
07234         {
07235                 mUpperBodyMesh0.setTexture( default_tex );
07236                 mUpperBodyMesh1.setTexture(     default_tex );
07237                 mUpperBodyMesh2.setTexture(     default_tex );
07238                 mUpperBodyMesh3.setTexture(     default_tex );
07239                 mUpperBodyMesh4.setTexture(     default_tex );
07240         }
07241 
07242         // Lower body
07243         if( use_lkg_lower_baked )
07244         {
07245                 LLViewerImage* baked = gImageList.getImageFromHost( mLastLowerBodyBakedID, target_host );
07246                 mLowerBodyMesh0.setTexture( baked );
07247                 mLowerBodyMesh1.setTexture( baked );
07248                 mLowerBodyMesh2.setTexture( baked );
07249                 mLowerBodyMesh3.setTexture( baked );
07250                 mLowerBodyMesh4.setTexture( baked );
07251         }
07252         else
07253         if( !self_customize && lower_baked )
07254         {
07255                 LLViewerImage* baked = getTEImage( TEX_LOWER_BAKED );
07256                 if( baked->getID() == mLastLowerBodyBakedID )
07257                 {
07258                         // Even though the file may not be finished loading, we'll consider it loaded and use it (rather than doing compositing).
07259                         useBakedTexture( baked->getID() );
07260                 }
07261                 else
07262                 {
07263                         mLowerBakedLoaded = FALSE;
07264                         mLowerMaskDiscard = -1;
07265                         baked->setNeedsAux(TRUE);
07266                         baked->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID ));
07267                         baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) );
07268                 }
07269         }
07270         else
07271         if( mLowerBodyLayerSet && !other_culled )
07272         {
07273                 mLowerBodyLayerSet->createComposite();
07274                 mLowerBodyLayerSet->setUpdatesEnabled( TRUE );
07275                 mLowerBodyMesh0.setLayerSet( mLowerBodyLayerSet );
07276                 mLowerBodyMesh1.setLayerSet( mLowerBodyLayerSet );
07277                 mLowerBodyMesh2.setLayerSet( mLowerBodyLayerSet );
07278                 mLowerBodyMesh3.setLayerSet( mLowerBodyLayerSet );
07279                 mLowerBodyMesh4.setLayerSet( mLowerBodyLayerSet );
07280         }
07281         else
07282         {
07283                 mLowerBodyMesh0.setTexture(     default_tex );
07284                 mLowerBodyMesh1.setTexture(     default_tex );
07285                 mLowerBodyMesh2.setTexture(     default_tex );
07286                 mLowerBodyMesh3.setTexture(     default_tex );
07287                 mLowerBodyMesh4.setTexture(     default_tex );
07288         }
07289 
07290         // Eyes
07291         if( use_lkg_eyes_baked )
07292         {
07293                 LLViewerImage* baked = gImageList.getImageFromHost( mLastEyesBakedID, target_host );
07294                 mEyeBallLeftMesh0.setTexture(  baked );
07295                 mEyeBallLeftMesh1.setTexture(  baked );
07296                 mEyeBallRightMesh0.setTexture( baked );
07297                 mEyeBallRightMesh1.setTexture( baked );
07298         }
07299         else
07300         if( !self_customize && eyes_baked )
07301         {
07302                 LLViewerImage* baked = getTEImage( TEX_EYES_BAKED );
07303                 if( baked->getID() == mLastEyesBakedID )
07304                 {
07305                         // Even though the file may not be finished loading, we'll consider it loaded and use it (rather than doing compositing).
07306                         useBakedTexture( baked->getID() );
07307                 }
07308                 else
07309                 {
07310                         mEyesBakedLoaded = FALSE;
07311                         baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) );
07312                 }
07313         }
07314         else
07315         if( mEyesLayerSet && !other_culled )
07316         {
07317                 mEyesLayerSet->createComposite();
07318                 mEyesLayerSet->setUpdatesEnabled( TRUE );
07319                 mEyeBallLeftMesh0.setLayerSet( mEyesLayerSet );
07320                 mEyeBallLeftMesh1.setLayerSet( mEyesLayerSet );
07321                 mEyeBallRightMesh0.setLayerSet( mEyesLayerSet );
07322                 mEyeBallRightMesh1.setLayerSet( mEyesLayerSet );
07323         }
07324         else
07325         {
07326                 mEyeBallLeftMesh0.setTexture( default_tex );
07327                 mEyeBallLeftMesh1.setTexture( default_tex );
07328                 mEyeBallRightMesh0.setTexture( default_tex );
07329                 mEyeBallRightMesh1.setTexture( default_tex );
07330         }
07331 
07332         // Skirt
07333         if( use_lkg_skirt_baked )
07334         {
07335                 LLViewerImage* baked = gImageList.getImageFromHost( mLastSkirtBakedID, target_host );
07336                 mSkirtMesh0.setTexture(  baked );
07337                 mSkirtMesh1.setTexture(  baked );
07338                 mSkirtMesh2.setTexture(  baked );
07339                 mSkirtMesh3.setTexture(  baked );
07340                 mSkirtMesh4.setTexture(  baked );
07341         }
07342         else
07343         if( !self_customize && skirt_baked )
07344         {
07345                 LLViewerImage* baked = getTEImage( TEX_SKIRT_BAKED );
07346                 if( baked->getID() == mLastSkirtBakedID )
07347                 {
07348                         // Even though the file may not be finished loading, we'll consider it loaded and use it (rather than doing compositing).
07349                         useBakedTexture( baked->getID() );
07350                 }
07351                 else
07352                 {
07353                         mSkirtBakedLoaded = FALSE;
07354                         baked->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, new LLUUID( mID ) );
07355                 }
07356         }
07357         else
07358         if( mSkirtLayerSet && !other_culled)
07359         {
07360                 mSkirtLayerSet->createComposite();
07361                 mSkirtLayerSet->setUpdatesEnabled( TRUE );
07362                 mSkirtMesh0.setLayerSet( mSkirtLayerSet );
07363                 mSkirtMesh1.setLayerSet( mSkirtLayerSet );
07364                 mSkirtMesh2.setLayerSet( mSkirtLayerSet );
07365                 mSkirtMesh3.setLayerSet( mSkirtLayerSet );
07366                 mSkirtMesh4.setLayerSet( mSkirtLayerSet );
07367         }
07368         else
07369         {
07370                 mSkirtMesh0.setTexture( default_tex );
07371                 mSkirtMesh1.setTexture( default_tex );
07372                 mSkirtMesh2.setTexture( default_tex );
07373                 mSkirtMesh3.setTexture( default_tex );
07374                 mSkirtMesh4.setTexture( default_tex );
07375         }
07376 
07377         mHairMesh0.setTexture(                                          getTEImage( TEX_HAIR ) );
07378         mHairMesh1.setTexture(                                          getTEImage( TEX_HAIR ) );
07379         mHairMesh2.setTexture(                                          getTEImage( TEX_HAIR ) );
07380         mHairMesh3.setTexture(                                          getTEImage( TEX_HAIR ) );
07381         mHairMesh4.setTexture(                                          getTEImage( TEX_HAIR ) );
07382         mHairMesh5.setTexture(                                          getTEImage( TEX_HAIR ) );
07383 
07384         if( mTexHairColor )
07385         {
07386                 LLColor4 color = mTexHairColor->getColor();
07387                 mHairMesh0.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
07388                 mHairMesh1.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
07389                 mHairMesh2.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
07390                 mHairMesh3.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
07391                 mHairMesh4.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
07392                 mHairMesh5.setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
07393         }
07394 
07395         // Head
07396         BOOL head_baked_ready = (head_baked && mHeadBakedLoaded) || other_culled;
07397         setLocalTexture( LOCTEX_HEAD_BODYPAINT,         getTEImage( TEX_HEAD_BODYPAINT ),       head_baked_ready );
07398 
07399         // Upper body
07400         BOOL upper_baked_ready = (upper_baked && mUpperBakedLoaded) || other_culled;
07401         setLocalTexture( LOCTEX_UPPER_SHIRT,            getTEImage( TEX_UPPER_SHIRT ),          upper_baked_ready );
07402         setLocalTexture( LOCTEX_UPPER_BODYPAINT,        getTEImage( TEX_UPPER_BODYPAINT ),      upper_baked_ready );
07403         setLocalTexture( LOCTEX_UPPER_JACKET,           getTEImage( TEX_UPPER_JACKET ),         upper_baked_ready );
07404         setLocalTexture( LOCTEX_UPPER_GLOVES,           getTEImage( TEX_UPPER_GLOVES ),         upper_baked_ready );
07405         setLocalTexture( LOCTEX_UPPER_UNDERSHIRT,       getTEImage( TEX_UPPER_UNDERSHIRT ),     upper_baked_ready );
07406 
07407         // Lower body
07408         BOOL lower_baked_ready = (lower_baked && mLowerBakedLoaded) || other_culled;
07409         setLocalTexture( LOCTEX_LOWER_PANTS,            getTEImage( TEX_LOWER_PANTS ),          lower_baked_ready );
07410         setLocalTexture( LOCTEX_LOWER_BODYPAINT,        getTEImage( TEX_LOWER_BODYPAINT ),      lower_baked_ready );
07411         setLocalTexture( LOCTEX_LOWER_SHOES,            getTEImage( TEX_LOWER_SHOES ),          lower_baked_ready );
07412         setLocalTexture( LOCTEX_LOWER_SOCKS,            getTEImage( TEX_LOWER_SOCKS ),          lower_baked_ready );
07413         setLocalTexture( LOCTEX_LOWER_JACKET,           getTEImage( TEX_LOWER_JACKET ),         lower_baked_ready );
07414         setLocalTexture( LOCTEX_LOWER_UNDERPANTS,       getTEImage( TEX_LOWER_UNDERPANTS ),     lower_baked_ready );
07415 
07416         // Eyes
07417         BOOL eyes_baked_ready = (eyes_baked && mEyesBakedLoaded) || other_culled;
07418         setLocalTexture( LOCTEX_EYES_IRIS,                      getTEImage( TEX_EYES_IRIS ),            eyes_baked_ready );
07419 
07420         // Skirt
07421         BOOL skirt_baked_ready = (skirt_baked && mSkirtBakedLoaded) || other_culled;
07422         setLocalTexture( LOCTEX_SKIRT,                          getTEImage( TEX_SKIRT ),                        skirt_baked_ready );
07423 
07424         removeMissingBakedTextures();
07425 }
07426 
07427 //-----------------------------------------------------------------------------
07428 // setLocalTexture()
07429 //-----------------------------------------------------------------------------
07430 void LLVOAvatar::setLocalTexture( ELocTexIndex idx, LLViewerImage* tex, BOOL baked_version_ready )
07431 {
07432         S32 desired_discard = mIsSelf ? 0 : 2;
07433         if (!baked_version_ready)
07434         {
07435                 if (tex != mLocalTexture[idx] || mLocalTextureBaked[idx])
07436                 {
07437                         mLocalTextureDiscard[idx] = MAX_DISCARD_LEVEL+1;
07438                 }
07439                 if (tex->getID() != IMG_DEFAULT_AVATAR)
07440                 {
07441                         if (mLocalTextureDiscard[idx] > desired_discard)
07442                         {
07443                                 S32 tex_discard = tex->getDiscardLevel();
07444                                 if (tex_discard >= 0 && tex_discard <= desired_discard)
07445                                 {
07446                                         mLocalTextureDiscard[idx] = tex_discard;
07447                                         requestLayerSetUpdate( idx );
07448                                         if( mIsSelf && gAgent.cameraCustomizeAvatar() )
07449                                         {
07450                                                 LLVisualParamHint::requestHintUpdates();
07451                                         }
07452                                 }
07453                                 else
07454                                 {
07455                                         tex->setLoadedCallback( onLocalTextureLoaded, desired_discard, TRUE, new LLAvatarTexData(getID(), idx) );
07456                                 }
07457                         }
07458                         tex->setMinDiscardLevel(desired_discard);
07459                 }
07460         }
07461         mLocalTextureBaked[idx] = baked_version_ready;
07462         mLocalTexture[idx] = tex;
07463 }
07464 
07465 //-----------------------------------------------------------------------------
07466 // requestLayerSetUploads()
07467 //-----------------------------------------------------------------------------
07468 void LLVOAvatar::requestLayerSetUploads()
07469 {
07470         BOOL upper_baked = (getTEImage( TEX_UPPER_BAKED )->getID() != IMG_DEFAULT_AVATAR );
07471         BOOL lower_baked = (getTEImage( TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR );
07472         BOOL head_baked = (getTEImage( TEX_HEAD_BAKED )->getID() != IMG_DEFAULT_AVATAR );
07473         BOOL eyes_baked = (getTEImage( TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR );
07474         BOOL skirt_baked = (getTEImage( TEX_SKIRT_BAKED )->getID() != IMG_DEFAULT_AVATAR );
07475 
07476         if( !head_baked && mHeadLayerSet )
07477         {
07478                 mHeadLayerSet->requestUpload();
07479         }
07480 
07481         if( !upper_baked && mUpperBodyLayerSet )
07482         {
07483                 mUpperBodyLayerSet->requestUpload();
07484         }
07485 
07486         if( !lower_baked && mLowerBodyLayerSet )
07487         {
07488                 mLowerBodyLayerSet->requestUpload();
07489         }
07490 
07491         if( !eyes_baked && mEyesLayerSet )
07492         {
07493                 mEyesLayerSet->requestUpload();
07494         }
07495 
07496         if( !skirt_baked && mSkirtLayerSet )
07497         {
07498                 mSkirtLayerSet->requestUpload();
07499         }
07500 }
07501 
07502 
07503 //-----------------------------------------------------------------------------
07504 // setCompositeUpdatesEnabled()
07505 //-----------------------------------------------------------------------------
07506 void LLVOAvatar::setCompositeUpdatesEnabled( BOOL b )
07507 {
07508         if( mHeadLayerSet )
07509         {
07510                 mHeadLayerSet->setUpdatesEnabled( b );
07511         }
07512         
07513         if( mUpperBodyLayerSet )
07514         {
07515                 mUpperBodyLayerSet->setUpdatesEnabled( b );
07516         }
07517 
07518         if( mLowerBodyLayerSet )
07519         {
07520                 mLowerBodyLayerSet->setUpdatesEnabled( b );
07521         }
07522 
07523         if( mEyesLayerSet )
07524         {
07525                 mEyesLayerSet->setUpdatesEnabled( b );
07526         }
07527 
07528         if( mSkirtLayerSet )
07529         {
07530                 mSkirtLayerSet->setUpdatesEnabled( b );
07531         }
07532 
07533 }
07534 
07535 void LLVOAvatar::addChat(const LLChat& chat)
07536 {
07537         std::deque<LLChat>::iterator chat_iter;
07538 
07539         mChats.push_back(chat);
07540 
07541         S32 chat_length = 0;
07542         for( chat_iter = mChats.begin(); chat_iter != mChats.end(); ++chat_iter)
07543         {
07544                 chat_length += chat_iter->mText.size();
07545         }
07546 
07547         // remove any excess chat
07548         chat_iter = mChats.begin();
07549         while ((chat_length > MAX_BUBBLE_CHAT_LENGTH || mChats.size() > MAX_BUBBLE_CHAT_UTTERANCES) && chat_iter != mChats.end())
07550         {
07551                 chat_length -= chat_iter->mText.size();
07552                 mChats.pop_front();
07553                 chat_iter = mChats.begin();
07554         }
07555 
07556         mChatTimer.reset();
07557 }
07558 
07559 void LLVOAvatar::clearChat()
07560 {
07561         mChats.clear();
07562 }
07563 
07564 S32 LLVOAvatar::getLocalDiscardLevel( S32 index )
07565 {
07566         if (index >= 0
07567                 && mLocalTexture[index].notNull()
07568                 && (mLocalTexture[index]->getID() != IMG_DEFAULT_AVATAR)
07569                 && !mLocalTexture[index]->isMissingAsset())
07570         {
07571                 return mLocalTexture[index]->getDiscardLevel();
07572         }
07573         else
07574         {
07575                 // We don't care about this (no image associated with the layer) treat as fully loaded.
07576                 return 0;
07577         }
07578 }
07579 
07580 //-----------------------------------------------------------------------------
07581 // isLocalTextureDataFinal()
07582 // Returns true is the highest quality discard level exists for every texture
07583 // in the layerset.
07584 //-----------------------------------------------------------------------------
07585 BOOL LLVOAvatar::isLocalTextureDataFinal( LLTexLayerSet* layerset )
07586 {
07587         if( layerset == mHeadLayerSet )
07588         {
07589                 return getLocalDiscardLevel( LOCTEX_HEAD_BODYPAINT ) == 0;
07590         }
07591         else if( layerset == mUpperBodyLayerSet )
07592         {
07593                 return getLocalDiscardLevel( LOCTEX_UPPER_SHIRT ) == 0 &&
07594                         getLocalDiscardLevel( LOCTEX_UPPER_BODYPAINT ) == 0 &&
07595                         getLocalDiscardLevel( LOCTEX_UPPER_JACKET ) == 0 && 
07596                         getLocalDiscardLevel( LOCTEX_UPPER_GLOVES ) == 0 && 
07597                         getLocalDiscardLevel( LOCTEX_UPPER_UNDERSHIRT ) == 0;
07598         }
07599         else if( layerset == mLowerBodyLayerSet )
07600         {
07601                 return getLocalDiscardLevel( LOCTEX_LOWER_PANTS ) == 0 &&
07602                         getLocalDiscardLevel( LOCTEX_LOWER_BODYPAINT ) == 0 && 
07603                         getLocalDiscardLevel( LOCTEX_LOWER_SHOES ) == 0 && 
07604                         getLocalDiscardLevel( LOCTEX_LOWER_SOCKS ) == 0 && 
07605                         getLocalDiscardLevel( LOCTEX_LOWER_JACKET ) == 0 && 
07606                         getLocalDiscardLevel( LOCTEX_LOWER_UNDERPANTS ) == 0;
07607         }
07608         else if( layerset == mEyesLayerSet )
07609         {
07610                 return getLocalDiscardLevel( LOCTEX_EYES_IRIS ) == 0;
07611         }
07612         else if( layerset == mSkirtLayerSet )
07613         {
07614                 return getLocalDiscardLevel( LOCTEX_SKIRT ) == 0;
07615         }
07616 
07617         llassert(0);
07618         return FALSE;
07619 }
07620 
07621 //-----------------------------------------------------------------------------
07622 // isLocalTextureDataAvailable()
07623 // Returns true is at least the lowest quality discard level exists for every texture
07624 // in the layerset.
07625 //-----------------------------------------------------------------------------
07626 BOOL LLVOAvatar::isLocalTextureDataAvailable( LLTexLayerSet* layerset )
07627 {
07628         if( layerset == mHeadLayerSet )
07629         {
07630                 return getLocalDiscardLevel( LOCTEX_HEAD_BODYPAINT ) >= 0;
07631         }
07632         else if( layerset == mUpperBodyLayerSet )
07633         {
07634                 return getLocalDiscardLevel( LOCTEX_UPPER_SHIRT ) >= 0 &&
07635                         getLocalDiscardLevel( LOCTEX_UPPER_BODYPAINT ) >= 0 &&
07636                         getLocalDiscardLevel( LOCTEX_UPPER_JACKET ) >= 0 && 
07637                         getLocalDiscardLevel( LOCTEX_UPPER_GLOVES ) >= 0 && 
07638                         getLocalDiscardLevel( LOCTEX_UPPER_UNDERSHIRT ) >= 0;
07639         }
07640         else if( layerset == mLowerBodyLayerSet )
07641         {
07642                 return getLocalDiscardLevel( LOCTEX_LOWER_PANTS ) >= 0 &&
07643                         getLocalDiscardLevel( LOCTEX_LOWER_BODYPAINT ) >= 0 && 
07644                         getLocalDiscardLevel( LOCTEX_LOWER_SHOES ) >= 0 && 
07645                         getLocalDiscardLevel( LOCTEX_LOWER_SOCKS ) >= 0 && 
07646                         getLocalDiscardLevel( LOCTEX_LOWER_JACKET ) >= 0 && 
07647                         getLocalDiscardLevel( LOCTEX_LOWER_UNDERPANTS ) >= 0;
07648         }
07649         else if( layerset == mEyesLayerSet )
07650         {
07651                 return getLocalDiscardLevel( LOCTEX_EYES_IRIS ) >= 0;
07652         }
07653         else if( layerset == mSkirtLayerSet )
07654         {
07655                 return getLocalDiscardLevel( LOCTEX_SKIRT ) >= 0;
07656         }
07657 
07658         llassert(0);
07659         return FALSE;
07660 }
07661 
07662 
07663 //-----------------------------------------------------------------------------
07664 // getBakedTE()
07665 // Used by the LayerSet.  (Layer sets don't in general know what textures depend on them.)
07666 //-----------------------------------------------------------------------------
07667 LLVOAvatar::ETextureIndex LLVOAvatar::getBakedTE( LLTexLayerSet* layerset )
07668 {
07669         if( layerset == mHeadLayerSet )
07670         {
07671                 return TEX_HEAD_BAKED;
07672         }
07673         else
07674         if( layerset == mUpperBodyLayerSet )
07675         {
07676                 return TEX_UPPER_BAKED;
07677         }
07678         else
07679         if( layerset == mLowerBodyLayerSet )
07680         {
07681                 return TEX_LOWER_BAKED;
07682         }
07683         else
07684         if( layerset == mEyesLayerSet )
07685         {
07686                 return TEX_EYES_BAKED;
07687         }
07688         else
07689         if( layerset == mSkirtLayerSet )
07690         {
07691                 return TEX_SKIRT_BAKED;
07692         }
07693 
07694         llassert(0);
07695         return TEX_HEAD_BAKED;
07696 }
07697 
07698 //-----------------------------------------------------------------------------
07699 // setNewBakedTexture()
07700 // A new baked texture has been successfully uploaded and we can start using it now.
07701 //-----------------------------------------------------------------------------
07702 void LLVOAvatar::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid )
07703 {
07704         // Baked textures live on other sims.
07705         LLHost target_host = getObjectHost();   
07706         setTEImage( te, gImageList.getImageFromHost( uuid, target_host ) );
07707         updateMeshTextures();
07708         dirtyMesh();
07709 
07710         LLVOAvatar::cullAvatarsByPixelArea();
07711 
07712         switch( te )
07713         {
07714         case TEX_HEAD_BAKED:
07715                 llinfos << "New baked texture: HEAD" << llendl;
07716                 break;
07717         case TEX_UPPER_BAKED:
07718                 llinfos << "New baked texture: UPPER" << llendl;
07719                 break;
07720         case TEX_LOWER_BAKED:
07721                 llinfos << "New baked texture: LOWER" << llendl;
07722                 break;
07723         case TEX_EYES_BAKED:
07724                 llinfos << "New baked texture: EYES" << llendl;
07725                 break;
07726         case TEX_SKIRT_BAKED:
07727                 llinfos << "New baked texture: SKIRT" << llendl;
07728                 break;
07729         default:
07730                 llwarns << "New baked texture: unknown te " << te << llendl;
07731                 break;
07732         }
07733         
07734         //      dumpAvatarTEs( "setNewBakedTexture() send" );
07735         // RN: throttle uploads
07736         if (!hasPendingBakedUploads())
07737         {
07738                 gAgent.sendAgentSetAppearance();
07739         }
07740 }
07741 
07742 bool LLVOAvatar::hasPendingBakedUploads()
07743 {
07744         bool head_pending = (mHeadLayerSet && mHeadLayerSet->getComposite()->uploadPending());
07745         bool upper_pending = (mUpperBodyLayerSet && mUpperBodyLayerSet->getComposite()->uploadPending());
07746         bool lower_pending = (mLowerBodyLayerSet && mLowerBodyLayerSet->getComposite()->uploadPending());
07747         bool eyes_pending = (mEyesLayerSet && mEyesLayerSet->getComposite()->uploadPending());
07748         bool skirt_pending = (mSkirtLayerSet && mSkirtLayerSet->getComposite()->uploadPending());
07749 
07750         //llinfos << "TAT: LLVOAvatar::hasPendingBakedUploads()"
07751         //      << " head_pending " << head_pending
07752         //      << " upper_pending " << upper_pending
07753         //      << " lower_pending " << lower_pending
07754         //      << " eyes_pending " << eyes_pending
07755         //      << " skirt_pending " << skirt_pending
07756         //      << llendl;
07757 
07758         if (head_pending || upper_pending || lower_pending || eyes_pending || skirt_pending)
07759         {
07760                 return true;
07761         }
07762         else
07763         {
07764                 return false;
07765         }
07766 }
07767 
07768 //-----------------------------------------------------------------------------
07769 // setCachedBakedTexture()
07770 // A baked texture id was received from a cache query, make it active
07771 //-----------------------------------------------------------------------------
07772 void LLVOAvatar::setCachedBakedTexture( ETextureIndex te, const LLUUID& uuid )
07773 {
07774         setTETexture( te, uuid );
07775 
07776         switch(te)
07777         {
07778         case TEX_HEAD_BAKED:
07779                 if( mHeadLayerSet )
07780                 {
07781                         mHeadLayerSet->cancelUpload();
07782                 }               
07783                 break;
07784         case TEX_UPPER_BAKED:
07785                 if( mUpperBodyLayerSet )
07786                 {
07787                         mUpperBodyLayerSet->cancelUpload();
07788                 }
07789                 break;
07790         case TEX_LOWER_BAKED:
07791                 if( mLowerBodyLayerSet )
07792                 {
07793                         mLowerBodyLayerSet->cancelUpload();
07794                 }
07795                 break;
07796         case TEX_EYES_BAKED:
07797                 if( mEyesLayerSet )
07798                 {
07799                         mEyesLayerSet->cancelUpload();
07800                 }
07801                 break;
07802         case TEX_SKIRT_BAKED:
07803                 if( mSkirtLayerSet )
07804                 {
07805                         mSkirtLayerSet->cancelUpload();
07806                 }
07807                 break;
07808 
07809                 case TEX_HEAD_BODYPAINT:
07810                 case TEX_UPPER_SHIRT:
07811                 case TEX_LOWER_PANTS:
07812                 case TEX_EYES_IRIS:
07813                 case TEX_HAIR:
07814                 case TEX_UPPER_BODYPAINT:
07815                 case TEX_LOWER_BODYPAINT:
07816                 case TEX_LOWER_SHOES:
07817                 case TEX_LOWER_SOCKS:
07818                 case TEX_UPPER_JACKET:
07819                 case TEX_LOWER_JACKET:
07820                 case TEX_UPPER_GLOVES:
07821                 case TEX_UPPER_UNDERSHIRT:
07822                 case TEX_LOWER_UNDERPANTS:
07823                 case TEX_SKIRT:
07824                 case TEX_NUM_ENTRIES:
07825                         break;
07826         }
07827 }
07828 
07829 //-----------------------------------------------------------------------------
07830 // static
07831 // onCustomizeStart()
07832 //-----------------------------------------------------------------------------
07833 void LLVOAvatar::onCustomizeStart()
07834 {
07835         LLVOAvatar* avatar = gAgent.getAvatarObject();
07836         if( avatar )
07837         {
07838                 for( S32 i = 0; i < BAKED_TEXTURE_COUNT; i++ )
07839                 {
07840                         S32 tex_index = sBakedTextureIndices[i];
07841                         avatar->mSavedTE[ tex_index ] = avatar->getTEImage(tex_index)->getID();
07842                         avatar->setTEImage( tex_index, gImageList.getImage(IMG_DEFAULT_AVATAR) );
07843                 }
07844 
07845                 avatar->updateMeshTextures();
07846 
07847 //              avatar->dumpAvatarTEs( "onCustomizeStart() send" );
07848                 gAgent.sendAgentSetAppearance();
07849         }
07850 }
07851 
07852 //-----------------------------------------------------------------------------
07853 // static
07854 // onCustomizeEnd()
07855 //-----------------------------------------------------------------------------
07856 void LLVOAvatar::onCustomizeEnd()
07857 {
07858         LLVOAvatar* avatar = gAgent.getAvatarObject();
07859         if( !avatar ) return;
07860 
07861         LLHost target_host = avatar->getObjectHost();
07862                 for( S32 i = 0; i < BAKED_TEXTURE_COUNT; i++ )
07863                 {
07864                         S32 tex_index = sBakedTextureIndices[i];
07865                         const LLUUID& saved = avatar->mSavedTE[ tex_index ];
07866                         if( !saved.isNull() )
07867                         {
07868                         avatar->setTEImage( tex_index, gImageList.getImageFromHost( saved, target_host ) );
07869                         }
07870                 }
07871 
07872                 avatar->updateMeshTextures();
07873 
07874                 if( !LLApp::isExiting())
07875                 {
07876                         avatar->requestLayerSetUploads();
07877                 }
07878 
07879                 gAgent.sendAgentSetAppearance();
07880         }
07881 
07882 BOOL LLVOAvatar::teToColorParams( ETextureIndex te, const char* param_name[3] )
07883 {
07884         switch( te )
07885         {
07886         case TEX_UPPER_SHIRT:
07887                 param_name[0] = "shirt_red";
07888                 param_name[1] = "shirt_green";
07889                 param_name[2] = "shirt_blue";
07890                 break;
07891 
07892         case TEX_LOWER_PANTS:
07893                 param_name[0] = "pants_red";
07894                 param_name[1] = "pants_green";
07895                 param_name[2] = "pants_blue";
07896                 break;
07897 
07898         case TEX_LOWER_SHOES:
07899                 param_name[0] = "shoes_red";
07900                 param_name[1] = "shoes_green";
07901                 param_name[2] = "shoes_blue";
07902                 break;
07903 
07904         case TEX_LOWER_SOCKS:
07905                 param_name[0] = "socks_red";
07906                 param_name[1] = "socks_green";
07907                 param_name[2] = "socks_blue";
07908                 break;
07909 
07910         case TEX_UPPER_JACKET:
07911         case TEX_LOWER_JACKET:
07912                 param_name[0] = "jacket_red";
07913                 param_name[1] = "jacket_green";
07914                 param_name[2] = "jacket_blue";
07915                 break;
07916 
07917         case TEX_UPPER_GLOVES:
07918                 param_name[0] = "gloves_red";
07919                 param_name[1] = "gloves_green";
07920                 param_name[2] = "gloves_blue";
07921                 break;
07922 
07923         case TEX_UPPER_UNDERSHIRT:
07924                 param_name[0] = "undershirt_red";
07925                 param_name[1] = "undershirt_green";
07926                 param_name[2] = "undershirt_blue";
07927                 break;
07928         
07929         case TEX_LOWER_UNDERPANTS:
07930                 param_name[0] = "underpants_red";
07931                 param_name[1] = "underpants_green";
07932                 param_name[2] = "underpants_blue";
07933                 break;
07934 
07935         case TEX_SKIRT:
07936                 param_name[0] = "skirt_red";
07937                 param_name[1] = "skirt_green";
07938                 param_name[2] = "skirt_blue";
07939                 break;
07940 
07941         default:
07942                 llassert(0);
07943                 return FALSE;
07944         }
07945 
07946         return TRUE;
07947 }
07948 
07949 void LLVOAvatar::setClothesColor( ETextureIndex te, const LLColor4& new_color, BOOL set_by_user )
07950 {
07951         const char* param_name[3];
07952         if( teToColorParams( te, param_name ) )
07953         {
07954                 setVisualParamWeight( param_name[0], new_color.mV[VX], set_by_user );
07955                 setVisualParamWeight( param_name[1], new_color.mV[VY], set_by_user );
07956                 setVisualParamWeight( param_name[2], new_color.mV[VZ], set_by_user );
07957         }
07958 }
07959 
07960 LLColor4  LLVOAvatar::getClothesColor( ETextureIndex te )
07961 {
07962         LLColor4 color;
07963         const char* param_name[3];
07964         if( teToColorParams( te, param_name ) )
07965         {
07966                 color.mV[VX] = getVisualParamWeight( param_name[0] );
07967                 color.mV[VY] = getVisualParamWeight( param_name[1] );
07968                 color.mV[VZ] = getVisualParamWeight( param_name[2] );
07969         }
07970         return color;
07971 }
07972 
07973 
07974 
07975 
07976 void LLVOAvatar::dumpAvatarTEs( const char* context )
07977 {
07978         llinfos << (mIsSelf ? "Self: " : "Other: ") << context << llendl;
07979         for( S32 i=0; i<TEX_NUM_ENTRIES; i++ )
07980         {
07981                 const char* te_name[] = {
07982                         "TEX_HEAD_BODYPAINT   ",
07983                         "TEX_UPPER_SHIRT      ",
07984                         "TEX_LOWER_PANTS      ",
07985                         "TEX_EYES_IRIS        ",
07986                         "TEX_HAIR             ",
07987                         "TEX_UPPER_BODYPAINT  ",
07988                         "TEX_LOWER_BODYPAINT  ",
07989                         "TEX_LOWER_SHOES      ",
07990                         "TEX_HEAD_BAKED       ",
07991                         "TEX_UPPER_BAKED      ",
07992                         "TEX_LOWER_BAKED      ",
07993                         "TEX_EYES_BAKED       ",
07994                         "TEX_LOWER_SOCKS      ",
07995                         "TEX_UPPER_JACKET     ",
07996                         "TEX_LOWER_JACKET     ",
07997                         "TEX_UPPER_GLOVES     ",
07998                         "TEX_UPPER_UNDERSHIRT ",
07999                         "TEX_LOWER_UNDERPANTS ",
08000                         "TEX_SKIRT            ",
08001                         "TEX_SKIRT_BAKED      "
08002                 };
08003 
08004                 LLViewerImage* te_image = getTEImage(i);
08005                 if( !te_image )
08006                 {
08007                         llinfos << "       " << te_name[i] << ": null ptr" << llendl;
08008                 }
08009                 else
08010                 if( te_image->getID().isNull() )
08011                 {
08012                         llinfos << "       " << te_name[i] << ": null UUID" << llendl;
08013                 }
08014                 else
08015                 if( te_image->getID() == IMG_DEFAULT )
08016                 {
08017                         llinfos << "       " << te_name[i] << ": IMG_DEFAULT" << llendl;
08018                 }
08019                 else
08020                 if( te_image->getID() == IMG_DEFAULT_AVATAR )
08021                 {
08022                         llinfos << "       " << te_name[i] << ": IMG_DEFAULT_AVATAR" << llendl;
08023                 }
08024                 else
08025                 {
08026                         llinfos << "       " << te_name[i] << ": " << te_image->getID() << llendl;
08027                 }
08028         }
08029 }
08030 
08031 //-----------------------------------------------------------------------------
08032 // updateAttachmentVisibility()
08033 //-----------------------------------------------------------------------------
08034 void LLVOAvatar::updateAttachmentVisibility(U32 camera_mode)
08035 {
08036         for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
08037                  iter != mAttachmentPoints.end(); )
08038         {
08039                 attachment_map_t::iterator curiter = iter++;
08040                 LLViewerJointAttachment* attachment = curiter->second;
08041                 if (attachment->getIsHUDAttachment())
08042                 {
08043                         attachment->setAttachmentVisibility(TRUE);
08044                 }
08045                 else
08046                 {
08047                         switch (camera_mode)
08048                         {
08049                         case CAMERA_MODE_MOUSELOOK:
08050                                 if (LLVOAvatar::sVisibleInFirstPerson && attachment->getVisibleInFirstPerson())
08051                                 {
08052                                         attachment->setAttachmentVisibility(TRUE);
08053                                 }
08054                                 else
08055                                 {
08056                                         attachment->setAttachmentVisibility(FALSE);
08057                                 }
08058                                 break;
08059                         default:
08060                                 attachment->setAttachmentVisibility(TRUE);
08061                                 break;
08062                         }
08063                 }
08064         }
08065 }
08066 
08067 // Given a texture entry, determine which wearable type owns it.
08068 // static
08069 LLUUID LLVOAvatar::getDefaultTEImageID( S32 te )
08070 {
08071         switch( te )
08072         {
08073         case TEX_UPPER_SHIRT:           return LLUUID( gSavedSettings.getString("UIImgDefaultShirtUUID") );
08074         case TEX_LOWER_PANTS:           return LLUUID( gSavedSettings.getString("UIImgDefaultPantsUUID") );
08075         case TEX_EYES_IRIS:                     return LLUUID( gSavedSettings.getString("UIImgDefaultEyesUUID") );
08076         case TEX_HAIR:                          return LLUUID( gSavedSettings.getString("UIImgDefaultHairUUID") );
08077         case TEX_LOWER_SHOES:           return LLUUID( gSavedSettings.getString("UIImgDefaultShoesUUID") );
08078         case TEX_LOWER_SOCKS:           return LLUUID( gSavedSettings.getString("UIImgDefaultSocksUUID") );
08079         case TEX_UPPER_GLOVES:          return LLUUID( gSavedSettings.getString("UIImgDefaultGlovesUUID") );
08080         
08081         case TEX_UPPER_JACKET:
08082         case TEX_LOWER_JACKET:          return LLUUID( gSavedSettings.getString("UIImgDefaultJacketUUID") );
08083 
08084         case TEX_UPPER_UNDERSHIRT:
08085         case TEX_LOWER_UNDERPANTS:      return LLUUID( gSavedSettings.getString("UIImgDefaultUnderwearUUID") );
08086 
08087         case TEX_SKIRT:                         return LLUUID( gSavedSettings.getString("UIImgDefaultSkirtUUID") );
08088 
08089         default:                                        return IMG_DEFAULT_AVATAR;
08090         }
08091 }
08092 
08093 
08094 
08095 // Given a texture entry, determine which wearable type owns it.
08096 // static
08097 EWearableType LLVOAvatar::getTEWearableType( S32 te )
08098 {
08099         switch( te )
08100         {
08101         case TEX_UPPER_SHIRT:
08102                 return WT_SHIRT;
08103 
08104         case TEX_LOWER_PANTS:
08105                 return WT_PANTS;
08106 
08107         case TEX_EYES_IRIS:
08108                 return WT_EYES;
08109 
08110         case TEX_HAIR:
08111                 return WT_HAIR;
08112         
08113         case TEX_HEAD_BODYPAINT:
08114         case TEX_UPPER_BODYPAINT:
08115         case TEX_LOWER_BODYPAINT:
08116                 return WT_SKIN;
08117 
08118         case TEX_LOWER_SHOES:
08119                 return WT_SHOES;
08120 
08121         case TEX_LOWER_SOCKS:
08122                 return WT_SOCKS;
08123 
08124         case TEX_UPPER_JACKET:
08125         case TEX_LOWER_JACKET:
08126                 return WT_JACKET;
08127 
08128         case TEX_UPPER_GLOVES:
08129                 return WT_GLOVES;
08130 
08131         case TEX_UPPER_UNDERSHIRT:
08132                 return WT_UNDERSHIRT;
08133 
08134         case TEX_LOWER_UNDERPANTS:
08135                 return WT_UNDERPANTS;
08136 
08137         case TEX_SKIRT:
08138                 return WT_SKIRT;
08139 
08140         default:
08141                 return WT_INVALID;
08142         }
08143 }
08144 
08145 // Unlike most wearable functions, this works for both self and other.
08146 BOOL LLVOAvatar::isWearingWearableType( EWearableType type )
08147 {
08148         if (mIsDummy) return TRUE;
08149 
08150         ETextureIndex indicator_te;
08151         switch( type )
08152         {
08153                 case WT_SHIRT:
08154                         indicator_te = TEX_UPPER_SHIRT;
08155                         break;
08156 
08157                 case WT_PANTS: 
08158                         indicator_te = TEX_LOWER_PANTS;
08159                         break;
08160 
08161                 case WT_SHOES:
08162                         indicator_te = TEX_LOWER_SHOES;
08163                         break;
08164 
08165                 case WT_SOCKS:
08166                         indicator_te = TEX_LOWER_SOCKS;
08167                         break;
08168 
08169                 case WT_JACKET:
08170                         indicator_te = TEX_UPPER_JACKET;
08171                         // Note: no need to test both upper and lower jacket
08172                         break;
08173 
08174                 case WT_GLOVES:
08175                         indicator_te = TEX_UPPER_GLOVES;
08176                         break;
08177 
08178                 case WT_UNDERSHIRT:
08179                         indicator_te = TEX_UPPER_UNDERSHIRT;
08180                         break;
08181 
08182                 case WT_UNDERPANTS:
08183                         indicator_te = TEX_LOWER_UNDERPANTS;
08184                         break;
08185 
08186                 case WT_SKIRT:
08187                         indicator_te = TEX_SKIRT;
08188                         break;
08189                 
08190                 case WT_SHAPE:
08191                 case WT_SKIN:
08192                 case WT_HAIR:
08193                 case WT_EYES:
08194                         return TRUE;  // everyone has all bodyparts
08195 
08196                 default:
08197                         return FALSE;
08198         }
08199 
08200         return ( getTEImage(indicator_te)->getID() != IMG_DEFAULT_AVATAR );
08201 }
08202 
08203 
08204 //-----------------------------------------------------------------------------
08205 // clampAttachmentPositions()
08206 //-----------------------------------------------------------------------------
08207 void LLVOAvatar::clampAttachmentPositions()
08208 {
08209         if (isDead())
08210         {
08211                 return;
08212         }
08213         for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
08214                  iter != mAttachmentPoints.end(); )
08215         {
08216                 attachment_map_t::iterator curiter = iter++;
08217                 LLViewerJointAttachment* attachment = curiter->second;
08218                 if (attachment)
08219                 {
08220                         attachment->clampObjectPosition();
08221                 }
08222         }
08223 }
08224 
08225 BOOL LLVOAvatar::hasHUDAttachment()
08226 {
08227         for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
08228                  iter != mAttachmentPoints.end(); )
08229         {
08230                 attachment_map_t::iterator curiter = iter++;
08231                 LLViewerJointAttachment* attachment = curiter->second;
08232                 if (attachment->getIsHUDAttachment() && attachment->getObject())
08233                 {
08234                         return TRUE;
08235                 }
08236         }
08237         return FALSE;
08238 }
08239 
08240 LLBBox LLVOAvatar::getHUDBBox()
08241 {
08242         LLBBox bbox;
08243         for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
08244                  iter != mAttachmentPoints.end(); )
08245         {
08246                 attachment_map_t::iterator curiter = iter++;
08247                 LLViewerJointAttachment* attachment = curiter->second;
08248                 if (attachment->getIsHUDAttachment() && attachment->getObject())
08249                 {
08250                         LLViewerObject* hud_object = attachment->getObject();
08251 
08252                         // initialize bounding box to contain identity orientation and center point for attached object
08253                         bbox.addPointLocal(hud_object->getPosition());
08254                         // add rotated bounding box for attached object
08255                         bbox.addBBoxAgent(hud_object->getBoundingBoxAgent());
08256                         for (U32 i = 0; i < hud_object->mChildList.size(); i++)
08257                         {
08258                                 bbox.addBBoxAgent(hud_object->mChildList[i]->getBoundingBoxAgent());
08259                         }
08260                 }
08261         }
08262 
08263         return bbox;
08264 }
08265 
08266 void LLVOAvatar::rebuildHUD()
08267 {
08268 }
08269 
08270 //-----------------------------------------------------------------------------
08271 // onFirstTEMessageReceived()
08272 //-----------------------------------------------------------------------------
08273 void LLVOAvatar::onFirstTEMessageReceived()
08274 {
08275         if( !mFirstTEMessageReceived )
08276         {
08277                 mFirstTEMessageReceived = TRUE;
08278 
08279                 BOOL head_baked = ( getTEImage( TEX_HEAD_BAKED )->getID() != IMG_DEFAULT_AVATAR );
08280                 BOOL upper_baked = ( getTEImage( TEX_UPPER_BAKED )->getID() != IMG_DEFAULT_AVATAR );
08281                 BOOL lower_baked = ( getTEImage( TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR );
08282                 BOOL eyes_baked = ( getTEImage( TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR );
08283                 BOOL skirt_baked = ( getTEImage( TEX_SKIRT_BAKED )->getID() != IMG_DEFAULT_AVATAR );
08284 
08285                 // Use any baked textures that we have even if they haven't downloaded yet.
08286                 // (That is, don't do a transition from unbaked to baked.)
08287                 if( head_baked )
08288                 {
08289                         mLastHeadBakedID = getTEImage( TEX_HEAD_BAKED )->getID();
08290                         LLViewerImage* image = getTEImage( TEX_HEAD_BAKED );
08291                         image->setNeedsAux(TRUE);
08292                         image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID )); 
08293                         image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) );
08294                 }
08295 
08296                 if( upper_baked )
08297                 {
08298                         mLastUpperBodyBakedID = getTEImage( TEX_UPPER_BAKED )->getID();
08299                         LLViewerImage* image = getTEImage( TEX_UPPER_BAKED );
08300                         image->setNeedsAux(TRUE);
08301                         image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID )); 
08302                         image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) );
08303                 }
08304                 
08305                 if( lower_baked )
08306                 {
08307                         mLastLowerBodyBakedID = getTEImage( TEX_LOWER_BAKED )->getID();
08308                         LLViewerImage* image = getTEImage( TEX_LOWER_BAKED );
08309                         image->setNeedsAux(TRUE);
08310                         image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, new LLTextureMaskData( mID )); 
08311                         image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) );
08312                 }
08313 
08314                 if( eyes_baked )
08315                 {
08316                         mLastEyesBakedID = getTEImage( TEX_EYES_BAKED )->getID();
08317                         LLViewerImage* image = getTEImage( TEX_EYES_BAKED );
08318                         image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) );
08319                 }
08320 
08321                 if( skirt_baked )
08322                 {
08323                         mLastSkirtBakedID = getTEImage( TEX_SKIRT_BAKED )->getID();
08324                         LLViewerImage* image = getTEImage( TEX_SKIRT_BAKED );
08325                         image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, new LLUUID( mID ) );
08326                 }
08327 
08328                 updateMeshTextures();
08329         }
08330 }
08331 
08332 //-----------------------------------------------------------------------------
08333 // processAvatarAppearance()
08334 //-----------------------------------------------------------------------------
08335 void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
08336 {
08337         LLMemType mt(LLMemType::MTYPE_AVATAR);
08338         
08339 //      llinfos << "processAvatarAppearance start " << mID << llendl;
08340         BOOL is_first_appearance_message = !mFirstAppearanceMessageReceived;
08341 
08342         mFirstAppearanceMessageReceived = TRUE;
08343 
08344         if( mIsSelf )
08345         {
08346                 llwarns << "Received AvatarAppearance for self" << llendl;
08347                 if( mFirstTEMessageReceived )
08348                 {
08349 //                      llinfos << "processAvatarAppearance end  " << mID << llendl;
08350                         return;
08351                 }
08352         }
08353 
08354         if (gNoRender)
08355         {
08356                 return;
08357         }
08358 
08359         ESex old_sex = getSex();
08360 
08361 //      llinfos << "ady LLVOAvatar::processAvatarAppearance()" << llendl;
08362 //      dumpAvatarTEs( "PRE  processAvatarAppearance()" );
08363         unpackTEMessage(mesgsys, _PREHASH_ObjectData);
08364 //      dumpAvatarTEs( "POST processAvatarAppearance()" );
08365 
08366 //      llinfos << "Received AvatarAppearance: " << (mIsSelf ? "(self): " : "(other): " ) << 
08367 //              (( getTEImage( TEX_HEAD_BAKED )->getID() != IMG_DEFAULT_AVATAR )  ? "HEAD " : "head " ) <<
08368 //              (( getTEImage( TEX_UPPER_BAKED )->getID() != IMG_DEFAULT_AVATAR ) ? "UPPER " : "upper " ) <<
08369 //              (( getTEImage( TEX_LOWER_BAKED )->getID() != IMG_DEFAULT_AVATAR ) ? "LOWER " : "lower " ) <<
08370 //              (( getTEImage( TEX_EYES_BAKED )->getID() != IMG_DEFAULT_AVATAR )  ? "EYES" : "eyes" ) << llendl;
08371  
08372         if( !mFirstTEMessageReceived )
08373         {
08374                 onFirstTEMessageReceived();
08375         }
08376 
08377         setCompositeUpdatesEnabled( FALSE );
08378         updateMeshTextures(); // enables updates for laysets without baked textures.
08379 
08380         // parse visual params
08381         S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam);
08382         if( num_blocks > 1 )
08383         {
08384                 BOOL params_changed = FALSE;
08385                 BOOL interp_params = FALSE;
08386                 
08387                 LLVisualParam* param = getFirstVisualParam();
08388                 if (!param)
08389                 {
08390                         llwarns << "No visual params!" << llendl;
08391                 }
08392                 else
08393                 {
08394                         for( S32 i = 0; i < num_blocks; i++ )
08395                         {
08396                                 while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) )
08397                                 {
08398                                         param = getNextVisualParam();
08399                                 }
08400                                                 
08401                                 if( !param )
08402                                 {
08403                                         llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl;
08404                                         return;
08405                                 }
08406 
08407                                 U8 value;
08408                                 mesgsys->getU8Fast(_PREHASH_VisualParam, _PREHASH_ParamValue, value, i);
08409                                 F32 newWeight = U8_to_F32(value, param->getMinWeight(), param->getMaxWeight());
08410 
08411                                 if (is_first_appearance_message || (param->getWeight() != newWeight))
08412                                 {
08413                                         //llinfos << "Received update for param " << param->getDisplayName() << " at value " << newWeight << llendl;
08414                                         params_changed = TRUE;
08415                                         if(is_first_appearance_message)
08416                                         {
08417                                                 param->setWeight(newWeight, FALSE);
08418                                         }
08419                                         else
08420                                         {
08421                                                 interp_params = TRUE;
08422                                                 param->setAnimationTarget(newWeight, FALSE);
08423                                         }
08424                                 }
08425                                 
08426                                 param = getNextVisualParam();
08427                         }
08428                 }
08429 
08430                 while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) )
08431                 {
08432                         param = getNextVisualParam();
08433                 }
08434                 if( param )
08435                 {
08436                         llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl;
08437                         return;
08438                 }
08439 
08440                 if (params_changed)
08441                 {
08442                         if (interp_params)
08443                         {
08444                                 startAppearanceAnimation(FALSE, FALSE);
08445                         }
08446                         updateVisualParams();
08447 
08448                         ESex new_sex = getSex();
08449                         if( old_sex != new_sex )
08450                         {
08451                                 updateSexDependentLayerSets( FALSE );
08452                         }       
08453                 }
08454         }
08455         else
08456         {
08457                 llwarns << "AvatarAppearance msg received without any parameters, object: " << getID() << llendl;
08458         }
08459 
08460         setCompositeUpdatesEnabled( TRUE );
08461 
08462         llassert( getSex() == ((getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE) );
08463 
08464         // If all of the avatars are completely baked, release the global image caches to conserve memory.
08465         LLVOAvatar::cullAvatarsByPixelArea();
08466 
08467 //      llinfos << "processAvatarAppearance end " << mID << llendl;
08468 }
08469 
08470 // static
08471 void LLVOAvatar::getAnimLabels( LLDynamicArray<std::string>* labels )
08472 {
08473         S32 i;
08474         for( i = 0; i < gUserAnimStatesCount; i++ )
08475         {
08476                 labels->put( LLAnimStateLabels::getStateLabel( gUserAnimStates[i].mName ) );
08477         }
08478 
08479         // Special case to trigger away (AFK) state
08480         labels->put( "Away From Keyboard" );
08481 }
08482 
08483 // static 
08484 void LLVOAvatar::getAnimNames( LLDynamicArray<std::string>* names )
08485 {
08486         S32 i;
08487 
08488         for( i = 0; i < gUserAnimStatesCount; i++ )
08489         {
08490                 names->put( std::string(gUserAnimStates[i].mName) );
08491         }
08492 
08493         // Special case to trigger away (AFK) state
08494         names->put( "enter_away_from_keyboard_state" );
08495 }
08496 
08497 void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata )
08498 {
08499         //llinfos << "onBakedTextureMasksLoaded: " << src_vi->getID() << llendl;
08500         LLMemType mt(LLMemType::MTYPE_AVATAR);
08501         
08502         LLUUID id = src_vi->getID();
08503 
08504         if (!userdata)
08505         {
08506                 return;
08507         }
08508  
08509         LLTextureMaskData* maskData = (LLTextureMaskData*) userdata;
08510         LLVOAvatar* self = (LLVOAvatar*) gObjectList.findObject( maskData->mAvatarID );
08511 
08512         // if discard level is 2 less than last discard level we processed, or we hit 0,
08513         // then generate morph masks
08514         if( self && success && (discard_level < maskData->mLastDiscardLevel - 2 || discard_level == 0) )
08515         {
08516                 LLViewerImage* head_baked =             self->getTEImage( TEX_HEAD_BAKED );
08517                 LLViewerImage* upper_baked =    self->getTEImage( TEX_UPPER_BAKED );
08518                 LLViewerImage* lower_baked =    self->getTEImage( TEX_LOWER_BAKED );
08519         
08520                 if( aux_src && aux_src->getComponents() == 1 )
08521                 {
08522                         if (!aux_src->getData())
08523                         {
08524                                 llerrs << "No auxiliary source data for onBakedTextureMasksLoaded" << llendl;
08525                                 return;
08526                         }
08527 
08528                         U32 gl_name;
08529                         glGenTextures(1, (GLuint*) &gl_name );
08530                         stop_glerror();
08531 
08532                         LLImageGL::bindExternalTexture( gl_name, 0, GL_TEXTURE_2D ); 
08533                         stop_glerror();
08534 
08535                         glTexImage2D(
08536                                 GL_TEXTURE_2D, 0, GL_ALPHA8, 
08537                                 aux_src->getWidth(), aux_src->getHeight(),
08538                                 0, GL_ALPHA, GL_UNSIGNED_BYTE, aux_src->getData());
08539                         stop_glerror();
08540 
08541                         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
08542                         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
08543 
08544                         if( id == head_baked->getID() )
08545                         {
08546                                 if (self->mHeadLayerSet)
08547                                 {
08548                                         //llinfos << "onBakedTextureMasksLoaded for head " << id << " discard = " << discard_level << llendl;
08549                                         self->mHeadLayerSet->applyMorphMask(aux_src->getData(), aux_src->getWidth(), aux_src->getHeight(), 1);
08550                                         maskData->mLastDiscardLevel = discard_level;
08551                                         self->mHeadMaskDiscard = discard_level;
08552                                         if (self->mHeadMaskTexName)
08553                                         {
08554                                                 glDeleteTextures(1, (GLuint*) &self->mHeadMaskTexName);
08555                                         }
08556                                         self->mHeadMaskTexName = gl_name;
08557                                 }
08558                                 else
08559                                 {
08560                                         llwarns << "onBakedTextureMasksLoaded: no mHeadLayerSet." << llendl;
08561                                 }
08562                         }
08563                         else
08564                         if( id == upper_baked->getID() )
08565                         {
08566                                 if ( self->mUpperBodyLayerSet)
08567                                 {
08568                                         //llinfos << "onBakedTextureMasksLoaded for upper body " << id << " discard = " << discard_level << llendl;
08569                                         self->mUpperBodyLayerSet->applyMorphMask(aux_src->getData(), aux_src->getWidth(), aux_src->getHeight(), 1);
08570                                         maskData->mLastDiscardLevel = discard_level;
08571                                         self->mUpperMaskDiscard = discard_level;
08572                                         if (self->mUpperMaskTexName)
08573                                         {
08574                                                 glDeleteTextures(1, (GLuint*) &self->mUpperMaskTexName);
08575                                         }
08576                                         self->mUpperMaskTexName = gl_name;
08577                                 }
08578                                 else
08579                                 {
08580                                         llwarns << "onBakedTextureMasksLoaded: no mHeadLayerSet." << llendl;
08581                                 }
08582                         }
08583                         else
08584                         if( id == lower_baked->getID() )
08585                         {
08586                                 if ( self->mLowerBodyLayerSet )
08587                                 {
08588                                         //llinfos << "onBakedTextureMasksLoaded for lower body " << id << " discard = " << discard_level << llendl;
08589                                         self->mLowerBodyLayerSet->applyMorphMask(aux_src->getData(), aux_src->getWidth(), aux_src->getHeight(), 1);
08590                                         maskData->mLastDiscardLevel = discard_level;
08591                                         self->mLowerMaskDiscard = discard_level;
08592                                         if (self->mLowerMaskTexName)
08593                                         {
08594                                                 glDeleteTextures(1, (GLuint*) &self->mLowerMaskTexName);
08595                                         }
08596                                         self->mLowerMaskTexName = gl_name;
08597                                 }
08598                                 else
08599                                 {
08600                                         llwarns << "onBakedTextureMasksLoaded: no mHeadLayerSet." << llendl;
08601                                 }
08602                         }
08603                         else
08604                         {
08605                                 llinfos << "onBakedTextureMasksLoaded(): unexpected image id: " << id << llendl;
08606                         }
08607 
08608                         self->dirtyMesh();
08609                 }
08610                 else
08611                 {
08612             // this can happen when someone uses an old baked texture possibly provided by 
08613             // viewer-side baked texture caching
08614                         llwarns << "Masks loaded callback but NO aux source!" << llendl;
08615                 }
08616         }
08617 
08618         if (final || !success)
08619         {
08620                 delete maskData;
08621         }
08622 
08623 }
08624 
08625 // static
08626 void LLVOAvatar::onInitialBakedTextureLoaded( BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata )
08627 {
08628         LLUUID *avatar_idp = (LLUUID *)userdata;
08629         LLVOAvatar *selfp = (LLVOAvatar *)gObjectList.findObject(*avatar_idp);
08630 
08631         if (!success && selfp)
08632         {
08633                 selfp->removeMissingBakedTextures();
08634         }
08635         if (final || !success )
08636         {
08637                 delete avatar_idp;
08638         }
08639 }
08640 
08641 void LLVOAvatar::onBakedTextureLoaded(BOOL success, LLViewerImage *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata)
08642 {
08643         //llinfos << "onBakedTextureLoaded: " << src_vi->getID() << llendl;
08644 
08645         LLUUID id = src_vi->getID();
08646         LLUUID *avatar_idp = (LLUUID *)userdata;
08647         LLVOAvatar *selfp = (LLVOAvatar *)gObjectList.findObject(*avatar_idp);
08648 
08649         if (selfp && !success)
08650         {
08651                 selfp->removeMissingBakedTextures();
08652         }
08653 
08654         if( final || !success )
08655         {
08656                 delete avatar_idp;
08657         }
08658 
08659         if( selfp && success && final )
08660         {
08661                 selfp->useBakedTexture( id );
08662         }
08663 }
08664 
08665 
08666 // Called when baked texture is loaded and also when we start up with a baked texture
08667 void LLVOAvatar::useBakedTexture( const LLUUID& id )
08668 {
08669 //      llinfos << "useBakedTexture" << llendl;
08670         LLViewerImage* head_baked =             getTEImage( TEX_HEAD_BAKED );
08671         LLViewerImage* upper_baked =    getTEImage( TEX_UPPER_BAKED );
08672         LLViewerImage* lower_baked =    getTEImage( TEX_LOWER_BAKED );
08673         LLViewerImage* eyes_baked =             getTEImage( TEX_EYES_BAKED );
08674         LLViewerImage* skirt_baked =    getTEImage( TEX_SKIRT_BAKED );
08675 
08676         if( id == head_baked->getID() )
08677         {
08678                 mHeadBakedLoaded = TRUE;
08679                 
08680                 mLastHeadBakedID = id;
08681                 mHeadMesh0.setTexture( head_baked );
08682                 mHeadMesh1.setTexture( head_baked );
08683                 mHeadMesh2.setTexture( head_baked );
08684                 mHeadMesh3.setTexture( head_baked );
08685                 mHeadMesh4.setTexture( head_baked );
08686                 mEyeLashMesh0.setTexture( head_baked );
08687                 if( mHeadLayerSet )
08688                 {
08689                         mHeadLayerSet->destroyComposite();
08690                 }
08691                 setLocalTexture( LOCTEX_HEAD_BODYPAINT,         getTEImage( TEX_HEAD_BODYPAINT ),       TRUE );
08692         }
08693         else
08694         if( id == upper_baked->getID() )
08695         {
08696                 mUpperBakedLoaded = TRUE;
08697 
08698                 mLastUpperBodyBakedID = id;
08699                 mUpperBodyMesh0.setTexture( upper_baked );
08700                 mUpperBodyMesh1.setTexture( upper_baked );
08701                 mUpperBodyMesh2.setTexture( upper_baked );
08702                 mUpperBodyMesh3.setTexture( upper_baked );
08703                 mUpperBodyMesh4.setTexture( upper_baked );
08704                 if( mUpperBodyLayerSet )
08705                 {
08706                         mUpperBodyLayerSet->destroyComposite();
08707                 }
08708 
08709                 setLocalTexture( LOCTEX_UPPER_SHIRT,            getTEImage( TEX_UPPER_SHIRT ),          TRUE );
08710                 setLocalTexture( LOCTEX_UPPER_BODYPAINT,        getTEImage( TEX_UPPER_BODYPAINT ),      TRUE );
08711                 setLocalTexture( LOCTEX_UPPER_JACKET,           getTEImage( TEX_UPPER_JACKET ),         TRUE );
08712                 setLocalTexture( LOCTEX_UPPER_GLOVES,           getTEImage( TEX_UPPER_GLOVES ),         TRUE );
08713                 setLocalTexture( LOCTEX_UPPER_UNDERSHIRT,       getTEImage( TEX_UPPER_UNDERSHIRT ),     TRUE );
08714         }
08715         else
08716         if( id == lower_baked->getID() )
08717         {
08718                 mLowerBakedLoaded = TRUE;
08719 
08720                 mLastLowerBodyBakedID = id;
08721                 mLowerBodyMesh0.setTexture( lower_baked );
08722                 mLowerBodyMesh1.setTexture( lower_baked );
08723                 mLowerBodyMesh2.setTexture( lower_baked );
08724                 mLowerBodyMesh3.setTexture( lower_baked );
08725                 mLowerBodyMesh4.setTexture( lower_baked );
08726                 if( mLowerBodyLayerSet )
08727                 {
08728                         mLowerBodyLayerSet->destroyComposite();
08729                 }
08730 
08731                 setLocalTexture( LOCTEX_LOWER_PANTS,            getTEImage( TEX_LOWER_PANTS ),          TRUE );
08732                 setLocalTexture( LOCTEX_LOWER_BODYPAINT,        getTEImage( TEX_LOWER_BODYPAINT ),      TRUE );
08733                 setLocalTexture( LOCTEX_LOWER_SHOES,            getTEImage( TEX_LOWER_SHOES ),          TRUE );
08734                 setLocalTexture( LOCTEX_LOWER_SOCKS,            getTEImage( TEX_LOWER_SOCKS ),          TRUE );
08735                 setLocalTexture( LOCTEX_LOWER_JACKET,           getTEImage( TEX_LOWER_JACKET ),         TRUE );
08736                 setLocalTexture( LOCTEX_LOWER_UNDERPANTS,       getTEImage( TEX_LOWER_UNDERPANTS ),     TRUE );
08737         }
08738         else
08739         if( id == eyes_baked->getID() )
08740         {
08741                 mEyesBakedLoaded = TRUE;
08742 
08743                 mLastEyesBakedID = id;
08744                 mEyeBallLeftMesh0.setTexture(  eyes_baked );
08745                 mEyeBallLeftMesh1.setTexture(  eyes_baked );
08746                 mEyeBallRightMesh0.setTexture( eyes_baked );
08747                 mEyeBallRightMesh1.setTexture( eyes_baked );
08748                 if( mEyesLayerSet )
08749                 {
08750                         mEyesLayerSet->destroyComposite();
08751                 }
08752 
08753                 setLocalTexture( LOCTEX_EYES_IRIS,                      getTEImage( TEX_EYES_IRIS ), TRUE );
08754         }
08755         else
08756         if( id == skirt_baked->getID() )
08757         {
08758                 mSkirtBakedLoaded = TRUE;
08759 
08760                 mLastSkirtBakedID = id;
08761                 mSkirtMesh0.setTexture( skirt_baked );
08762                 mSkirtMesh1.setTexture( skirt_baked );
08763                 mSkirtMesh2.setTexture( skirt_baked );
08764                 mSkirtMesh3.setTexture( skirt_baked );
08765                 mSkirtMesh4.setTexture( skirt_baked );
08766                 if( mSkirtLayerSet )
08767                 {
08768                         mSkirtLayerSet->destroyComposite();
08769                 }
08770 
08771                 setLocalTexture( LOCTEX_SKIRT,                          getTEImage( TEX_SKIRT ), TRUE );
08772         }
08773 
08774         dirtyMesh();
08775 }
08776 
08777 // static
08778 void LLVOAvatar::dumpArchetypeXML( void* )
08779 {
08780         LLVOAvatar* avatar = gAgent.getAvatarObject();
08781         apr_file_t* file = ll_apr_file_open(gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,"new archetype.xml"), LL_APR_WB );
08782         if( !file )
08783         {
08784                 return;
08785         }
08786 
08787         apr_file_printf( file, "<?xml version=\"1.0\" encoding=\"US-ASCII\" standalone=\"yes\"?>\n" );
08788         apr_file_printf( file, "<linden_genepool version=\"1.0\">\n" );
08789         apr_file_printf( file, "\n\t<archetype name=\"???\">\n" );
08790 
08791         // only body parts, not clothing.
08792         for( S32 type = WT_SHAPE; type <= WT_EYES; type++ )
08793         {
08794                 const char* wearable_name = LLWearable::typeToTypeName( (EWearableType) type );
08795                 apr_file_printf( file, "\n\t\t<!-- wearable: %s -->\n", wearable_name );
08796 
08797                 for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
08798                 {
08799                         LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param;
08800                         if( (viewer_param->getWearableType() == type) && 
08801                                 (viewer_param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) )
08802                         {
08803                                 apr_file_printf( file, "\t\t<param id=\"%d\" name=\"%s\" value=\"%.3f\"/>\n",
08804                                                  viewer_param->getID(), viewer_param->getName().c_str(), viewer_param->getWeight() );
08805                         }
08806                 }
08807 
08808                 for( S32 te = 0; te < TEX_NUM_ENTRIES; te++ )
08809                 {
08810                         if( LLVOAvatar::getTEWearableType( te ) == type )
08811                         {
08812                                 LLViewerImage* te_image = avatar->getTEImage( te );
08813                                 if( te_image )
08814                                 {
08815                                         char uuid_str[UUID_STR_LENGTH];         /* Flawfinder: ignore */
08816                                         te_image->getID().toString( uuid_str );
08817                                         apr_file_printf( file, "\t\t<texture te=\"%i\" uuid=\"%s\"/>\n", te, uuid_str);
08818                                 }
08819                         }
08820                 }
08821         }
08822         apr_file_printf( file, "\t</archetype>\n" );
08823         apr_file_printf( file, "\n</linden_genepool>\n" );
08824         apr_file_close( file );
08825 }
08826 
08827 
08828 // Assumes LLVOAvatar::sInstances has already been sorted.
08829 S32 LLVOAvatar::getUnbakedPixelAreaRank()
08830 {
08831         S32 rank = 1;
08832         for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
08833                 iter != LLCharacter::sInstances.end(); ++iter)
08834         {
08835                 LLVOAvatar* inst = (LLVOAvatar*) *iter;
08836                 if( inst == this )
08837                 {
08838                         return rank;
08839                 }
08840                 else
08841                 if( !inst->isDead() && !inst->isFullyBaked() )
08842                 {
08843                         rank++;
08844                 }
08845         }
08846 
08847         llassert(0);
08848         return 0;
08849 }
08850 
08851 // static
08852 void LLVOAvatar::cullAvatarsByPixelArea()
08853 {
08854         std::sort(LLCharacter::sInstances.begin(), LLCharacter::sInstances.end(), CompareScreenAreaGreater());
08855         
08856         // Update the avatars that have changed status
08857         S32 rank = 1;
08858 
08859         for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
08860                 iter != LLCharacter::sInstances.end(); ++iter)
08861         {
08862                 LLVOAvatar* inst = (LLVOAvatar*) *iter;
08863                 BOOL culled;
08864                 if( inst->isDead() )
08865                 {
08866                         culled = TRUE;
08867                 }
08868                 else if( inst->isSelf() || inst->isFullyBaked() )
08869                 {
08870                         culled = FALSE;
08871                 }
08872                 else
08873                 {
08874                         culled = (rank > LLVOAvatar::sMaxOtherAvatarsToComposite) || (inst->mPixelArea < MIN_PIXEL_AREA_FOR_COMPOSITE);
08875                         rank++;
08876                 }
08877 
08878                 if( inst->mCulled != culled )
08879                 {
08880                         inst->mCulled = culled;
08881 
08882                         lldebugs << "avatar " << inst->getID() << (culled ? " start culled" : " start not culled" ) << llendl;
08883 
08884                         inst->updateMeshTextures();
08885                 }
08886         }
08887 
08888         if( LLVOAvatar::areAllNearbyInstancesBaked() )
08889         {
08890                 LLVOAvatar::deleteCachedImages();
08891         }
08892 }
08893 
08894 const LLUUID& LLVOAvatar::grabLocalTexture(ETextureIndex index)
08895 {
08896         if (canGrabLocalTexture(index))
08897         {
08898                 return getTEImage( index )->getID();
08899         }
08900         return LLUUID::null;
08901 }
08902 
08903 BOOL LLVOAvatar::canGrabLocalTexture(ETextureIndex index)
08904 {
08905         // Check if the texture hasn't been baked yet.
08906         if ( getTEImage( index )->getID() == IMG_DEFAULT_AVATAR )
08907         {
08908                 lldebugs << "getTEImage( " << (U32) index << " )->getID() == IMG_DEFAULT_AVATAR" << llendl;
08909                 return FALSE;
08910         }
08911 
08912         // Check permissions of textures that show up in the
08913         // baked texture.  We don't want people copying people's
08914         // work via baked textures.
08915         std::vector<ETextureIndex> textures;
08916         switch (index)
08917         {
08918         case TEX_EYES_BAKED:
08919                 textures.push_back(TEX_EYES_IRIS);
08920                 break;
08921         case TEX_HEAD_BAKED:
08922                 textures.push_back(TEX_HEAD_BODYPAINT);
08923                 break;
08924         case TEX_UPPER_BAKED:
08925                 textures.push_back(TEX_UPPER_BODYPAINT);
08926                 textures.push_back(TEX_UPPER_UNDERSHIRT);
08927                 textures.push_back(TEX_UPPER_SHIRT);
08928                 textures.push_back(TEX_UPPER_JACKET);
08929                 textures.push_back(TEX_UPPER_GLOVES);
08930                 break;
08931         case TEX_LOWER_BAKED:
08932                 textures.push_back(TEX_LOWER_BODYPAINT);
08933                 textures.push_back(TEX_LOWER_UNDERPANTS);
08934                 textures.push_back(TEX_LOWER_PANTS);
08935                 textures.push_back(TEX_LOWER_JACKET);
08936                 textures.push_back(TEX_LOWER_SOCKS);
08937                 textures.push_back(TEX_LOWER_SHOES);
08938                 break;
08939         case TEX_SKIRT_BAKED:
08940                 textures.push_back(TEX_SKIRT);
08941                 break;
08942         default:
08943                 return FALSE;
08944                 break;
08945         }
08946 
08947         std::vector<ETextureIndex>::iterator iter = textures.begin();
08948         std::vector<ETextureIndex>::iterator end  = textures.end();
08949         for (; iter != end; ++iter)
08950         {
08951                 ETextureIndex t_index = (*iter);
08952                 lldebugs << "Checking index " << (U32) t_index << llendl;
08953                 const LLUUID& texture_id = getTEImage( t_index )->getID();
08954                 if (texture_id != IMG_DEFAULT_AVATAR)
08955                 {
08956                         // Search inventory for this texture.
08957                         LLViewerInventoryCategory::cat_array_t cats;
08958                         LLViewerInventoryItem::item_array_t items;
08959                         LLAssetIDMatches asset_id_matches(texture_id);
08960                         gInventory.collectDescendentsIf(LLUUID::null,
08961                                                                         cats,
08962                                                                         items,
08963                                                                         LLInventoryModel::INCLUDE_TRASH,
08964                                                                         asset_id_matches);
08965 
08966                         BOOL can_grab = FALSE;
08967                         lldebugs << "item count for asset " << texture_id << ": " << items.count() << llendl;
08968                         if (items.count())
08969                         {
08970                                 // search for full permissions version
08971                                 for (S32 i = 0; i < items.count(); i++)
08972                                 {
08973                                         LLInventoryItem* itemp = items[i];
08974                                         LLPermissions item_permissions = itemp->getPermissions();
08975                                         if ( item_permissions.allowOperationBy(
08976                                                                 PERM_MODIFY, gAgent.getID(), gAgent.getGroupID()) &&
08977                                                  item_permissions.allowOperationBy(
08978                                                                 PERM_COPY, gAgent.getID(), gAgent.getGroupID()) &&
08979                                                  item_permissions.allowOperationBy(
08980                                                                 PERM_TRANSFER, gAgent.getID(), gAgent.getGroupID()) )
08981                                         {
08982                                                 can_grab = TRUE;
08983                                                 break;
08984                                         }
08985                                 }
08986                         }
08987                         if (!can_grab) return FALSE;
08988                 }
08989         }
08990 
08991         return TRUE;
08992 }
08993 
08994 void LLVOAvatar::dumpLocalTextures()
08995 {
08996         llinfos << "Local Textures:" << llendl;
08997 
08998         char* names[] = {
08999                 "Shirt     ",
09000                 "UpperTatoo",
09001                 "Pants     ",
09002                 "LowerTatoo",
09003                 "Head Tatoo",
09004                 "Shoes     ",
09005                 "Socks     ",
09006                 "Upper Jckt",
09007                 "Lower Jckt",
09008                 "Gloves    ",
09009                 "Undershirt",
09010                 "Underpants",
09011                 "Iris      ",
09012                 "Skirt      "};
09013 
09014         ETextureIndex baked_equiv[] = {
09015                 TEX_UPPER_BAKED,
09016                 TEX_UPPER_BAKED,
09017                 TEX_LOWER_BAKED,
09018                 TEX_LOWER_BAKED,
09019                 TEX_HEAD_BAKED,
09020                 TEX_LOWER_BAKED,
09021                 TEX_LOWER_BAKED,
09022                 TEX_UPPER_BAKED,
09023                 TEX_LOWER_BAKED,
09024                 TEX_UPPER_BAKED,
09025                 TEX_UPPER_BAKED,
09026                 TEX_LOWER_BAKED,
09027                 TEX_EYES_BAKED,
09028                 TEX_SKIRT_BAKED };
09029 
09030 
09031         for( S32 i = 0; i < LOCTEX_NUM_ENTRIES; i++ )
09032         {
09033                 if( getTEImage( baked_equiv[i] )->getID() != IMG_DEFAULT_AVATAR )
09034                 {
09035 #if LL_RELEASE_FOR_DOWNLOAD
09036                         // End users don't get to trivially see avatar texture IDs, makes textures
09037                         // easier to steal. JC
09038                         llinfos << "LocTex " << names[i] << ": Baked " << llendl;
09039 #else
09040                         llinfos << "LocTex " << names[i] << ": Baked " << getTEImage( baked_equiv[i] )->getID() << llendl;
09041 #endif
09042                 }
09043                 else if (mLocalTexture[i].notNull())
09044                 {
09045                         if( mLocalTexture[i]->getID() == IMG_DEFAULT_AVATAR )
09046                         {
09047                                 llinfos << "LocTex " << names[i] << ": None" << llendl;
09048                         }
09049                         else
09050                         {
09051                                 LLViewerImage* image = mLocalTexture[i];
09052 
09053                                 llinfos << "LocTex " << names[i] << ": "
09054                                                 << "Discard " << image->getDiscardLevel() << ", "
09055                                                 << "(" << image->getWidth() << ", " << image->getHeight() << ") " 
09056 #if !LL_RELEASE_FOR_DOWNLOAD
09057                                         // End users don't get to trivially see avatar texture IDs,
09058                                         // makes textures easier to steal
09059                                                 << image->getID() << " "
09060 #endif
09061                                                 << "Priority: " << image->getDecodePriority()
09062                                                 << llendl;
09063                         }
09064                 }
09065                 else
09066                 {
09067                         llinfos << "LocTex " << names[i] << ": No LLViewerImage" << llendl;
09068                 }
09069         }
09070 }
09071 
09072 void LLVOAvatar::startAppearanceAnimation(BOOL set_by_user, BOOL play_sound)
09073 {
09074         if(!mAppearanceAnimating)
09075         {
09076                 mAppearanceAnimSetByUser = set_by_user;
09077                 mAppearanceAnimating = TRUE;
09078                 mAppearanceMorphTimer.reset();
09079                 mLastAppearanceBlendTime = 0.f;
09080         }
09081 }
09082 
09083 
09084 void LLVOAvatar::removeMissingBakedTextures()
09085 {       
09086         if (!mIsSelf)
09087         {
09088                 return;
09089         }
09090         BOOL removed = FALSE;
09091 
09092         for( S32 i = 0; i < BAKED_TEXTURE_COUNT; i++ )
09093         {
09094                 S32 te = sBakedTextureIndices[i];
09095 
09096                 if( getTEImage( te )->isMissingAsset() )
09097                 {
09098                         setTEImage( te, gImageList.getImage(IMG_DEFAULT_AVATAR) );
09099                         removed = TRUE;
09100                 }
09101         }
09102 
09103         if( removed )
09104         {
09105                 invalidateComposite( mEyesLayerSet,                     FALSE );
09106                 invalidateComposite( mHeadLayerSet,                     FALSE );
09107                 invalidateComposite( mUpperBodyLayerSet,        FALSE );
09108                 invalidateComposite( mLowerBodyLayerSet,        FALSE );
09109                 invalidateComposite( mSkirtLayerSet,            FALSE );
09110                 updateMeshTextures();
09111                 requestLayerSetUploads();
09112         }
09113 }
09114 
09115 
09116 //-----------------------------------------------------------------------------
09117 // LLVOAvatarInfo
09118 //-----------------------------------------------------------------------------
09119 
09120 LLVOAvatarInfo::LLVOAvatarInfo()
09121         : mTexSkinColorInfo(0), mTexHairColorInfo(0), mTexEyeColorInfo(0)
09122 {
09123 }
09124 
09125 LLVOAvatarInfo::~LLVOAvatarInfo()
09126 {
09127         std::for_each(mMeshInfoList.begin(), mMeshInfoList.end(), DeletePointer());
09128         std::for_each(mSkeletalDistortionInfoList.begin(), mSkeletalDistortionInfoList.end(), DeletePointer());         
09129         std::for_each(mAttachmentInfoList.begin(), mAttachmentInfoList.end(), DeletePointer());
09130         delete mTexSkinColorInfo;
09131         delete mTexHairColorInfo;
09132         delete mTexEyeColorInfo;
09133         std::for_each(mLayerInfoList.begin(), mLayerInfoList.end(), DeletePointer());           
09134         std::for_each(mDriverInfoList.begin(), mDriverInfoList.end(), DeletePointer());         
09135 }
09136 
09137 //-----------------------------------------------------------------------------
09138 // LLVOAvatarBoneInfo::parseXml()
09139 //-----------------------------------------------------------------------------
09140 BOOL LLVOAvatarBoneInfo::parseXml(LLXmlTreeNode* node)
09141 {
09142         if (node->hasName("bone"))
09143         {
09144                 mIsJoint = TRUE;
09145                 static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
09146                 if (!node->getFastAttributeString(name_string, mName))
09147                 {
09148                         llwarns << "Bone without name" << llendl;
09149                         return FALSE;
09150                 }
09151         }
09152         else if (node->hasName("collision_volume"))
09153         {
09154                 mIsJoint = FALSE;
09155                 static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
09156                 if (!node->getFastAttributeString(name_string, mName))
09157                 {
09158                         mName = "Collision Volume";
09159                 }
09160         }
09161         else
09162         {
09163                 llwarns << "Invalid node " << node->getName() << llendl;
09164                 return FALSE;
09165         }
09166 
09167         static LLStdStringHandle pos_string = LLXmlTree::addAttributeString("pos");
09168         if (!node->getFastAttributeVector3(pos_string, mPos))
09169         {
09170                 llwarns << "Bone without position" << llendl;
09171                 return FALSE;
09172         }
09173 
09174         static LLStdStringHandle rot_string = LLXmlTree::addAttributeString("rot");
09175         if (!node->getFastAttributeVector3(rot_string, mRot))
09176         {
09177                 llwarns << "Bone without rotation" << llendl;
09178                 return FALSE;
09179         }
09180         
09181         static LLStdStringHandle scale_string = LLXmlTree::addAttributeString("scale");
09182         if (!node->getFastAttributeVector3(scale_string, mScale))
09183         {
09184                 llwarns << "Bone without scale" << llendl;
09185                 return FALSE;
09186         }
09187 
09188         if (mIsJoint)
09189         {
09190                 static LLStdStringHandle pivot_string = LLXmlTree::addAttributeString("pivot");
09191                 if (!node->getFastAttributeVector3(pivot_string, mPivot))
09192                 {
09193                         llwarns << "Bone without pivot" << llendl;
09194                         return FALSE;
09195                 }
09196         }
09197 
09198         // parse children
09199         LLXmlTreeNode* child;
09200         for( child = node->getFirstChild(); child; child = node->getNextChild() )
09201         {
09202                 LLVOAvatarBoneInfo *child_info = new LLVOAvatarBoneInfo;
09203                 if (!child_info->parseXml(child))
09204                 {
09205                         delete child_info;
09206                         return FALSE;
09207                 }
09208                 mChildList.push_back(child_info);
09209         }
09210         return TRUE;
09211 }
09212 
09213 //-----------------------------------------------------------------------------
09214 // LLVOAvatarSkeletonInfo::parseXml()
09215 //-----------------------------------------------------------------------------
09216 BOOL LLVOAvatarSkeletonInfo::parseXml(LLXmlTreeNode* node)
09217 {
09218         static LLStdStringHandle num_bones_string = LLXmlTree::addAttributeString("num_bones");
09219         if (!node->getFastAttributeS32(num_bones_string, mNumBones))
09220         {
09221                 llwarns << "Couldn't find number of bones." << llendl;
09222                 return FALSE;
09223         }
09224 
09225         static LLStdStringHandle num_collision_volumes_string = LLXmlTree::addAttributeString("num_collision_volumes");
09226         node->getFastAttributeS32(num_collision_volumes_string, mNumCollisionVolumes);
09227 
09228         LLXmlTreeNode* child;
09229         for( child = node->getFirstChild(); child; child = node->getNextChild() )
09230         {
09231                 LLVOAvatarBoneInfo *info = new LLVOAvatarBoneInfo;
09232                 if (!info->parseXml(child))
09233                 {
09234                         delete info;
09235                         llwarns << "Error parsing bone in skeleton file" << llendl;
09236                         return FALSE;
09237                 }
09238                 mBoneInfoList.push_back(info);
09239         }
09240         return TRUE;
09241 }
09242 
09243 //-----------------------------------------------------------------------------
09244 // parseXmlSkeletonNode(): parses <skeleton> nodes from XML tree
09245 //-----------------------------------------------------------------------------
09246 BOOL LLVOAvatarInfo::parseXmlSkeletonNode(LLXmlTreeNode* root)
09247 {
09248         LLXmlTreeNode* node = root->getChildByName( "skeleton" );
09249         if( !node )
09250         {
09251                 llwarns << "avatar file: missing <skeleton>" << llendl;
09252                 return FALSE;
09253         }
09254 
09255         LLXmlTreeNode* child;
09256 
09257         // SKELETON DISTORTIONS
09258         for (child = node->getChildByName( "param" );
09259                  child;
09260                  child = node->getNextNamedChild())
09261         {
09262                 if (!child->getChildByName("param_skeleton"))
09263                 {
09264                         if (child->getChildByName("param_morph"))
09265                         {
09266                                 llwarns << "Can't specify morph param in skeleton definition." << llendl;
09267                         }
09268                         else
09269                         {
09270                                 llwarns << "Unknown param type." << llendl;
09271                         }
09272                         continue;
09273                 }
09274                 
09275                 LLPolySkeletalDistortionInfo *info = new LLPolySkeletalDistortionInfo;
09276                 if (!info->parseXml(child))
09277                 {
09278                         delete info;
09279                         return FALSE;
09280                 }
09281 
09282                 mSkeletalDistortionInfoList.push_back(info);
09283         }
09284 
09285         // ATTACHMENT POINTS
09286         for (child = node->getChildByName( "attachment_point" );
09287                  child;
09288                  child = node->getNextNamedChild())
09289         {
09290                 LLVOAvatarAttachmentInfo* info = new LLVOAvatarAttachmentInfo();
09291 
09292                 static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
09293                 if (!child->getFastAttributeString(name_string, info->mName))
09294                 {
09295                         llwarns << "No name supplied for attachment point." << llendl;
09296                         delete info;
09297                         continue;
09298                 }
09299 
09300                 static LLStdStringHandle joint_string = LLXmlTree::addAttributeString("joint");
09301                 if (!child->getFastAttributeString(joint_string, info->mJointName))
09302                 {
09303                         llwarns << "No bone declared in attachment point " << info->mName << llendl;
09304                         delete info;
09305                         continue;
09306                 }
09307 
09308                 static LLStdStringHandle position_string = LLXmlTree::addAttributeString("position");
09309                 if (child->getFastAttributeVector3(position_string, info->mPosition))
09310                 {
09311                         info->mHasPosition = TRUE;
09312                 }
09313 
09314                 static LLStdStringHandle rotation_string = LLXmlTree::addAttributeString("rotation");
09315                 if (child->getFastAttributeVector3(rotation_string, info->mRotationEuler))
09316                 {
09317                         info->mHasRotation = TRUE;
09318                 }
09319                  static LLStdStringHandle group_string = LLXmlTree::addAttributeString("group");
09320                 if (child->getFastAttributeS32(group_string, info->mGroup))
09321                 {
09322                         if (info->mGroup == -1)
09323                                 info->mGroup = -1111; // -1 = none parsed, < -1 = bad value
09324                 }
09325 
09326                 static LLStdStringHandle id_string = LLXmlTree::addAttributeString("id");
09327                 if (!child->getFastAttributeS32(id_string, info->mAttachmentID))
09328                 {
09329                         llwarns << "No id supplied for attachment point " << info->mName << llendl;
09330                         delete info;
09331                         continue;
09332                 }
09333 
09334                 static LLStdStringHandle slot_string = LLXmlTree::addAttributeString("pie_slice");
09335                 child->getFastAttributeS32(slot_string, info->mPieMenuSlice);
09336                         
09337                 static LLStdStringHandle visible_in_first_person_string = LLXmlTree::addAttributeString("visible_in_first_person");
09338                 child->getFastAttributeBOOL(visible_in_first_person_string, info->mVisibleFirstPerson);
09339 
09340                 static LLStdStringHandle hud_attachment_string = LLXmlTree::addAttributeString("hud");
09341                 child->getFastAttributeBOOL(hud_attachment_string, info->mIsHUDAttachment);
09342 
09343                 mAttachmentInfoList.push_back(info);
09344         }
09345 
09346         return TRUE;
09347 }
09348 
09349 //-----------------------------------------------------------------------------
09350 // parseXmlMeshNodes(): parses <mesh> nodes from XML tree
09351 //-----------------------------------------------------------------------------
09352 BOOL LLVOAvatarInfo::parseXmlMeshNodes(LLXmlTreeNode* root)
09353 {
09354         for (LLXmlTreeNode* node = root->getChildByName( "mesh" );
09355                  node;
09356                  node = root->getNextNamedChild())
09357         {
09358                 LLVOAvatarMeshInfo *info = new LLVOAvatarMeshInfo;
09359 
09360                 // attribute: type
09361                 static LLStdStringHandle type_string = LLXmlTree::addAttributeString("type");
09362                 if( !node->getFastAttributeString( type_string, info->mType ) )
09363                 {
09364                         llwarns << "Avatar file: <mesh> is missing type attribute.  Ignoring element. " << llendl;
09365                         delete info;
09366                         return FALSE;  // Ignore this element
09367                 }
09368                 
09369                 static LLStdStringHandle lod_string = LLXmlTree::addAttributeString("lod");
09370                 if (!node->getFastAttributeS32( lod_string, info->mLOD ))
09371                 {
09372                         llwarns << "Avatar file: <mesh> is missing lod attribute.  Ignoring element. " << llendl;
09373                         delete info;
09374                         return FALSE;  // Ignore this element
09375                 }
09376 
09377                 static LLStdStringHandle file_name_string = LLXmlTree::addAttributeString("file_name");
09378                 if( !node->getFastAttributeString( file_name_string, info->mMeshFileName ) )
09379                 {
09380                         llwarns << "Avatar file: <mesh> is missing file_name attribute.  Ignoring: " << info->mType << llendl;
09381                         delete info;
09382                         return FALSE;  // Ignore this element
09383                 }
09384 
09385                 static LLStdStringHandle reference_string = LLXmlTree::addAttributeString("reference");
09386                 node->getFastAttributeString( reference_string, info->mReferenceMeshName );
09387                 
09388                 // attribute: min_pixel_area
09389                 static LLStdStringHandle min_pixel_area_string = LLXmlTree::addAttributeString("min_pixel_area");
09390                 static LLStdStringHandle min_pixel_width_string = LLXmlTree::addAttributeString("min_pixel_width");
09391                 if (!node->getFastAttributeF32( min_pixel_area_string, info->mMinPixelArea ))
09392                 {
09393                         F32 min_pixel_area = 0.1f;
09394                         if (node->getFastAttributeF32( min_pixel_width_string, min_pixel_area ))
09395                         {
09396                                 // this is square root of pixel area (sensible to use linear space in defining lods)
09397                                 min_pixel_area = min_pixel_area * min_pixel_area;
09398                         }
09399                         info->mMinPixelArea = min_pixel_area;
09400                 }
09401                 
09402                 // Parse visual params for this node only if we haven't already
09403                 for (LLXmlTreeNode* child = node->getChildByName( "param" );
09404                          child;
09405                          child = node->getNextNamedChild())
09406                 {
09407                         if (!child->getChildByName("param_morph"))
09408                         {
09409                                 if (child->getChildByName("param_skeleton"))
09410                                 {
09411                                         llwarns << "Can't specify skeleton param in a mesh definition." << llendl;
09412                                 }
09413                                 else
09414                                 {
09415                                         llwarns << "Unknown param type." << llendl;
09416                                 }
09417                                 continue;
09418                         }
09419 
09420                         LLPolyMorphTargetInfo *morphinfo = new LLPolyMorphTargetInfo();
09421                         if (!morphinfo->parseXml(child))
09422                         {
09423                                 delete morphinfo;
09424                                 delete info;
09425                                 return -1;
09426                         }
09427                         BOOL shared = FALSE;
09428                         static LLStdStringHandle shared_string = LLXmlTree::addAttributeString("shared");
09429                         child->getFastAttributeBOOL(shared_string, shared);
09430 
09431                         info->mPolyMorphTargetInfoList.push_back(LLVOAvatarMeshInfo::morph_info_pair_t(morphinfo, shared));
09432                 }
09433 
09434                 mMeshInfoList.push_back(info);
09435         }
09436         return TRUE;
09437 }
09438 
09439 //-----------------------------------------------------------------------------
09440 // parseXmlColorNodes(): parses <global_color> nodes from XML tree
09441 //-----------------------------------------------------------------------------
09442 BOOL LLVOAvatarInfo::parseXmlColorNodes(LLXmlTreeNode* root)
09443 {
09444         for (LLXmlTreeNode* color_node = root->getChildByName( "global_color" );
09445                  color_node;
09446                  color_node = root->getNextNamedChild())
09447         {
09448                 LLString global_color_name;
09449                 static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
09450                 if (color_node->getFastAttributeString( name_string, global_color_name ) )
09451                 {
09452                         if( global_color_name == "skin_color" )
09453                         {
09454                                 if (mTexSkinColorInfo)
09455                                 {
09456                                         llwarns << "avatar file: multiple instances of skin_color" << llendl;
09457                                         return FALSE;
09458                                 }
09459                                 mTexSkinColorInfo = new LLTexGlobalColorInfo;
09460                                 if( !mTexSkinColorInfo->parseXml( color_node ) )
09461                                 {
09462                                         delete mTexSkinColorInfo; mTexSkinColorInfo = 0;
09463                                         llwarns << "avatar file: mTexSkinColor->parseXml() failed" << llendl;
09464                                         return FALSE;
09465                                 }
09466                         }
09467                         else if( global_color_name == "hair_color" )
09468                         {
09469                                 if (mTexHairColorInfo)
09470                                 {
09471                                         llwarns << "avatar file: multiple instances of hair_color" << llendl;
09472                                         return FALSE;
09473                                 }
09474                                 mTexHairColorInfo = new LLTexGlobalColorInfo;
09475                                 if( !mTexHairColorInfo->parseXml( color_node ) )
09476                                 {
09477                                         delete mTexHairColorInfo; mTexHairColorInfo = 0;
09478                                         llwarns << "avatar file: mTexHairColor->parseXml() failed" << llendl;
09479                                         return FALSE;
09480                                 }
09481                         }
09482                         else if( global_color_name == "eye_color" )
09483                         {
09484                                 if (mTexEyeColorInfo)
09485                                 {
09486                                         llwarns << "avatar file: multiple instances of eye_color" << llendl;
09487                                         return FALSE;
09488                                 }
09489                                 mTexEyeColorInfo = new LLTexGlobalColorInfo;
09490                                 if( !mTexEyeColorInfo->parseXml( color_node ) )
09491                                 {
09492                                         llwarns << "avatar file: mTexEyeColor->parseXml() failed" << llendl;
09493                                         return FALSE;
09494                                 }
09495                         }
09496                 }
09497         }
09498         return TRUE;
09499 }
09500 
09501 //-----------------------------------------------------------------------------
09502 // parseXmlLayerNodes(): parses <layer_set> nodes from XML tree
09503 //-----------------------------------------------------------------------------
09504 BOOL LLVOAvatarInfo::parseXmlLayerNodes(LLXmlTreeNode* root)
09505 {
09506         for (LLXmlTreeNode* layer_node = root->getChildByName( "layer_set" );
09507                  layer_node;
09508                  layer_node = root->getNextNamedChild())
09509         {
09510                 LLTexLayerSetInfo* layer_info = new LLTexLayerSetInfo();
09511                 if( layer_info->parseXml( layer_node ) )
09512                 {
09513                         mLayerInfoList.push_back(layer_info);
09514                 }
09515                 else
09516                 {
09517                         delete layer_info;
09518                         llwarns << "avatar file: layer_set->parseXml() failed" << llendl;
09519                         return FALSE;
09520                 }
09521         }
09522         return TRUE;
09523 }
09524 
09525 //-----------------------------------------------------------------------------
09526 // parseXmlDriverNodes(): parses <driver_parameters> nodes from XML tree
09527 //-----------------------------------------------------------------------------
09528 BOOL LLVOAvatarInfo::parseXmlDriverNodes(LLXmlTreeNode* root)
09529 {
09530         LLXmlTreeNode* driver = root->getChildByName( "driver_parameters" );
09531         if( driver )
09532         {
09533                 for (LLXmlTreeNode* grand_child = driver->getChildByName( "param" );
09534                          grand_child;
09535                          grand_child = driver->getNextNamedChild())
09536                 {
09537                         if( grand_child->getChildByName( "param_driver" ) )
09538                         {
09539                                 LLDriverParamInfo* driver_info = new LLDriverParamInfo();
09540                                 if( driver_info->parseXml( grand_child ) )
09541                                 {
09542                                         mDriverInfoList.push_back(driver_info);
09543                                 }
09544                                 else
09545                                 {
09546                                         delete driver_info;
09547                                         llwarns << "avatar file: driver_param->parseXml() failed" << llendl;
09548                                         return FALSE;
09549                                 }
09550                         }
09551                 }
09552         }
09553         return TRUE;
09554 }
09555 
09556 // warning: order(N) not order(1)
09557 S32 LLVOAvatar::getAttachmentCount()
09558 {
09559         S32 count = mAttachmentPoints.size();
09560         return count;
09561 }
09562 
09563 //virtual
09564 void LLVOAvatar::updateRegion(LLViewerRegion *regionp)
09565 {
09566         if (mIsSelf)
09567         {
09568                 if (regionp->getHandle() != mLastRegionHandle)
09569                 {
09570                         if (mLastRegionHandle != 0)
09571                         {
09572                                 ++mRegionCrossingCount;
09573                                 F64 delta = (F64)mRegionCrossingTimer.getElapsedTimeF32();
09574                                 F64 avg = (mRegionCrossingCount == 1) ? 0 : LLViewerStats::getInstance()->getStat(LLViewerStats::ST_CROSSING_AVG);
09575                                 F64 delta_avg = (delta + avg*(mRegionCrossingCount-1)) / mRegionCrossingCount;
09576                                 LLViewerStats::getInstance()->setStat(LLViewerStats::ST_CROSSING_AVG, delta_avg);
09577 
09578                                 F64 max = (mRegionCrossingCount == 1) ? 0 : LLViewerStats::getInstance()->getStat(LLViewerStats::ST_CROSSING_MAX);
09579                                 max = llmax(delta, max);
09580                                 LLViewerStats::getInstance()->setStat(LLViewerStats::ST_CROSSING_MAX, max);
09581                         }
09582                         mLastRegionHandle = regionp->getHandle();
09583                 }
09584                 mRegionCrossingTimer.reset();
09585         }
09586 }
09587 
09588 LLString LLVOAvatar::getFullname() const
09589 {
09590         LLString name;
09591 
09592         LLNameValue* first = getNVPair("FirstName"); 
09593         LLNameValue* last  = getNVPair("LastName"); 
09594         if (first && last)
09595         {
09596                 name += first->getString();
09597                 name += " ";
09598                 name += last->getString();
09599         }
09600 
09601         return name;
09602 }
09603 
09604 LLTexLayerSet* LLVOAvatar::getLayerSet(ETextureIndex index) const
09605 {
09606         switch( index )
09607         {
09608         case TEX_HEAD_BAKED:
09609         case TEX_HEAD_BODYPAINT:
09610                 return mHeadLayerSet;
09611 
09612         case TEX_UPPER_BAKED:
09613         case TEX_UPPER_SHIRT:
09614         case TEX_UPPER_BODYPAINT:
09615         case TEX_UPPER_JACKET:
09616         case TEX_UPPER_GLOVES:
09617         case TEX_UPPER_UNDERSHIRT:
09618                 return mUpperBodyLayerSet;
09619 
09620         case TEX_LOWER_BAKED:
09621         case TEX_LOWER_PANTS:
09622         case TEX_LOWER_BODYPAINT:
09623         case TEX_LOWER_SHOES:
09624         case TEX_LOWER_SOCKS:
09625         case TEX_LOWER_JACKET:
09626         case TEX_LOWER_UNDERPANTS:
09627                 return mLowerBodyLayerSet;
09628         
09629         case TEX_EYES_BAKED:
09630         case TEX_EYES_IRIS:
09631                 return mEyesLayerSet;
09632 
09633         case TEX_SKIRT_BAKED:
09634         case TEX_SKIRT:
09635                 return mSkirtLayerSet;
09636 
09637         case TEX_HAIR:
09638         default:
09639                 return NULL;
09640         }
09641 }
09642 
09643 LLHost LLVOAvatar::getObjectHost() const
09644 {
09645         LLViewerRegion* region = getRegion();
09646         if (region && !isDead())
09647         {
09648                 return region->getHost();
09649         }
09650         else
09651         {
09652                 return LLHost::invalid;
09653         }
09654 }
09655 
09656 //static
09657 void LLVOAvatar::updateFreezeCounter(S32 counter)
09658 {
09659         if(counter)
09660         {
09661                 sFreezeCounter = counter ;
09662         }
09663         else if(sFreezeCounter > 0)
09664         {
09665                 sFreezeCounter-- ;
09666         }
09667         else
09668         {
09669                 sFreezeCounter = 0 ;
09670         }
09671 }
09672 
09673 BOOL LLVOAvatar::updateLOD()
09674 {
09675         BOOL res = updateJointLODs();
09676 
09677         LLFace* facep = mDrawable->getFace(0);
09678         if (facep->mVertexBuffer.isNull() ||
09679                 LLVertexBuffer::sEnableVBOs &&
09680                 ((facep->mVertexBuffer->getUsage() == GL_STATIC_DRAW ? TRUE : FALSE) !=
09681                 (facep->getPool()->getVertexShaderLevel() > 0 ? TRUE : FALSE)))
09682         {
09683                 mDirtyMesh = TRUE;
09684         }
09685 
09686         if (mDirtyMesh || mDrawable->isState(LLDrawable::REBUILD_GEOMETRY))
09687         {       //LOD changed or new mesh created, allocate new vertex buffer if needed
09688                 updateMeshData();
09689                 mDirtyMesh = FALSE;
09690                 mNeedsSkin = TRUE;
09691                 mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY);
09692         }
09693         
09694 
09695         return res;
09696 }
09697 
09698 U32 LLVOAvatar::getPartitionType() const
09699 { //avatars merely exist as drawables in the bridge partition
09700         return LLViewerRegion::PARTITION_BRIDGE;
09701 }
09702 
09703 //static
09704 void LLVOAvatar::updateImpostors() 
09705 {
09706         for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
09707                 iter != LLCharacter::sInstances.end(); ++iter)
09708         {
09709                 LLVOAvatar* avatar = (LLVOAvatar*) *iter;
09710                 
09711                 if (!avatar->isDead() && avatar->needsImpostorUpdate() && avatar->isVisible() && avatar->isImpostor())
09712                 {
09713                         gPipeline.generateImpostor(avatar);
09714                 }
09715         }
09716 }
09717 
09718 BOOL LLVOAvatar::isImpostor() const
09719 {
09720         return (sUseImpostors && mUpdatePeriod >= VOAVATAR_IMPOSTOR_PERIOD) ? TRUE : FALSE;
09721 }
09722 
09723 
09724 BOOL LLVOAvatar::needsImpostorUpdate() const
09725 {
09726         return mNeedsImpostorUpdate ;
09727 }
09728 
09729 const LLVector3& LLVOAvatar::getImpostorOffset() const
09730 {
09731         return mImpostorOffset;
09732 }
09733 
09734 const LLVector2& LLVOAvatar::getImpostorDim() const
09735 {
09736         return mImpostorDim;
09737 }
09738 
09739 void LLVOAvatar::setImpostorDim(const LLVector2& dim)
09740 {
09741         mImpostorDim = dim;
09742 }
09743 
09744 void LLVOAvatar::cacheImpostorValues()
09745 {
09746         getImpostorValues(mImpostorExtents, mImpostorAngle, mImpostorDistance);
09747 }
09748 
09749 void LLVOAvatar::getImpostorValues(LLVector3* extents, LLVector3& angle, F32& distance)
09750 {
09751         const LLVector3* ext = mDrawable->getSpatialExtents();
09752         extents[0] = ext[0];
09753         extents[1] = ext[1];
09754 
09755         LLVector3 at = LLViewerCamera::getInstance()->getOrigin()-(getRenderPosition()+mImpostorOffset);
09756         distance = at.normVec();
09757         F32 da = 1.f - (at*LLViewerCamera::getInstance()->getAtAxis());
09758         angle.mV[0] = LLViewerCamera::getInstance()->getYaw()*da;
09759         angle.mV[1] = LLViewerCamera::getInstance()->getPitch()*da;
09760         angle.mV[2] = da;
09761 }
09762 
09763 U32 calc_shame(LLVOVolume* volume, std::set<LLUUID> &textures)
09764 {
09765         if (!volume)
09766         {
09767                 return 0;
09768         }
09769 
09770         U32 shame = 0;
09771 
09772         U32 invisi = 0;
09773         U32 shiny = 0;
09774         U32 glow = 0;
09775         U32 alpha = 0;
09776         U32 flexi = 0;
09777         U32 animtex = 0;
09778         U32 particles = 0;
09779         U32 scale = 0;
09780         U32 bump = 0;
09781         U32 planar = 0;
09782         
09783         if (volume->isFlexible())
09784         {
09785                 flexi = 1;
09786         }
09787         if (volume->isParticleSource())
09788         {
09789                 particles = 1;
09790         }
09791 
09792         const LLVector3& sc = volume->getScale();
09793         scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2];
09794 
09795         LLDrawable* drawablep = volume->mDrawable;
09796 
09797         if (volume->isSculpted())
09798         {
09799                 LLSculptParams *sculpt_params = (LLSculptParams *) volume->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
09800                 LLUUID sculpt_id = sculpt_params->getSculptTexture();
09801                 textures.insert(sculpt_id);
09802         }
09803 
09804         for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
09805         {
09806                 LLFace* face = drawablep->getFace(i);
09807                 const LLTextureEntry* te = face->getTextureEntry();
09808                 LLViewerImage* img = face->getTexture();
09809 
09810                 textures.insert(img->getID());
09811 
09812                 if (face->getPoolType() == LLDrawPool::POOL_ALPHA)
09813                 {
09814                         alpha++;
09815                 }
09816                 else if (img->getPrimaryFormat() == GL_ALPHA)
09817                 {
09818                         invisi = 1;
09819                 }
09820 
09821                 if (te)
09822                 {
09823                         if (te->getBumpmap())
09824                         {
09825                                 bump = 1;
09826                         }
09827                         if (te->getShiny())
09828                         {
09829                                 shiny = 1;
09830                         }
09831                         if (te->getGlow() > 0.f)
09832                         {
09833                                 glow = 1;
09834                         }
09835                         if (face->mTextureMatrix != NULL)
09836                         {
09837                                 animtex++;
09838                         }
09839                         if (te->getTexGen())
09840                         {
09841                                 planar++;
09842                         }
09843                 }
09844         }
09845 
09846         shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar;
09847 
09848         for (U32 i = 0; i < drawablep->getChildCount(); ++i)
09849         {
09850                 shame += calc_shame(drawablep->getChild(i)->getVOVolume(), textures);
09851         }
09852 
09853         return shame;
09854 }
09855 
09856 void LLVOAvatar::shame()
09857 {
09858         if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME))
09859         {
09860                 return;
09861         }
09862 
09863         U32 shame = 1;
09864 
09865         std::set<LLUUID> textures;
09866 
09867         attachment_map_t::const_iterator iter;
09868         for (iter = mAttachmentPoints.begin(); 
09869                 iter != mAttachmentPoints.end();
09870                 ++iter)
09871         {
09872                 LLViewerJointAttachment* attachment = iter->second;
09873                 LLViewerObject* object = attachment->getObject();
09874                 if (object && !object->isHUDAttachment())
09875                 {
09876                         LLDrawable* drawable = object->mDrawable;
09877                         if (drawable)
09878                         {
09879                                 shame += 10;
09880                                 LLVOVolume* volume = drawable->getVOVolume();
09881                                 if (volume)
09882                                 {
09883                                         shame += calc_shame(volume, textures);
09884                                 }
09885                         }
09886                 }
09887         }       
09888 
09889         shame += textures.size() * 5;
09890 
09891         setDebugText(llformat("%d", shame));
09892         F32 green = 1.f-llclamp(((F32) shame-1024.f)/1024.f, 0.f, 1.f);
09893         F32 red = llmin((F32) shame/1024.f, 1.f);
09894         mText->setColor(LLColor4(red,green,0,1));
09895 }
09896 

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