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"
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"
00099 #include "lltoolmgr.h"
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
00123
00124 #include "llgesturemgr.h"
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
00137
00138
00139
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;
00149
00150 const F32 PELVIS_LAG_WALKING = 0.4f;
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;
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
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;
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
00205
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;
00217 const S32 AVATAR_RELEASE_THRESHOLD = 10;
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
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
00249
00250 S32 LLVOAvatar::sMaxOtherAvatarsToComposite = 1;
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
00305
00306 class LLBodyNoiseMotion :
00307 public LLMotion
00308 {
00309 public:
00310
00311 LLBodyNoiseMotion(const LLUUID &id)
00312 : LLMotion(id)
00313 {
00314 mName = "body_noise";
00315
00316 mTorsoState = new LLJointState;
00317 }
00318
00319
00320 virtual ~LLBodyNoiseMotion() { }
00321
00322 public:
00323
00324
00325
00326
00327
00328 static LLMotion *create(const LLUUID &id) { return new LLBodyNoiseMotion(id); }
00329
00330 public:
00331
00332
00333
00334
00335
00336 virtual BOOL getLoop() { return TRUE; }
00337
00338
00339 virtual F32 getDuration() { return 0.0; }
00340
00341
00342 virtual F32 getEaseInDuration() { return 0.0; }
00343
00344
00345 virtual F32 getEaseOutDuration() { return 0.0; }
00346
00347
00348 virtual LLJoint::JointPriority getPriority() { return LLJoint::HIGH_PRIORITY; }
00349
00350 virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; }
00351
00352
00353 virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_BODY_NOISE; }
00354
00355
00356
00357
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
00372
00373
00374 virtual BOOL onActivate() { return TRUE; }
00375
00376
00377
00378
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
00400 virtual void onDeactivate() {}
00401
00402 public:
00403
00404
00405
00406 LLPointer<LLJointState> mTorsoState;
00407 };
00408
00409
00410
00411
00412 class LLBreatheMotionRot :
00413 public LLMotion
00414 {
00415 public:
00416
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
00428 virtual ~LLBreatheMotionRot() { }
00429
00430 public:
00431
00432
00433
00434
00435
00436 static LLMotion *create(const LLUUID &id) { return new LLBreatheMotionRot(id); }
00437
00438 public:
00439
00440
00441
00442
00443
00444 virtual BOOL getLoop() { return TRUE; }
00445
00446
00447 virtual F32 getDuration() { return 0.0; }
00448
00449
00450 virtual F32 getEaseInDuration() { return 0.0; }
00451
00452
00453 virtual F32 getEaseOutDuration() { return 0.0; }
00454
00455
00456 virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; }
00457
00458 virtual LLMotionBlendType getBlendType() { return NORMAL_BLEND; }
00459
00460
00461 virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_BREATHE; }
00462
00463
00464
00465
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
00490
00491
00492 virtual BOOL onActivate() { return TRUE; }
00493
00494
00495
00496
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
00509 virtual void onDeactivate() {}
00510
00511 public:
00512
00513
00514
00515 LLPointer<LLJointState> mChestState;
00516 F32 mBreatheRate;
00517 LLCharacter* mCharacter;
00518 };
00519
00520
00521
00522
00523 class LLPelvisFixMotion :
00524 public LLMotion
00525 {
00526 public:
00527
00528 LLPelvisFixMotion(const LLUUID &id)
00529 : LLMotion(id), mCharacter(NULL)
00530 {
00531 mName = "pelvis_fix";
00532
00533 mPelvisState = new LLJointState;
00534 }
00535
00536
00537 virtual ~LLPelvisFixMotion() { }
00538
00539 public:
00540
00541
00542
00543
00544
00545 static LLMotion *create(const LLUUID& id) { return new LLPelvisFixMotion(id); }
00546
00547 public:
00548
00549
00550
00551
00552
00553 virtual BOOL getLoop() { return TRUE; }
00554
00555
00556 virtual F32 getDuration() { return 0.0; }
00557
00558
00559 virtual F32 getEaseInDuration() { return 0.5f; }
00560
00561
00562 virtual F32 getEaseOutDuration() { return 0.5f; }
00563
00564
00565 virtual LLJoint::JointPriority getPriority() { return LLJoint::LOW_PRIORITY; }
00566
00567 virtual LLMotionBlendType getBlendType() { return NORMAL_BLEND; }
00568
00569
00570 virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_PELVIS_FIX; }
00571
00572
00573
00574
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
00591
00592
00593 virtual BOOL onActivate() { return TRUE; }
00594
00595
00596
00597
00598 virtual BOOL onUpdate(F32 time, U8* joint_mask)
00599 {
00600 mPelvisState->setPosition(LLVector3::zero);
00601
00602 return TRUE;
00603 }
00604
00605
00606 virtual void onDeactivate() {}
00607
00608 public:
00609
00610
00611
00612 LLPointer<LLJointState> mPelvisState;
00613 LLCharacter* mCharacter;
00614 };
00615
00616
00617
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
00688
00689
00690 bool needsSendToSim = false;
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;
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
00718 mSpeed = 0.f;
00719 setAnimationData("Speed", &mSpeed);
00720
00721 strcpy(mAvatarDefinition, AVATAR_DEFAULT_CHAR);
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
00769
00770 mRoot.setName( "mRoot" );
00771
00772
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
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
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
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
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
00946 createMotion( ANIM_AGENT_CUSTOMIZE);
00947 createMotion( ANIM_AGENT_CUSTOMIZE_DONE);
00948
00949
00950
00951 mVoiceVisualizer->setVoiceEnabled( gVoiceClient->getVoiceEnabled( mID ) );
00952 mCurrentGesticulationLevel = 0;
00953 }
00954
00955
00956
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
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
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;
01080 }
01081 else
01082 if( !inst->isFullyBaked() )
01083 {
01084 return FALSE;
01085 }
01086 }
01087 return TRUE;
01088 }
01089
01090
01091 void LLVOAvatar::dumpScratchTextureByteCount()
01092 {
01093 llinfos << "Scratch Texture GL: " << (sScratchTexBytes/1024) << "KB" << llendl;
01094 }
01095
01096
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
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203
01204
01205
01206
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242
01243
01244
01245
01246
01247
01248
01249
01250
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277 }
01278 }
01279
01280
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
01298 void LLVOAvatar::destroyGL()
01299 {
01300 deleteCachedImages();
01301
01302 resetImpostors();
01303 }
01304
01305
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
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
01355
01356
01357 void LLVOAvatar::initClass()
01358 {
01359 LLVOAvatar::sMaxOtherAvatarsToComposite = gSavedSettings.getS32("AvatarCompositeLimit");
01360
01361 char xmlFile[MAX_PATH];
01362
01363 snprintf(xmlFile, MAX_PATH, "%s_lad.xml", gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,AVATAR_DEFAULT_CHAR).c_str());
01364 BOOL success = sXMLTree.parseFile( xmlFile, FALSE );
01365 if (!success)
01366 {
01367 llerrs << "Problem reading avatar configuration file:" << xmlFile << llendl;
01368 }
01369
01370
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
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
01422
01423
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
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
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
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
01564 newMin -= buffer;
01565 newMax += buffer;
01566 }
01567
01568
01569
01570
01571
01572 BOOL LLVOAvatar::parseSkeletonFile(const LLString& filename)
01573 {
01574 LLMemType mt(LLMemType::MTYPE_AVATAR);
01575
01576
01577
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
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
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
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
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
01660 {
01661 sCurVolume++;
01662 }
01663
01664
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
01680
01681 BOOL LLVOAvatar::buildSkeleton(LLVOAvatarSkeletonInfo *info)
01682 {
01683 LLMemType mt(LLMemType::MTYPE_AVATAR);
01684
01685
01686
01687
01688 if (!allocateCharacterJoints(info->mNumBones))
01689 {
01690 llerrs << "Can't allocate " << info->mNumBones << " joints" << llendl;
01691 return FALSE;
01692 }
01693
01694
01695
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
01721 if (mIsSelf)
01722 {
01723 mScreenp = new LLViewerJoint("mScreen", NULL);
01724
01725
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
01737
01738
01739 void LLVOAvatar::buildCharacter()
01740 {
01741 LLMemType mt(LLMemType::MTYPE_AVATAR);
01742
01743
01744
01745
01746
01747 flushAllMotions();
01748
01749
01750
01751
01752 mRoot.removeAllChildren();
01753 mIsBuilt = FALSE;
01754
01755
01756
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
01798
01799 LLTimer timer;
01800
01801 BOOL status = loadAvatar();
01802 stop_glerror();
01803
01804 if (gNoRender)
01805 {
01806
01807 return;
01808 }
01809
01810
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
01819 }
01820 else
01821 {
01822 llwarns << "Unable to load other's avatar" << llendl;
01823 }
01824 return;
01825 }
01826
01827
01828
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
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
01877
01878 mPelvisp->setPosition( LLVector3(0.0f, 0.0f, 0.0f) );
01879
01880
01881
01882
01883 updateHeadOffset();
01884
01885
01886
01887
01888 mOohMorph = getVisualParam( "Lipsync_Ooh" );
01889 mAahMorph = getVisualParam( "Lipsync_Aah" );
01890
01891
01892 if (!mOohMorph)
01893 {
01894 llwarns << "Missing 'Ooh' morph for lipsync, using fallback." << llendl;
01895 mOohMorph = getVisualParam( "Express_Kiss" );
01896 }
01897
01898
01899 if (!mAahMorph)
01900 {
01901 llwarns << "Missing 'Aah' morph for lipsync, using fallback." << llendl;
01902 mAahMorph = getVisualParam( "Express_Open_Mouth" );
01903 }
01904
01905
01906
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
01917
01918 processAnimationStateChanges();
01919
01920 mIsBuilt = TRUE;
01921 stop_glerror();
01922
01923
01924
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
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
02054 gAttachSubMenu->appendSeparator();
02055 gDetachSubMenu->appendSeparator();
02056 }
02057 }
02058
02059 for (S32 group = 0; group < 8; group++)
02060 {
02061
02062 if (!gAttachBodyPartPieMenus[group] || !gDetachBodyPartPieMenus[group])
02063 {
02064 continue;
02065 }
02066
02067 std::multimap<S32, S32> attachment_pie_menu_map;
02068
02069
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
02078 S32 pie_index = attachment->getPieSlice();
02079 attachment_pie_menu_map.insert(std::make_pair(pie_index, curiter->first));
02080 }
02081 }
02082
02083
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
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
02130
02131
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
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
02163
02164 void LLVOAvatar::restoreMeshData()
02165 {
02166 LLMemType mt(LLMemType::MTYPE_AVATAR);
02167
02168
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
02191 gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE);
02192 }
02193
02194
02195
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
02208
02209
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
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
02229
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
02253
02254 void LLVOAvatar::computeBodySize()
02255 {
02256 LLVector3 pelvis_scale = mPelvisp->getScale();
02257
02258
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
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
02293
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
02301 mBodySize.mV[VX] = DEFAULT_AGENT_DEPTH;
02302 mBodySize.mV[VY] = DEFAULT_AGENT_WIDTH;
02303
02304
02305
02306
02307
02308
02309
02310
02311
02312
02313
02314
02315
02316
02317
02318
02319
02320
02321
02322
02323
02324
02325
02326
02327
02328 }
02329
02330
02331
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
02342 U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp);
02343
02344
02345
02346 if (update_type == OUT_FULL )
02347 {
02348 if( !mIsSelf || !mFirstTEMessageReceived )
02349 {
02350
02351 unpackTEMessage(mesgsys, _PREHASH_ObjectData, block_num);
02352
02353
02354 if( !mFirstTEMessageReceived )
02355 {
02356 onFirstTEMessageReceived();
02357 }
02358
02359
02360
02361
02362 setCompositeUpdatesEnabled( FALSE );
02363 updateMeshTextures();
02364 setCompositeUpdatesEnabled( TRUE );
02365 }
02366 }
02367
02368 return retval;
02369 }
02370
02371
02372 S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid)
02373 {
02374
02375
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
02389
02390
02391
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
02410 setPixelAreaAndAngle(gAgent);
02411
02412
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
02422 if (drawablep)
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
02442
02443
02444 if (mIsSelf)
02445 {
02446 LLViewerObject::idleUpdate(agent, world, time);
02447
02448
02449 if (isAnyAnimationSignaled(AGENT_STAND_ANIMS, NUM_AGENT_STAND_ANIMS))
02450 {
02451 agent.fidget();
02452 }
02453 }
02454 else
02455 {
02456
02457 LLQuaternion rotation = getRotation();
02458 LLViewerObject::idleUpdate(agent, world, time);
02459 setRotation(rotation);
02460 }
02461
02462
02463 lazyAttach();
02464
02465
02466
02467 LLVector3 root_pos_last = mRoot.getWorldPosition();
02468 BOOL detailed_update = updateCharacter(agent);
02469 bool voiceEnabled = gVoiceClient->getVoiceEnabled( mID ) && gVoiceClient->inProximalChannel();
02470
02471
02472 mVoiceVisualizer->setVoiceEnabled( voiceEnabled && !(mIsSelf && gAgent.cameraMouselook()) );
02473 if ( voiceEnabled )
02474 {
02475
02476
02477
02478 if( mIsSelf )
02479 {
02480
02481
02482
02483 int lastGesticulationLevel = mCurrentGesticulationLevel;
02484 mCurrentGesticulationLevel = mVoiceVisualizer->getCurrentGesticulationLevel();
02485
02486
02487
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
02500 gGestureManager.triggerAndReviseString( gestureString );
02501 }
02502 }
02503
02504 }
02505
02506
02507
02508
02509
02510
02511
02512
02513 if ( gVoiceClient->getIsSpeaking( mID ) )
02514 {
02515 if ( ! mVoiceVisualizer->getCurrentlySpeaking() )
02516 {
02517 mVoiceVisualizer->setStartSpeaking();
02518
02519
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
02549
02550
02551 LLVector3 headOffset = LLVector3( 0.0f, 0.0f, mHeadOffset.mV[2] );
02552 mVoiceVisualizer->setVoiceSourceWorldPosition( mRoot.getWorldPosition() + headOffset );
02553
02554 }
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
02570 if (mDrawable.notNull())
02571 {
02572 gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_SHADOW, TRUE);
02573 }
02574
02575 BOOL visible = isVisible() || mNeedsAnimUpdate;
02576
02577
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
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 {
02638
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
02660 if (getParent() && ((LLViewerObject*) getParent())->mDrawable->isActive())
02661 {
02662 gPipeline.markMoved(mDrawable, TRUE);
02663 }
02664
02665
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
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
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
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
02758 if (updateIsFullyLoaded())
02759 {
02760 if (isFullyLoaded())
02761 {
02762 deleteParticleSource();
02763 }
02764 else
02765 {
02766 LLPartSysData particle_parameters;
02767
02768
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 |
02791 LLPartData::LL_PART_TARGET_POS_MASK );
02792
02793 setParticleSource(particle_parameters, getID());
02794 }
02795 }
02796
02797
02798
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
02807 mRippleAccel.clearVec();
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
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
02854
02855
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");
02864 const F32 FADE_DURATION = gSavedSettings.getF32("RenderNameFadeDuration");
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
02871
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
02895
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
02908 alpha = 1.f;
02909 }
02910 }
02911 else if (mAppAngle > 2.f)
02912 {
02913
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];
02993 if (!sRenderGroupTitles)
02994 {
02995
02996
02997 strncpy(line, firstname->getString(), MAX_STRING -1 );
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 );
03004 line[MAX_STRING -1] = '\0';
03005 strcat(line, "\n");
03006 strncat(line, firstname->getString(), MAX_STRING - strlen(line) -1 );
03007 }
03008 else
03009 {
03010 strncpy(line, firstname->getString(), MAX_STRING -1 );
03011 line[MAX_STRING -1] = '\0';
03012 }
03013
03014 strcat(line, " ");
03015 strncat(line, lastname->getString(), MAX_STRING - strlen(line) -1);
03016 BOOL need_comma = FALSE;
03017
03018 if (is_away || is_muted || is_busy)
03019 {
03020 strcat(line, " (");
03021 if (is_away)
03022 {
03023 strcat(line, "Away");
03024 need_comma = TRUE;
03025 }
03026 if (is_busy)
03027 {
03028 if (need_comma)
03029 {
03030 strcat(line, ", ");
03031 }
03032 strcat(line, "Busy");
03033 need_comma = TRUE;
03034 }
03035 if (is_muted)
03036 {
03037 if (need_comma)
03038 {
03039 strcat(line, ", ");
03040 }
03041 strcat(line, "Muted");
03042 need_comma = TRUE;
03043 }
03044 strcat(line,")");
03045 }
03046 if (is_appearance)
03047 {
03048 strcat(line, "\n(Editing Appearance)");
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];
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
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
03167
03168 if (!mIsSelf)
03169 {
03170 return TRUE;
03171 }
03172
03173
03174 if (!needsRenderBeam() || !mIsBuilt)
03175 {
03176 mBeam = NULL;
03177 }
03178 else if (!mBeam || mBeam->isDead())
03179 {
03180
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
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());
03246 setChanged(TRANSLATED);
03247 if (mDrawable.notNull())
03248 {
03249 gPipeline.updateMoveNormalAsync(mDrawable);
03250 }
03251 mRoot.updateWorldMatrixChildren();
03252 }
03253
03254
03255
03256
03257
03258 BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
03259 {
03260 LLMemType mt(LLMemType::MTYPE_AVATAR);
03261
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
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
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
03321
03322 if (mDrawable.notNull() && !visible)
03323 {
03324 mTimeVisible.reset();
03325 }
03326
03327
03328
03329
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
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
03376 stopMotion(ANIM_AGENT_WALK_ADJUST);
03377 removeAnimationData("Walk Speed");
03378 }
03379 mMotionController.setTimeStep(time_step);
03380
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
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
03408
03409
03410 F32 animation_time = mAnimTimer.getElapsedTimeF32();
03411 if (mTimeLast == 0.0f)
03412 {
03413 mTimeLast = animation_time;
03414 throttle = FALSE;
03415
03416
03417 mRoot.setWorldPosition( getPositionAgent() );
03418 mRoot.setWorldRotation( getRotation() );
03419 }
03420
03421
03422
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
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
03456
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 );
03466 }
03467
03468
03469
03470
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
03478
03479
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
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
03539
03540
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
03555
03556
03557 if(root_roll < 1.f * DEG_TO_RAD
03558 && root_pitch < 5.f * DEG_TO_RAD)
03559 {
03560
03561 if (!mTurning && angle > pelvis_rot_threshold*0.75f)
03562 {
03563 mTurning = TRUE;
03564 }
03565
03566
03567 if (mTurning)
03568 {
03569 pelvis_rot_threshold *= 0.4f;
03570 }
03571
03572
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
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
03605
03606
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
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
03637
03638
03639 mSpeed = speed;
03640
03641
03642 {
03643 LLFastTimer t(LLFastTimer::FTM_UPDATE_ANIMATION);
03644 updateMotion();
03645 }
03646
03647
03648 updateHeadOffset();
03649
03650
03651
03652
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
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
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
03697 if ( onGroundLeft && !mWasOnGroundLeft )
03698 {
03699 foot_pos_agent = ankle_left_pos_agent;
03700 playSound = TRUE;
03701 }
03702
03703
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
03716
03717
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
03738 if(mIsSelf)
03739 {
03740 LLMatrix3 rot;
03741 LLVector3d pos;
03742 #if 1
03743
03744 rot = mRoot.getWorldRotation().getMatrix3();
03745 #else
03746
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
03757 gVoiceClient->setAvatarPosition(
03758 pos,
03759 LLVector3::zero,
03760 rot);
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
03774 mNeedsSkin = TRUE;
03775
03776 return TRUE;
03777 }
03778
03779
03780
03781
03782 void LLVOAvatar::updateHeadOffset()
03783 {
03784
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
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
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
03868
03869
03870
03871
03872
03873
03874
03875
03876
03877
03878
03879
03880
03881
03882
03883
03884
03885
03886
03887
03888 llinfos << "PA: " << getPositionAgent() << llendl;
03889
03890
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
03930
03931
03932
03933
03934
03935
03936 }
03937
03938 mVisible = visible;
03939 }
03940
03941
03942
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
03957 is_touching_or_grabbing = FALSE;
03958 }
03959 return is_touching_or_grabbing || (mState & AGENT_STATE_EDITING && LLSelectMgr::getInstance()->shouldShowSelection());
03960 }
03961
03962
03963
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 {
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
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
04051
04052
04053
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
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
04114
04115
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
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
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
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
04257
04258 void LLVOAvatar::renderCollisionVolumes()
04259 {
04260 for (S32 i = 0; i < mNumCollisionVolumes; i++)
04261 {
04262 mCollisionVolumes[i].renderCollision();
04263 }
04264 }
04265
04266
04267
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
04294
04295
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
04322
04323
04324
04325
04326
04327
04328
04329
04330
04331
04332
04333
04334
04335
04336
04337
04338
04339
04340
04341
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
04353
04354
04355
04356
04357
04358
04359
04360
04361 const LLTextureEntry *te = getTE(i);
04362 F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT);
04363
04364 S32 boost_level = mIsSelf ? LLViewerImage::BOOST_AVATAR_BAKED_SELF : LLViewerImage::BOOST_AVATAR_BAKED;
04365
04366
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
04380 case TEX_HEAD_BODYPAINT:
04381 addLocalTextureStats( LOCTEX_HEAD_BODYPAINT, imagep, texel_area_ratio, render_avatar, head_baked );
04382 break;
04383
04384
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
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
04431 case TEX_EYES_IRIS:
04432 addLocalTextureStats( LOCTEX_EYES_IRIS, imagep, texel_area_ratio, render_avatar, eyes_baked );
04433 break;
04434
04435
04436 case TEX_SKIRT:
04437 addLocalTextureStats( LOCTEX_SKIRT, imagep, texel_area_ratio, render_avatar, skirt_baked );
04438 break;
04439
04440
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
04478
04479
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 &&
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
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
04574
04575 LLVector3 angularVelocity = obj->getAngularVelocity();
04576 LLVector3 relativePos = gAgent.getPosAgentFromGlobal(outPos) - obj->getPositionAgent();
04577
04578 LLVector3 linearComponent = angularVelocity % relativePos;
04579
04580 mStepObjectVelocity = obj->getVelocity() + linearComponent;
04581 }
04582 }
04583
04584
04585
04586
04587
04588 LLUUID& LLVOAvatar::getStepSound()
04589 {
04590 if ( mStepOnLand )
04591 {
04592 return sStepSoundOnLand;
04593 }
04594
04595 return sStepSounds[mStepMaterial];
04596 }
04597
04598
04599
04600
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
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
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
04656 for (anim_it = mSignaledAnimations.begin(); anim_it != mSignaledAnimations.end();)
04657 {
04658 AnimIterator found_anim = mPlayingAnimations.find(anim_it->first);
04659
04660
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
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
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 )
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
04716
04717
04718
04719
04720
04721
04722
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
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
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
04776
04777 void LLVOAvatar::resetAnimations()
04778 {
04779 LLKeyframeMotion::flushKeyframeCache();
04780 flushAllMotions();
04781 }
04782
04783
04784
04785
04786
04787
04788 BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset)
04789 {
04790 LLMemType mt(LLMemType::MTYPE_AVATAR);
04791
04792
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
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
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
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
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
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
04903
04904 void LLVOAvatar::addDebugText(const std::string& text)
04905 {
04906 mDebugText.append(1, '\n');
04907 mDebugText.append(text);
04908 }
04909
04910
04911
04912
04913 const LLUUID& LLVOAvatar::getID()
04914 {
04915 return mID;
04916 }
04917
04918
04919
04920
04921
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
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
04954
04955 LLQuaternion LLVOAvatar::getCharacterRotation()
04956 {
04957 return getRotation();
04958 }
04959
04960
04961
04962
04963
04964 LLVector3 LLVOAvatar::getCharacterVelocity()
04965 {
04966 return getVelocity() - mStepObjectVelocity;
04967 }
04968
04969
04970
04971
04972
04973 LLVector3 LLVOAvatar::getCharacterAngularVelocity()
04974 {
04975 return getAngularVelocity();
04976 }
04977
04978
04979
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
05003
05004 F32 LLVOAvatar::getTimeDilation()
05005 {
05006 return mTimeDilation;
05007 }
05008
05009
05010
05011
05012
05013 F32 LLVOAvatar::getPixelArea() const
05014 {
05015 if (mIsDummy)
05016 {
05017 return 100000.f;
05018 }
05019 return mPixelArea;
05020 }
05021
05022
05023
05024
05025
05026 LLPolyMesh* LLVOAvatar::getHeadMesh()
05027 {
05028 return mHeadMesh0.getMesh();
05029 }
05030
05031
05032
05033
05034
05035 LLPolyMesh* LLVOAvatar::getUpperBodyMesh()
05036 {
05037 return mUpperBodyMesh0.getMesh();
05038 }
05039
05040
05041
05042
05043
05044 LLVector3d LLVOAvatar::getPosGlobalFromAgent(const LLVector3 &position)
05045 {
05046 return gAgent.getPosGlobalFromAgent(position);
05047 }
05048
05049
05050
05051
05052 LLVector3 LLVOAvatar::getPosAgentFromGlobal(const LLVector3d &position)
05053 {
05054 return gAgent.getPosAgentFromGlobal(position);
05055 }
05056
05057
05058
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
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
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
05117
05118 void LLVOAvatar::requestStopMotion( LLMotion* motion )
05119 {
05120
05121 if ( mIsSelf )
05122 {
05123
05124 gAgent.requestStopMotion( motion );
05125 }
05126 }
05127
05128
05129
05130
05131 BOOL LLVOAvatar::loadAvatar()
05132 {
05133
05134
05135
05136 if( !buildSkeleton(sSkeletonInfo) )
05137 {
05138 llwarns << "avatar file: buildSkeleton() failed" << llendl;
05139 return FALSE;
05140 }
05141
05142
05143 if( !loadSkeletonNode() )
05144 {
05145 llwarns << "avatar file: loadNodeSkeleton() failed" << llendl;
05146 return FALSE;
05147 }
05148
05149
05150 if( !loadMeshNodes() )
05151 {
05152 llwarns << "avatar file: loadNodeMesh() failed" << llendl;
05153 return FALSE;
05154 }
05155
05156
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
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
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
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
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
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 {
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
05438 parentJoint->addChild(attachment);
05439 }
05440 }
05441
05442 return TRUE;
05443 }
05444
05445
05446
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
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
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
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
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
05716
05717 BOOL LLVOAvatar::isActive() const
05718 {
05719 return TRUE;
05720 }
05721
05722
05723
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)
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
05748 if( mIsSelf )
05749 {
05750 mPixelArea = llmax( mPixelArea, F32(LOCTEX_IMAGE_SIZE_SELF / 16) );
05751 }
05752 }
05753
05754
05755
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
05783 mAdjustedPixelArea = (F32)mPixelArea * area_scale * lod_factor * lod_factor * avatar_num_factor * avatar_num_factor;
05784 }
05785
05786
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
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
05810 mDrawable->setState(LLDrawable::ACTIVE);
05811 mDrawable->addFace(poolp, NULL);
05812 mDrawable->setRenderType(LLPipeline::RENDER_TYPE_AVATAR);
05813
05814 LLFace *facep;
05815
05816
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
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
05854
05855 void LLVOAvatar::updateShadowFaces()
05856 {
05857 LLFace *face0p = mShadow0Facep;
05858 LLFace *face1p = mShadow1Facep;
05859
05860
05861
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
05889
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
05896 shadow_pos_agent += normal * SHADOW_OFFSET_AMT;
05897
05898
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
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
05922
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
05929 shadow_pos_agent += normal * SHADOW_OFFSET_AMT;
05930
05931
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
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
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
05966
05967 void LLVOAvatar::dirtyMesh()
05968 {
05969 mDirtyMesh = TRUE;
05970 }
05971
05972
05973
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
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
06117 gInventory.addChangedMask( LLInventoryObserver::LABEL, attachment->getItemID() );
06118 gInventory.notifyObservers();
06119 }
06120
06121 return TRUE;
06122 }
06123
06124
06125
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
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
06169 if (attachment->getObject() == viewer_object)
06170 {
06171 LLUUID item_id = attachment->getItemID();
06172 attachment->removeObject(viewer_object);
06173 if (mIsSelf)
06174 {
06175
06176
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
06185
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
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
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);
06228 mRoot.setPosition(getPosition());
06229 mRoot.updateWorldMatrixChildren();
06230
06231 stopMotion(ANIM_AGENT_BODY_NOISE);
06232
06233 if (mIsSelf)
06234 {
06235
06236 LLFirstUse::useSit();
06237
06238 gAgent.setFlying(FALSE);
06239 gAgent.setThirdPersonHeadOffset(LLVector3::zero);
06240
06241 gAgent.startCameraAnimation();
06242
06243 gAgent.stopAutoPilot();
06244 gAgent.setupSitCamera();
06245 if (gAgent.mForceMouselook) gAgent.changeCameraToMouselook();
06246 }
06247 }
06248
06249
06250
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
06276 LLVector3 cur_position_world = mDrawable->getWorldPosition();
06277 LLQuaternion cur_rotation_world = mDrawable->getWorldRotation();
06278
06279
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);
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
06305
06306 gAgent.setThirdPersonHeadOffset(LLVector3(0.f, 0.f, 1.f));
06307
06308 gAgent.setSitCamera(LLUUID::null);
06309 }
06310 }
06311
06312
06313
06314
06315
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
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
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
06389
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
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
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;
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
06485 return LLColor4( 0.f, 1.f, 1.f, 1.f );
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
06498
06499
06500
06501
06502
06503
06504
06505
06506
06507
06508
06509
06510
06511
06512
06513
06514
06515
06516
06517
06518
06519
06520
06521
06522
06523
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
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
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
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
06605 updateMeshTextures();
06606 }
06607
06608
06609
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
06619
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
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
06640 if (!found)
06641 {
06642 self->forceBakeAllTextures();
06643 }
06644 else
06645 {
06646
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
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
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
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
06737
06738 BOOL LLVOAvatar::updateIsFullyLoaded()
06739 {
06740
06741
06742
06743 BOOL loading = FALSE;
06744
06745
06746 if (visualParamWeightsAreDefault())
06747 {
06748 loading = TRUE;
06749 }
06750
06751
06752 if ((getTEImage( TEX_HAIR )->getID() == IMG_DEFAULT))
06753 {
06754 loading = TRUE;
06755 }
06756
06757
06758
06759
06760
06761
06762
06763
06764
06765
06766
06767
06768
06769
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
06787
06788 const F32 PAUSE = 1.f;
06789 if (loading)
06790 mFullyLoadedTimer.reset();
06791
06792 mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > PAUSE);
06793
06794
06795
06796 const S32 UPDATE_RATE = 30;
06797 BOOL changed =
06798 ((mFullyLoaded != mPreviousFullyLoaded) ||
06799 (!mFullyLoadedInitialized) ||
06800 (mFullyLoadedFrameCounter % UPDATE_RATE == 0));
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
06821
06822 LLMotion* LLVOAvatar::findMotion(const LLUUID& id)
06823 {
06824 return mMotionController.findMotion(id);
06825 }
06826
06827
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
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
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
07015
07016
07017 void LLVOAvatar::updateMeshTextures()
07018 {
07019
07020 if (gNoRender)
07021 {
07022 return;
07023 }
07024
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));
07039 }
07040 }
07041 }
07042
07043
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
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
07101
07102
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
07136 LLHost target_host = getObjectHost();
07137 if (!target_host.isOk())
07138 {
07139 llwarns << "updateMeshTextures: invalid host for object: " << getID() << llendl;
07140 }
07141
07142
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
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
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
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
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
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
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
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
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
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
07396 BOOL head_baked_ready = (head_baked && mHeadBakedLoaded) || other_culled;
07397 setLocalTexture( LOCTEX_HEAD_BODYPAINT, getTEImage( TEX_HEAD_BODYPAINT ), head_baked_ready );
07398
07399
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
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
07417 BOOL eyes_baked_ready = (eyes_baked && mEyesBakedLoaded) || other_culled;
07418 setLocalTexture( LOCTEX_EYES_IRIS, getTEImage( TEX_EYES_IRIS ), eyes_baked_ready );
07419
07420
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
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
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
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
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
07576 return 0;
07577 }
07578 }
07579
07580
07581
07582
07583
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
07623
07624
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
07665
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
07700
07701
07702 void LLVOAvatar::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid )
07703 {
07704
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
07735
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
07751
07752
07753
07754
07755
07756
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
07770
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
07831
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
07848 gAgent.sendAgentSetAppearance();
07849 }
07850 }
07851
07852
07853
07854
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
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
08068
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
08096
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
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
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;
08195
08196 default:
08197 return FALSE;
08198 }
08199
08200 return ( getTEImage(indicator_te)->getID() != IMG_DEFAULT_AVATAR );
08201 }
08202
08203
08204
08205
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
08253 bbox.addPointLocal(hud_object->getPosition());
08254
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
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
08286
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
08334
08335 void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
08336 {
08337 LLMemType mt(LLMemType::MTYPE_AVATAR);
08338
08339
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
08350 return;
08351 }
08352 }
08353
08354 if (gNoRender)
08355 {
08356 return;
08357 }
08358
08359 ESex old_sex = getSex();
08360
08361
08362
08363 unpackTEMessage(mesgsys, _PREHASH_ObjectData);
08364
08365
08366
08367
08368
08369
08370
08371
08372 if( !mFirstTEMessageReceived )
08373 {
08374 onFirstTEMessageReceived();
08375 }
08376
08377 setCompositeUpdatesEnabled( FALSE );
08378 updateMeshTextures();
08379
08380
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
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
08465 LLVOAvatar::cullAvatarsByPixelArea();
08466
08467
08468 }
08469
08470
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
08480 labels->put( "Away From Keyboard" );
08481 }
08482
08483
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
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
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
08513
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
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
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
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
08613
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
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
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
08667 void LLVOAvatar::useBakedTexture( const LLUUID& id )
08668 {
08669
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
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
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];
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
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
08852 void LLVOAvatar::cullAvatarsByPixelArea()
08853 {
08854 std::sort(LLCharacter::sInstances.begin(), LLCharacter::sInstances.end(), CompareScreenAreaGreater());
08855
08856
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
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
08913
08914
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
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
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
09037
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
09058
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
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
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
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
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
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
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
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;
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
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
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;
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;
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;
09383 }
09384
09385 static LLStdStringHandle reference_string = LLXmlTree::addAttributeString("reference");
09386 node->getFastAttributeString( reference_string, info->mReferenceMeshName );
09387
09388
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
09397 min_pixel_area = min_pixel_area * min_pixel_area;
09398 }
09399 info->mMinPixelArea = min_pixel_area;
09400 }
09401
09402
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
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
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
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
09557 S32 LLVOAvatar::getAttachmentCount()
09558 {
09559 S32 count = mAttachmentPoints.size();
09560 return count;
09561 }
09562
09563
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
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 {
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 {
09700 return LLViewerRegion::PARTITION_BRIDGE;
09701 }
09702
09703
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