llvoavatar.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:225k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @File llvoavatar.cpp
  3.  * @brief Implementation of LLVOAvatar class which is a derivation fo LLViewerObject
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #if LL_MSVC
  33. // disable warning about boost::lexical_cast returning uninitialized data
  34. // when it fails to parse the string
  35. #pragma warning (disable:4701)
  36. #endif
  37. #include "llviewerprecompiledheaders.h"
  38. #include "llvoavatar.h"
  39. #include <stdio.h>
  40. #include <ctype.h>
  41. #include "llaudioengine.h"
  42. #include "noise.h"
  43. #include "sound_ids.h"
  44. #include "llagent.h" //  Get state values from here
  45. #include "llagentwearables.h"
  46. #include "llanimationstates.h"
  47. #include "llavatarpropertiesprocessor.h"
  48. #include "llviewercontrol.h"
  49. #include "lldrawpoolavatar.h"
  50. #include "lldriverparam.h"
  51. #include "lleditingmotion.h"
  52. #include "llemote.h"
  53. //#include "llfirstuse.h"
  54. #include "llheadrotmotion.h"
  55. #include "llhudeffecttrail.h"
  56. #include "llhudmanager.h"
  57. #include "llkeyframefallmotion.h"
  58. #include "llkeyframestandmotion.h"
  59. #include "llkeyframewalkmotion.h"
  60. #include "llmutelist.h"
  61. #include "llmoveview.h"
  62. #include "llquantize.h"
  63. #include "llregionhandle.h"
  64. #include "llresmgr.h"
  65. #include "llselectmgr.h"
  66. #include "llsprite.h"
  67. #include "lltargetingmotion.h"
  68. #include "lltexlayer.h"
  69. #include "lltoolmorph.h"
  70. #include "llviewercamera.h"
  71. #include "llviewertexturelist.h"
  72. #include "llviewermenu.h"
  73. #include "llviewerobjectlist.h"
  74. #include "llviewerparcelmgr.h"
  75. #include "llviewerstats.h"
  76. #include "llvoavatarself.h"
  77. #include "llvovolume.h"
  78. #include "llworld.h"
  79. #include "pipeline.h"
  80. #include "llviewershadermgr.h"
  81. #include "llsky.h"
  82. #include "llanimstatelabels.h"
  83. #include "lltrans.h"
  84. #include "llappearancemgr.h"
  85. #include "llgesturemgr.h" //needed to trigger the voice gesticulations
  86. #include "llvoiceclient.h"
  87. #include "llvoicevisualizer.h" // Ventrella
  88. #if LL_MSVC
  89. // disable boost::lexical_cast warning
  90. #pragma warning (disable:4702)
  91. #endif
  92. #include <boost/lexical_cast.hpp>
  93. using namespace LLVOAvatarDefines;
  94. //-----------------------------------------------------------------------------
  95. // Global constants
  96. //-----------------------------------------------------------------------------
  97. const LLUUID ANIM_AGENT_BODY_NOISE = LLUUID("9aa8b0a6-0c6f-9518-c7c3-4f41f2c001ad"); //"body_noise"
  98. const LLUUID ANIM_AGENT_BREATHE_ROT = LLUUID("4c5a103e-b830-2f1c-16bc-224aa0ad5bc8");  //"breathe_rot"
  99. const LLUUID ANIM_AGENT_EDITING = LLUUID("2a8eba1d-a7f8-5596-d44a-b4977bf8c8bb");  //"editing"
  100. const LLUUID ANIM_AGENT_EYE = LLUUID("5c780ea8-1cd1-c463-a128-48c023f6fbea");  //"eye"
  101. const LLUUID ANIM_AGENT_FLY_ADJUST = LLUUID("db95561f-f1b0-9f9a-7224-b12f71af126e");  //"fly_adjust"
  102. const LLUUID ANIM_AGENT_HAND_MOTION = LLUUID("ce986325-0ba7-6e6e-cc24-b17c4b795578");  //"hand_motion"
  103. const LLUUID ANIM_AGENT_HEAD_ROT = LLUUID("e6e8d1dd-e643-fff7-b238-c6b4b056a68d");  //"head_rot"
  104. const LLUUID ANIM_AGENT_PELVIS_FIX = LLUUID("0c5dd2a2-514d-8893-d44d-05beffad208b");  //"pelvis_fix"
  105. const LLUUID ANIM_AGENT_TARGET = LLUUID("0e4896cb-fba4-926c-f355-8720189d5b55");  //"target"
  106. const LLUUID ANIM_AGENT_WALK_ADJUST = LLUUID("829bc85b-02fc-ec41-be2e-74cc6dd7215d");  //"walk_adjust"
  107. //-----------------------------------------------------------------------------
  108. // Constants
  109. //-----------------------------------------------------------------------------
  110. const std::string AVATAR_DEFAULT_CHAR = "avatar";
  111. const S32 MIN_PIXEL_AREA_FOR_COMPOSITE = 1024;
  112. const F32 SHADOW_OFFSET_AMT = 0.03f;
  113. const F32 DELTA_TIME_MIN = 0.01f; // we clamp measured deltaTime to this
  114. const F32 DELTA_TIME_MAX = 0.2f; // range to insure stability of computations.
  115. const F32 PELVIS_LAG_FLYING = 0.22f;// pelvis follow half life while flying
  116. const F32 PELVIS_LAG_WALKING = 0.4f; // ...while walking
  117. const F32 PELVIS_LAG_MOUSELOOK = 0.15f;
  118. const F32 MOUSELOOK_PELVIS_FOLLOW_FACTOR = 0.5f;
  119. const F32 PELVIS_LAG_WHEN_FOLLOW_CAM_IS_ON = 0.0001f; // not zero! - something gets divided by this!
  120. const F32 PELVIS_ROT_THRESHOLD_SLOW = 60.0f; // amount of deviation allowed between
  121. const F32 PELVIS_ROT_THRESHOLD_FAST = 2.0f; // the pelvis and the view direction
  122. // when moving fast & slow
  123. const F32 TORSO_NOISE_AMOUNT = 1.0f; // Amount of deviation from up-axis, in degrees
  124. const F32 TORSO_NOISE_SPEED = 0.2f; // Time scale factor on torso noise.
  125. const F32 BREATHE_ROT_MOTION_STRENGTH = 0.05f;
  126. const F32 BREATHE_SCALE_MOTION_STRENGTH = 0.005f;
  127. const F32 MIN_SHADOW_HEIGHT = 0.f;
  128. const F32 MAX_SHADOW_HEIGHT = 0.3f;
  129. const S32 MIN_REQUIRED_PIXEL_AREA_BODY_NOISE = 10000;
  130. const S32 MIN_REQUIRED_PIXEL_AREA_BREATHE = 10000;
  131. const S32 MIN_REQUIRED_PIXEL_AREA_PELVIS_FIX = 40;
  132. const S32 TEX_IMAGE_SIZE_SELF = 512;
  133. const S32 TEX_IMAGE_AREA_SELF = TEX_IMAGE_SIZE_SELF * TEX_IMAGE_SIZE_SELF;
  134. const S32 TEX_IMAGE_SIZE_OTHER = 512 / 4;  // The size of local textures for other (!isSelf()) avatars
  135. const F32 HEAD_MOVEMENT_AVG_TIME = 0.9f;
  136. const S32 MORPH_MASK_REQUESTED_DISCARD = 0;
  137. // Discard level at which to switch to baked textures
  138. // Should probably be 4 or 3, but didn't want to change it while change other logic - SJB
  139. const S32 SWITCH_TO_BAKED_DISCARD = 5;
  140. const F32 FOOT_COLLIDE_FUDGE = 0.04f;
  141. const F32 HOVER_EFFECT_MAX_SPEED = 3.f;
  142. const F32 HOVER_EFFECT_STRENGTH = 0.f;
  143. const F32 UNDERWATER_EFFECT_STRENGTH = 0.1f;
  144. const F32 UNDERWATER_FREQUENCY_DAMP = 0.33f;
  145. const F32 APPEARANCE_MORPH_TIME = 0.65f;
  146. const F32 TIME_BEFORE_MESH_CLEANUP = 5.f; // seconds
  147. const S32 AVATAR_RELEASE_THRESHOLD = 10; // number of avatar instances before releasing memory
  148. const F32 FOOT_GROUND_COLLISION_TOLERANCE = 0.25f;
  149. const F32 AVATAR_LOD_TWEAK_RANGE = 0.7f;
  150. const S32 MAX_BUBBLE_CHAT_LENGTH = 1023;
  151. const S32 MAX_BUBBLE_CHAT_UTTERANCES = 12;
  152. const F32 CHAT_FADE_TIME = 8.0;
  153. const F32 BUBBLE_CHAT_TIME = CHAT_FADE_TIME * 3.f;
  154. const LLColor4 DUMMY_COLOR = LLColor4(0.5,0.5,0.5,1.0);
  155. enum ERenderName
  156. {
  157. RENDER_NAME_NEVER,
  158. RENDER_NAME_ALWAYS,
  159. RENDER_NAME_FADE
  160. };
  161. //-----------------------------------------------------------------------------
  162. // Callback data
  163. //-----------------------------------------------------------------------------
  164. struct LLTextureMaskData
  165. {
  166. LLTextureMaskData( const LLUUID& id ) :
  167. mAvatarID(id), 
  168. mLastDiscardLevel(S32_MAX) 
  169. {}
  170. LLUUID mAvatarID;
  171. S32 mLastDiscardLevel;
  172. };
  173. /*********************************************************************************
  174.  **                                                                             **
  175.  ** Begin private LLVOAvatar Support classes
  176.  **
  177.  **/
  178. //------------------------------------------------------------------------
  179. // LLVOBoneInfo
  180. // Trans/Scale/Rot etc. info about each avatar bone.  Used by LLVOAvatarSkeleton.
  181. //------------------------------------------------------------------------
  182. class LLVOAvatarBoneInfo
  183. {
  184. friend class LLVOAvatar;
  185. friend class LLVOAvatarSkeletonInfo;
  186. public:
  187. LLVOAvatarBoneInfo() : mIsJoint(FALSE) {}
  188. ~LLVOAvatarBoneInfo()
  189. {
  190. std::for_each(mChildList.begin(), mChildList.end(), DeletePointer());
  191. }
  192. BOOL parseXml(LLXmlTreeNode* node);
  193. private:
  194. std::string mName;
  195. BOOL mIsJoint;
  196. LLVector3 mPos;
  197. LLVector3 mRot;
  198. LLVector3 mScale;
  199. LLVector3 mPivot;
  200. typedef std::vector<LLVOAvatarBoneInfo*> child_list_t;
  201. child_list_t mChildList;
  202. };
  203. //------------------------------------------------------------------------
  204. // LLVOAvatarSkeletonInfo
  205. // Overall avatar skeleton
  206. //------------------------------------------------------------------------
  207. class LLVOAvatarSkeletonInfo
  208. {
  209. friend class LLVOAvatar;
  210. public:
  211. LLVOAvatarSkeletonInfo() :
  212. mNumBones(0), mNumCollisionVolumes(0) {}
  213. ~LLVOAvatarSkeletonInfo()
  214. {
  215. std::for_each(mBoneInfoList.begin(), mBoneInfoList.end(), DeletePointer());
  216. }
  217. BOOL parseXml(LLXmlTreeNode* node);
  218. S32 getNumBones() const { return mNumBones; }
  219. S32 getNumCollisionVolumes() const { return mNumCollisionVolumes; }
  220. private:
  221. S32 mNumBones;
  222. S32 mNumCollisionVolumes;
  223. typedef std::vector<LLVOAvatarBoneInfo*> bone_info_list_t;
  224. bone_info_list_t mBoneInfoList;
  225. };
  226. //-----------------------------------------------------------------------------
  227. // class LLBodyNoiseMotion
  228. //-----------------------------------------------------------------------------
  229. class LLBodyNoiseMotion :
  230. public LLMotion
  231. {
  232. public:
  233. // Constructor
  234. LLBodyNoiseMotion(const LLUUID &id)
  235. : LLMotion(id)
  236. {
  237. mName = "body_noise";
  238. mTorsoState = new LLJointState;
  239. }
  240. // Destructor
  241. virtual ~LLBodyNoiseMotion() { }
  242. public:
  243. //-------------------------------------------------------------------------
  244. // functions to support MotionController and MotionRegistry
  245. //-------------------------------------------------------------------------
  246. // static constructor
  247. // all subclasses must implement such a function and register it
  248. static LLMotion *create(const LLUUID &id) { return new LLBodyNoiseMotion(id); }
  249. public:
  250. //-------------------------------------------------------------------------
  251. // animation callbacks to be implemented by subclasses
  252. //-------------------------------------------------------------------------
  253. // motions must specify whether or not they loop
  254. virtual BOOL getLoop() { return TRUE; }
  255. // motions must report their total duration
  256. virtual F32 getDuration() { return 0.0; }
  257. // motions must report their "ease in" duration
  258. virtual F32 getEaseInDuration() { return 0.0; }
  259. // motions must report their "ease out" duration.
  260. virtual F32 getEaseOutDuration() { return 0.0; }
  261. // motions must report their priority
  262. virtual LLJoint::JointPriority getPriority() { return LLJoint::HIGH_PRIORITY; }
  263. virtual LLMotionBlendType getBlendType() { return ADDITIVE_BLEND; }
  264. // called to determine when a motion should be activated/deactivated based on avatar pixel coverage
  265. virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_BODY_NOISE; }
  266. // run-time (post constructor) initialization,
  267. // called after parameters have been set
  268. // must return true to indicate success and be available for activation
  269. virtual LLMotionInitStatus onInitialize(LLCharacter *character)
  270. {
  271. if( !mTorsoState->setJoint( character->getJoint("mTorso") ))
  272. {
  273. return STATUS_FAILURE;
  274. }
  275. mTorsoState->setUsage(LLJointState::ROT);
  276. addJointState( mTorsoState );
  277. return STATUS_SUCCESS;
  278. }
  279. // called when a motion is activated
  280. // must return TRUE to indicate success, or else
  281. // it will be deactivated
  282. virtual BOOL onActivate() { return TRUE; }
  283. // called per time step
  284. // must return TRUE while it is active, and
  285. // must return FALSE when the motion is completed.
  286. virtual BOOL onUpdate(F32 time, U8* joint_mask)
  287. {
  288. F32 nx[2];
  289. nx[0]=time*TORSO_NOISE_SPEED;
  290. nx[1]=0.0f;
  291. F32 ny[2];
  292. ny[0]=0.0f;
  293. ny[1]=time*TORSO_NOISE_SPEED;
  294. F32 noiseX = noise2(nx);
  295. F32 noiseY = noise2(ny);
  296. F32 rx = TORSO_NOISE_AMOUNT * DEG_TO_RAD * noiseX / 0.42f;
  297. F32 ry = TORSO_NOISE_AMOUNT * DEG_TO_RAD * noiseY / 0.42f;
  298. LLQuaternion tQn;
  299. tQn.setQuat( rx, ry, 0.0f );
  300. mTorsoState->setRotation( tQn );
  301. return TRUE;
  302. }
  303. // called when a motion is deactivated
  304. virtual void onDeactivate() {}
  305. private:
  306. //-------------------------------------------------------------------------
  307. // joint states to be animated
  308. //-------------------------------------------------------------------------
  309. LLPointer<LLJointState> mTorsoState;
  310. };
  311. //-----------------------------------------------------------------------------
  312. // class LLBreatheMotionRot
  313. //-----------------------------------------------------------------------------
  314. class LLBreatheMotionRot :
  315. public LLMotion
  316. {
  317. public:
  318. // Constructor
  319. LLBreatheMotionRot(const LLUUID &id) :
  320. LLMotion(id),
  321. mBreatheRate(1.f),
  322. mCharacter(NULL)
  323. {
  324. mName = "breathe_rot";
  325. mChestState = new LLJointState;
  326. }
  327. // Destructor
  328. virtual ~LLBreatheMotionRot() {}
  329. public:
  330. //-------------------------------------------------------------------------
  331. // functions to support MotionController and MotionRegistry
  332. //-------------------------------------------------------------------------
  333. // static constructor
  334. // all subclasses must implement such a function and register it
  335. static LLMotion *create(const LLUUID &id) { return new LLBreatheMotionRot(id); }
  336. public:
  337. //-------------------------------------------------------------------------
  338. // animation callbacks to be implemented by subclasses
  339. //-------------------------------------------------------------------------
  340. // motions must specify whether or not they loop
  341. virtual BOOL getLoop() { return TRUE; }
  342. // motions must report their total duration
  343. virtual F32 getDuration() { return 0.0; }
  344. // motions must report their "ease in" duration
  345. virtual F32 getEaseInDuration() { return 0.0; }
  346. // motions must report their "ease out" duration.
  347. virtual F32 getEaseOutDuration() { return 0.0; }
  348. // motions must report their priority
  349. virtual LLJoint::JointPriority getPriority() { return LLJoint::MEDIUM_PRIORITY; }
  350. virtual LLMotionBlendType getBlendType() { return NORMAL_BLEND; }
  351. // called to determine when a motion should be activated/deactivated based on avatar pixel coverage
  352. virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_BREATHE; }
  353. // run-time (post constructor) initialization,
  354. // called after parameters have been set
  355. // must return true to indicate success and be available for activation
  356. virtual LLMotionInitStatus onInitialize(LLCharacter *character)
  357. {
  358. mCharacter = character;
  359. BOOL success = true;
  360. if ( !mChestState->setJoint( character->getJoint( "mChest" ) ) ) { success = false; }
  361. if ( success )
  362. {
  363. mChestState->setUsage(LLJointState::ROT);
  364. addJointState( mChestState );
  365. }
  366. if ( success )
  367. {
  368. return STATUS_SUCCESS;
  369. }
  370. else
  371. {
  372. return STATUS_FAILURE;
  373. }
  374. }
  375. // called when a motion is activated
  376. // must return TRUE to indicate success, or else
  377. // it will be deactivated
  378. virtual BOOL onActivate() { return TRUE; }
  379. // called per time step
  380. // must return TRUE while it is active, and
  381. // must return FALSE when the motion is completed.
  382. virtual BOOL onUpdate(F32 time, U8* joint_mask)
  383. {
  384. mBreatheRate = 1.f;
  385. F32 breathe_amt = (sinf(mBreatheRate * time) * BREATHE_ROT_MOTION_STRENGTH);
  386. mChestState->setRotation(LLQuaternion(breathe_amt, LLVector3(0.f, 1.f, 0.f)));
  387. return TRUE;
  388. }
  389. // called when a motion is deactivated
  390. virtual void onDeactivate() {}
  391. private:
  392. //-------------------------------------------------------------------------
  393. // joint states to be animated
  394. //-------------------------------------------------------------------------
  395. LLPointer<LLJointState> mChestState;
  396. F32 mBreatheRate;
  397. LLCharacter* mCharacter;
  398. };
  399. //-----------------------------------------------------------------------------
  400. // class LLPelvisFixMotion
  401. //-----------------------------------------------------------------------------
  402. class LLPelvisFixMotion :
  403. public LLMotion
  404. {
  405. public:
  406. // Constructor
  407. LLPelvisFixMotion(const LLUUID &id)
  408. : LLMotion(id), mCharacter(NULL)
  409. {
  410. mName = "pelvis_fix";
  411. mPelvisState = new LLJointState;
  412. }
  413. // Destructor
  414. virtual ~LLPelvisFixMotion() { }
  415. public:
  416. //-------------------------------------------------------------------------
  417. // functions to support MotionController and MotionRegistry
  418. //-------------------------------------------------------------------------
  419. // static constructor
  420. // all subclasses must implement such a function and register it
  421. static LLMotion *create(const LLUUID& id) { return new LLPelvisFixMotion(id); }
  422. public:
  423. //-------------------------------------------------------------------------
  424. // animation callbacks to be implemented by subclasses
  425. //-------------------------------------------------------------------------
  426. // motions must specify whether or not they loop
  427. virtual BOOL getLoop() { return TRUE; }
  428. // motions must report their total duration
  429. virtual F32 getDuration() { return 0.0; }
  430. // motions must report their "ease in" duration
  431. virtual F32 getEaseInDuration() { return 0.5f; }
  432. // motions must report their "ease out" duration.
  433. virtual F32 getEaseOutDuration() { return 0.5f; }
  434. // motions must report their priority
  435. virtual LLJoint::JointPriority getPriority() { return LLJoint::LOW_PRIORITY; }
  436. virtual LLMotionBlendType getBlendType() { return NORMAL_BLEND; }
  437. // called to determine when a motion should be activated/deactivated based on avatar pixel coverage
  438. virtual F32 getMinPixelArea() { return MIN_REQUIRED_PIXEL_AREA_PELVIS_FIX; }
  439. // run-time (post constructor) initialization,
  440. // called after parameters have been set
  441. // must return true to indicate success and be available for activation
  442. virtual LLMotionInitStatus onInitialize(LLCharacter *character)
  443. {
  444. mCharacter = character;
  445. if (!mPelvisState->setJoint( character->getJoint("mPelvis")))
  446. {
  447. return STATUS_FAILURE;
  448. }
  449. mPelvisState->setUsage(LLJointState::POS);
  450. addJointState( mPelvisState );
  451. return STATUS_SUCCESS;
  452. }
  453. // called when a motion is activated
  454. // must return TRUE to indicate success, or else
  455. // it will be deactivated
  456. virtual BOOL onActivate() { return TRUE; }
  457. // called per time step
  458. // must return TRUE while it is active, and
  459. // must return FALSE when the motion is completed.
  460. virtual BOOL onUpdate(F32 time, U8* joint_mask)
  461. {
  462. mPelvisState->setPosition(LLVector3::zero);
  463. return TRUE;
  464. }
  465. // called when a motion is deactivated
  466. virtual void onDeactivate() {}
  467. private:
  468. //-------------------------------------------------------------------------
  469. // joint states to be animated
  470. //-------------------------------------------------------------------------
  471. LLPointer<LLJointState> mPelvisState;
  472. LLCharacter* mCharacter;
  473. };
  474. /**
  475.  **
  476.  ** End LLVOAvatar Support classes
  477.  **                                                                             **
  478.  *********************************************************************************/
  479. //-----------------------------------------------------------------------------
  480. // Static Data
  481. //-----------------------------------------------------------------------------
  482. LLXmlTree LLVOAvatar::sXMLTree;
  483. LLXmlTree LLVOAvatar::sSkeletonXMLTree;
  484. LLVOAvatarSkeletonInfo* LLVOAvatar::sAvatarSkeletonInfo = NULL;
  485. LLVOAvatar::LLVOAvatarXmlInfo* LLVOAvatar::sAvatarXmlInfo = NULL;
  486. LLVOAvatarDictionary *LLVOAvatar::sAvatarDictionary = NULL;
  487. S32 LLVOAvatar::sFreezeCounter = 0;
  488. S32 LLVOAvatar::sMaxVisible = 50;
  489. F32 LLVOAvatar::sRenderDistance = 256.f;
  490. S32 LLVOAvatar::sNumVisibleAvatars = 0;
  491. S32 LLVOAvatar::sNumLODChangesThisFrame = 0;
  492. const LLUUID LLVOAvatar::sStepSoundOnLand = LLUUID("e8af4a28-aa83-4310-a7c4-c047e15ea0df");
  493. const LLUUID LLVOAvatar::sStepSounds[LL_MCODE_END] =
  494. {
  495. LLUUID(SND_STONE_RUBBER),
  496. LLUUID(SND_METAL_RUBBER),
  497. LLUUID(SND_GLASS_RUBBER),
  498. LLUUID(SND_WOOD_RUBBER),
  499. LLUUID(SND_FLESH_RUBBER),
  500. LLUUID(SND_RUBBER_PLASTIC),
  501. LLUUID(SND_RUBBER_RUBBER)
  502. };
  503. S32 LLVOAvatar::sRenderName = RENDER_NAME_ALWAYS;
  504. BOOL LLVOAvatar::sRenderGroupTitles = TRUE;
  505. S32 LLVOAvatar::sNumVisibleChatBubbles = 0;
  506. BOOL LLVOAvatar::sDebugInvisible = FALSE;
  507. BOOL LLVOAvatar::sShowAttachmentPoints = FALSE;
  508. BOOL LLVOAvatar::sShowAnimationDebug = FALSE;
  509. BOOL LLVOAvatar::sShowFootPlane = FALSE;
  510. BOOL LLVOAvatar::sVisibleInFirstPerson = FALSE;
  511. F32 LLVOAvatar::sLODFactor = 1.f;
  512. BOOL LLVOAvatar::sUseImpostors = FALSE;
  513. BOOL LLVOAvatar::sJointDebug = FALSE;
  514. F32 LLVOAvatar::sUnbakedTime = 0.f;
  515. F32 LLVOAvatar::sUnbakedUpdateTime = 0.f;
  516. F32 LLVOAvatar::sGreyTime = 0.f;
  517. F32 LLVOAvatar::sGreyUpdateTime = 0.f;
  518. //-----------------------------------------------------------------------------
  519. // Helper functions
  520. //-----------------------------------------------------------------------------
  521. static F32 calc_bouncy_animation(F32 x);
  522. //-----------------------------------------------------------------------------
  523. // LLVOAvatar()
  524. //-----------------------------------------------------------------------------
  525. LLVOAvatar::LLVOAvatar(const LLUUID& id,
  526.    const LLPCode pcode,
  527.    LLViewerRegion* regionp) :
  528. LLViewerObject(id, pcode, regionp),
  529. mIsDummy(FALSE),
  530. mSpecialRenderMode(0),
  531. mTurning(FALSE),
  532. mPelvisToFoot(0.f),
  533. mLastSkeletonSerialNum( 0 ),
  534. mHeadOffset(),
  535. mIsSitting(FALSE),
  536. mTimeVisible(),
  537. mTyping(FALSE),
  538. mMeshValid(FALSE),
  539. mVisible(FALSE),
  540. mWindFreq(0.f),
  541. mRipplePhase( 0.f ),
  542. mBelowWater(FALSE),
  543. mLastAppearanceBlendTime(0.f),
  544. mAppearanceAnimating(FALSE),
  545. mNameString(),
  546. mTitle(),
  547. mNameAway(FALSE),
  548. mNameBusy(FALSE),
  549. mNameMute(FALSE),
  550. mRenderGroupTitles(sRenderGroupTitles),
  551. mNameAppearance(FALSE),
  552. mFirstTEMessageReceived( FALSE ),
  553. mFirstAppearanceMessageReceived( FALSE ),
  554. mCulled( FALSE ),
  555. mVisibilityRank(0),
  556. mTexSkinColor( NULL ),
  557. mTexHairColor( NULL ),
  558. mTexEyeColor( NULL ),
  559. mNeedsSkin(FALSE),
  560. mUpdatePeriod(1),
  561. mFullyLoadedInitialized(FALSE),
  562. mSupportsAlphaLayers(FALSE)
  563. {
  564. LLMemType mt(LLMemType::MTYPE_AVATAR);
  565. //VTResume();  // VTune
  566. // mVoiceVisualizer is created by the hud effects manager and uses the HUD Effects pipeline
  567. const BOOL needsSendToSim = false; // currently, this HUD effect doesn't need to pack and unpack data to do its job
  568. mVoiceVisualizer = ( LLVoiceVisualizer *)LLHUDManager::getInstance()->createViewerEffect( LLHUDObject::LL_HUD_EFFECT_VOICE_VISUALIZER, needsSendToSim );
  569. lldebugs << "LLVOAvatar Constructor (0x" << this << ") id:" << mID << llendl;
  570. mPelvisp = NULL;
  571. mBakedTextureDatas.resize(BAKED_NUM_INDICES);
  572. for (U32 i = 0; i < mBakedTextureDatas.size(); i++ )
  573. {
  574. mBakedTextureDatas[i].mLastTextureIndex = IMG_DEFAULT_AVATAR;
  575. mBakedTextureDatas[i].mTexLayerSet = NULL;
  576. mBakedTextureDatas[i].mIsLoaded = false;
  577. mBakedTextureDatas[i].mIsUsed = false;
  578. mBakedTextureDatas[i].mMaskTexName = 0;
  579. mBakedTextureDatas[i].mTextureIndex = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)i);
  580. }
  581. mDirtyMesh = TRUE; // Dirty geometry, need to regenerate.
  582. mMeshTexturesDirty = FALSE;
  583. mShadow0Facep = NULL;
  584. mShadow1Facep = NULL;
  585. mHeadp = NULL;
  586. mIsBuilt = FALSE;
  587. mNumJoints = 0;
  588. mSkeleton = NULL;
  589. mNumCollisionVolumes = 0;
  590. mCollisionVolumes = NULL;
  591. // set up animation variables
  592. mSpeed = 0.f;
  593. setAnimationData("Speed", &mSpeed);
  594. mNeedsImpostorUpdate = TRUE;
  595. mNeedsAnimUpdate = TRUE;
  596. mImpostorDistance = 0;
  597. mImpostorPixelArea = 0;
  598. setNumTEs(TEX_NUM_INDICES);
  599. mbCanSelect = TRUE;
  600. mSignaledAnimations.clear();
  601. mPlayingAnimations.clear();
  602. mWasOnGroundLeft = FALSE;
  603. mWasOnGroundRight = FALSE;
  604. mTimeLast = 0.0f;
  605. mSpeedAccum = 0.0f;
  606. mRippleTimeLast = 0.f;
  607. mShadowImagep = LLViewerTextureManager::getFetchedTextureFromFile("foot_shadow.j2c");
  608. // GL NOT ACTIVE HERE
  609. //gGL.getTexUnit(0)->bind(mShadowImagep.get());
  610. //mShadowImagep->setAddressMode(LLTexUnit::TAM_CLAMP);
  611. mInAir = FALSE;
  612. mStepOnLand = TRUE;
  613. mStepMaterial = 0;
  614. mLipSyncActive = false;
  615. mOohMorph      = NULL;
  616. mAahMorph      = NULL;
  617. mCurrentGesticulationLevel = 0;
  618. }
  619. //------------------------------------------------------------------------
  620. // LLVOAvatar::~LLVOAvatar()
  621. //------------------------------------------------------------------------
  622. LLVOAvatar::~LLVOAvatar()
  623. {
  624. lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl;
  625. if (isSelf())
  626. {
  627. gAgent.setAvatarObject(NULL);
  628. }
  629. mRoot.removeAllChildren();
  630. deleteAndClearArray(mSkeleton);
  631. deleteAndClearArray(mCollisionVolumes);
  632. mNumJoints = 0;
  633. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  634. {
  635. deleteAndClear(mBakedTextureDatas[i].mTexLayerSet);
  636. mBakedTextureDatas[i].mMeshes.clear();
  637. for (morph_list_t::iterator iter2 = mBakedTextureDatas[i].mMaskedMorphs.begin();
  638.  iter2 != mBakedTextureDatas[i].mMaskedMorphs.end(); iter2++)
  639. {
  640. LLMaskedMorph* masked_morph = (*iter2);
  641. delete masked_morph;
  642. }
  643. }
  644. std::for_each(mAttachmentPoints.begin(), mAttachmentPoints.end(), DeletePairedPointer());
  645. mAttachmentPoints.clear();
  646. deleteAndClear(mTexSkinColor);
  647. deleteAndClear(mTexHairColor);
  648. deleteAndClear(mTexEyeColor);
  649. std::for_each(mMeshes.begin(), mMeshes.end(), DeletePairedPointer());
  650. mMeshes.clear();
  651. for (std::vector<LLViewerJoint*>::iterator jointIter = mMeshLOD.begin();
  652.  jointIter != mMeshLOD.end(); 
  653.  ++jointIter)
  654. {
  655. LLViewerJoint* joint = (LLViewerJoint *) *jointIter;
  656. std::for_each(joint->mMeshParts.begin(), joint->mMeshParts.end(), DeletePointer());
  657. joint->mMeshParts.clear();
  658. }
  659. std::for_each(mMeshLOD.begin(), mMeshLOD.end(), DeletePointer());
  660. mMeshLOD.clear();
  661. mDead = TRUE;
  662. mAnimationSources.clear();
  663. lldebugs << "LLVOAvatar Destructor end" << llendl;
  664. }
  665. void LLVOAvatar::markDead()
  666. {
  667. if (mNameText)
  668. {
  669. mNameText->markDead();
  670. mNameText = NULL;
  671. sNumVisibleChatBubbles--;
  672. }
  673. mVoiceVisualizer->markDead();
  674. LLViewerObject::markDead();
  675. }
  676. BOOL LLVOAvatar::isFullyBaked()
  677. {
  678. if (mIsDummy) return TRUE;
  679. if (getNumTEs() == 0) return FALSE;
  680. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  681. {
  682. if (!isTextureDefined(mBakedTextureDatas[i].mTextureIndex)
  683. && ( (i != BAKED_SKIRT) || isWearingWearableType(WT_SKIRT) ) )
  684. {
  685. return FALSE;
  686. }
  687. }
  688. return TRUE;
  689. }
  690. void LLVOAvatar::deleteLayerSetCaches(bool clearAll)
  691. {
  692. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  693. {
  694. if (mBakedTextureDatas[i].mTexLayerSet)
  695. {
  696. // ! BACKWARDS COMPATIBILITY !
  697. // Can be removed after hair baking is mandatory on the grid
  698. if ((i != BAKED_HAIR || isSelf()) && !clearAll)
  699. {
  700. mBakedTextureDatas[i].mTexLayerSet->deleteCaches();
  701. }
  702. }
  703. if (mBakedTextureDatas[i].mMaskTexName)
  704. {
  705. glDeleteTextures(1, (GLuint*)&(mBakedTextureDatas[i].mMaskTexName));
  706. mBakedTextureDatas[i].mMaskTexName = 0 ;
  707. }
  708. }
  709. }
  710. // static 
  711. BOOL LLVOAvatar::areAllNearbyInstancesBaked(S32& grey_avatars)
  712. {
  713. BOOL res = TRUE;
  714. grey_avatars = 0;
  715. for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
  716.  iter != LLCharacter::sInstances.end(); ++iter)
  717. {
  718. LLVOAvatar* inst = (LLVOAvatar*) *iter;
  719. if( inst->isDead() )
  720. {
  721. continue;
  722. }
  723. else if( !inst->isFullyBaked() )
  724. {
  725. res = FALSE;
  726. if (inst->mHasGrey)
  727. {
  728. ++grey_avatars;
  729. }
  730. }
  731. }
  732. return res;
  733. }
  734. // static
  735. void LLVOAvatar::dumpBakedStatus()
  736. {
  737. LLVector3d camera_pos_global = gAgent.getCameraPositionGlobal();
  738. for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
  739.  iter != LLCharacter::sInstances.end(); ++iter)
  740. {
  741. LLVOAvatar* inst = (LLVOAvatar*) *iter;
  742. llinfos << "Avatar ";
  743. LLNameValue* firstname = inst->getNVPair("FirstName");
  744. LLNameValue* lastname = inst->getNVPair("LastName");
  745. if( firstname )
  746. {
  747. llcont << firstname->getString();
  748. }
  749. if( lastname )
  750. {
  751. llcont << " " << lastname->getString();
  752. }
  753. llcont << " " << inst->mID;
  754. if( inst->isDead() )
  755. {
  756. llcont << " DEAD ("<< inst->getNumRefs() << " refs)";
  757. }
  758. if( inst->isSelf() )
  759. {
  760. llcont << " (self)";
  761. }
  762. F64 dist_to_camera = (inst->getPositionGlobal() - camera_pos_global).length();
  763. llcont << " " << dist_to_camera << "m ";
  764. llcont << " " << inst->mPixelArea << " pixels";
  765. if( inst->isVisible() )
  766. {
  767. llcont << " (visible)";
  768. }
  769. else
  770. {
  771. llcont << " (not visible)";
  772. }
  773. if( inst->isFullyBaked() )
  774. {
  775. llcont << " Baked";
  776. }
  777. else
  778. {
  779. llcont << " Unbaked (";
  780. for (LLVOAvatarDictionary::BakedTextures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
  781.  iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
  782.  ++iter)
  783. {
  784. const LLVOAvatarDictionary::BakedEntry *baked_dict = iter->second;
  785. const ETextureIndex index = baked_dict->mTextureIndex;
  786. if (!inst->isTextureDefined(index))
  787. {
  788. llcont << " " << LLVOAvatarDictionary::getInstance()->getTexture(index)->mName;
  789. }
  790. }
  791. llcont << " ) " << inst->getUnbakedPixelAreaRank();
  792. if( inst->isCulled() )
  793. {
  794. llcont << " culled";
  795. }
  796. }
  797. llcont << llendl;
  798. }
  799. }
  800. //static
  801. void LLVOAvatar::restoreGL()
  802. {
  803. LLVOAvatar* self = gAgent.getAvatarObject();
  804. if (!self)
  805. return;
  806. self->setCompositeUpdatesEnabled(TRUE);
  807. for (U32 i = 0; i < self->mBakedTextureDatas.size(); i++)
  808. {
  809. self->invalidateComposite(self->mBakedTextureDatas[i].mTexLayerSet, FALSE);
  810. }
  811. self->updateMeshTextures();
  812. }
  813. //static
  814. void LLVOAvatar::destroyGL()
  815. {
  816. deleteCachedImages();
  817. resetImpostors();
  818. }
  819. //static
  820. void LLVOAvatar::resetImpostors()
  821. {
  822. for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
  823.  iter != LLCharacter::sInstances.end(); ++iter)
  824. {
  825. LLVOAvatar* avatar = (LLVOAvatar*) *iter;
  826. avatar->mImpostor.release();
  827. }
  828. }
  829. // static
  830. void LLVOAvatar::deleteCachedImages(bool clearAll)
  831. {
  832. if (LLTexLayerSet::sHasCaches)
  833. {
  834. lldebugs << "Deleting layer set caches" << llendl;
  835. for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
  836.  iter != LLCharacter::sInstances.end(); ++iter)
  837. {
  838. LLVOAvatar* inst = (LLVOAvatar*) *iter;
  839. inst->deleteLayerSetCaches(clearAll);
  840. }
  841. LLTexLayerSet::sHasCaches = FALSE;
  842. }
  843. LLVOAvatarSelf::deleteScratchTextures();
  844. LLTexLayerStaticImageList::getInstance()->deleteCachedImages();
  845. }
  846. //------------------------------------------------------------------------
  847. // static
  848. // LLVOAvatar::initClass()
  849. //------------------------------------------------------------------------
  850. void LLVOAvatar::initClass()
  851. std::string xmlFile;
  852. xmlFile = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,AVATAR_DEFAULT_CHAR) + "_lad.xml";
  853. BOOL success = sXMLTree.parseFile( xmlFile, FALSE );
  854. if (!success)
  855. {
  856. llerrs << "Problem reading avatar configuration file:" << xmlFile << llendl;
  857. }
  858. // now sanity check xml file
  859. LLXmlTreeNode* root = sXMLTree.getRoot();
  860. if (!root) 
  861. {
  862. llerrs << "No root node found in avatar configuration file: " << xmlFile << llendl;
  863. return;
  864. }
  865. //-------------------------------------------------------------------------
  866. // <linden_avatar version="1.0"> (root)
  867. //-------------------------------------------------------------------------
  868. if( !root->hasName( "linden_avatar" ) )
  869. {
  870. llerrs << "Invalid avatar file header: " << xmlFile << llendl;
  871. }
  872. std::string version;
  873. static LLStdStringHandle version_string = LLXmlTree::addAttributeString("version");
  874. if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") )
  875. {
  876. llerrs << "Invalid avatar file version: " << version << " in file: " << xmlFile << llendl;
  877. }
  878. S32 wearable_def_version = 1;
  879. static LLStdStringHandle wearable_definition_version_string = LLXmlTree::addAttributeString("wearable_definition_version");
  880. root->getFastAttributeS32( wearable_definition_version_string, wearable_def_version );
  881. LLWearable::setCurrentDefinitionVersion( wearable_def_version );
  882. std::string mesh_file_name;
  883. LLXmlTreeNode* skeleton_node = root->getChildByName( "skeleton" );
  884. if (!skeleton_node)
  885. {
  886. llerrs << "No skeleton in avatar configuration file: " << xmlFile << llendl;
  887. return;
  888. }
  889. std::string skeleton_file_name;
  890. static LLStdStringHandle file_name_string = LLXmlTree::addAttributeString("file_name");
  891. if (!skeleton_node->getFastAttributeString(file_name_string, skeleton_file_name))
  892. {
  893. llerrs << "No file name in skeleton node in avatar config file: " << xmlFile << llendl;
  894. }
  895. std::string skeleton_path;
  896. skeleton_path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,skeleton_file_name);
  897. if (!parseSkeletonFile(skeleton_path))
  898. {
  899. llerrs << "Error parsing skeleton file: " << skeleton_path << llendl;
  900. }
  901. // Process XML data
  902. // avatar_skeleton.xml
  903. llassert(!sAvatarSkeletonInfo);
  904. sAvatarSkeletonInfo = new LLVOAvatarSkeletonInfo;
  905. if (!sAvatarSkeletonInfo->parseXml(sSkeletonXMLTree.getRoot()))
  906. {
  907. llerrs << "Error parsing skeleton XML file: " << skeleton_path << llendl;
  908. }
  909. // parse avatar_lad.xml
  910. llassert(!sAvatarXmlInfo);
  911. sAvatarXmlInfo = new LLVOAvatarXmlInfo;
  912. if (!sAvatarXmlInfo->parseXmlSkeletonNode(root))
  913. {
  914. llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
  915. }
  916. if (!sAvatarXmlInfo->parseXmlMeshNodes(root))
  917. {
  918. llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
  919. }
  920. if (!sAvatarXmlInfo->parseXmlColorNodes(root))
  921. {
  922. llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
  923. }
  924. if (!sAvatarXmlInfo->parseXmlLayerNodes(root))
  925. {
  926. llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
  927. }
  928. if (!sAvatarXmlInfo->parseXmlDriverNodes(root))
  929. {
  930. llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
  931. }
  932. if (!sAvatarXmlInfo->parseXmlMorphNodes(root))
  933. {
  934. llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
  935. }
  936. }
  937. void LLVOAvatar::cleanupClass()
  938. {
  939. deleteAndClear(sAvatarXmlInfo);
  940. sSkeletonXMLTree.cleanup();
  941. sXMLTree.cleanup();
  942. }
  943. void LLVOAvatar::initInstance(void)
  944. {
  945. //-------------------------------------------------------------------------
  946. // initialize joint, mesh and shape members
  947. //-------------------------------------------------------------------------
  948. mRoot.setName( "mRoot" );
  949. for (LLVOAvatarDictionary::Meshes::const_iterator iter = LLVOAvatarDictionary::getInstance()->getMeshes().begin();
  950.  iter != LLVOAvatarDictionary::getInstance()->getMeshes().end();
  951.  ++iter)
  952. {
  953. const EMeshIndex mesh_index = iter->first;
  954. const LLVOAvatarDictionary::MeshEntry *mesh_dict = iter->second;
  955. LLViewerJoint* joint = new LLViewerJoint();
  956. joint->setName(mesh_dict->mName);
  957. joint->setMeshID(mesh_index);
  958. mMeshLOD.push_back(joint);
  959. /* mHairLOD.setName("mHairLOD");
  960.    mHairMesh0.setName("mHairMesh0");
  961.    mHairMesh0.setMeshID(MESH_ID_HAIR);
  962.    mHairMesh1.setName("mHairMesh1"); */
  963. for (U32 lod = 0; lod < mesh_dict->mLOD; lod++)
  964. {
  965. LLViewerJointMesh* mesh = new LLViewerJointMesh();
  966. std::string mesh_name = "m" + mesh_dict->mName + boost::lexical_cast<std::string>(lod);
  967. // We pre-pended an m - need to capitalize first character for camelCase
  968. mesh_name[1] = toupper(mesh_name[1]);
  969. mesh->setName(mesh_name);
  970. mesh->setMeshID(mesh_index);
  971. mesh->setPickName(mesh_dict->mPickName);
  972. mesh->setIsTransparent(FALSE);
  973. switch((int)mesh_index)
  974. {
  975. case MESH_ID_HAIR:
  976. mesh->setIsTransparent(TRUE);
  977. break;
  978. case MESH_ID_SKIRT:
  979. mesh->setIsTransparent(TRUE);
  980. break;
  981. case MESH_ID_EYEBALL_LEFT:
  982. case MESH_ID_EYEBALL_RIGHT:
  983. mesh->setSpecular( LLColor4( 1.0f, 1.0f, 1.0f, 1.0f ), 1.f );
  984. break;
  985. }
  986. joint->mMeshParts.push_back(mesh);
  987. }
  988. }
  989. //-------------------------------------------------------------------------
  990. // associate baked textures with meshes
  991. //-------------------------------------------------------------------------
  992. for (LLVOAvatarDictionary::Meshes::const_iterator iter = LLVOAvatarDictionary::getInstance()->getMeshes().begin();
  993.  iter != LLVOAvatarDictionary::getInstance()->getMeshes().end();
  994.  ++iter)
  995. {
  996. const EMeshIndex mesh_index = iter->first;
  997. const LLVOAvatarDictionary::MeshEntry *mesh_dict = iter->second;
  998. const EBakedTextureIndex baked_texture_index = mesh_dict->mBakedID;
  999. // Skip it if there's no associated baked texture.
  1000. if (baked_texture_index == BAKED_NUM_INDICES) continue;
  1001. for (std::vector<LLViewerJointMesh* >::iterator iter = mMeshLOD[mesh_index]->mMeshParts.begin();
  1002.  iter != mMeshLOD[mesh_index]->mMeshParts.end(); 
  1003.  ++iter)
  1004. {
  1005. LLViewerJointMesh* mesh = (LLViewerJointMesh*) *iter;
  1006. mBakedTextureDatas[(int)baked_texture_index].mMeshes.push_back(mesh);
  1007. }
  1008. }
  1009. //-------------------------------------------------------------------------
  1010. // register motions
  1011. //-------------------------------------------------------------------------
  1012. if (LLCharacter::sInstances.size() == 1)
  1013. {
  1014. LLKeyframeMotion::setVFS(gStaticVFS);
  1015. registerMotion( ANIM_AGENT_BUSY, LLNullMotion::create );
  1016. registerMotion( ANIM_AGENT_CROUCH, LLKeyframeStandMotion::create );
  1017. registerMotion( ANIM_AGENT_CROUCHWALK, LLKeyframeWalkMotion::create );
  1018. registerMotion( ANIM_AGENT_EXPRESS_AFRAID, LLEmote::create );
  1019. registerMotion( ANIM_AGENT_EXPRESS_ANGER, LLEmote::create );
  1020. registerMotion( ANIM_AGENT_EXPRESS_BORED, LLEmote::create );
  1021. registerMotion( ANIM_AGENT_EXPRESS_CRY, LLEmote::create );
  1022. registerMotion( ANIM_AGENT_EXPRESS_DISDAIN, LLEmote::create );
  1023. registerMotion( ANIM_AGENT_EXPRESS_EMBARRASSED, LLEmote::create );
  1024. registerMotion( ANIM_AGENT_EXPRESS_FROWN, LLEmote::create );
  1025. registerMotion( ANIM_AGENT_EXPRESS_KISS, LLEmote::create );
  1026. registerMotion( ANIM_AGENT_EXPRESS_LAUGH, LLEmote::create );
  1027. registerMotion( ANIM_AGENT_EXPRESS_OPEN_MOUTH, LLEmote::create );
  1028. registerMotion( ANIM_AGENT_EXPRESS_REPULSED, LLEmote::create );
  1029. registerMotion( ANIM_AGENT_EXPRESS_SAD, LLEmote::create );
  1030. registerMotion( ANIM_AGENT_EXPRESS_SHRUG, LLEmote::create );
  1031. registerMotion( ANIM_AGENT_EXPRESS_SMILE, LLEmote::create );
  1032. registerMotion( ANIM_AGENT_EXPRESS_SURPRISE, LLEmote::create );
  1033. registerMotion( ANIM_AGENT_EXPRESS_TONGUE_OUT, LLEmote::create );
  1034. registerMotion( ANIM_AGENT_EXPRESS_TOOTHSMILE, LLEmote::create );
  1035. registerMotion( ANIM_AGENT_EXPRESS_WINK, LLEmote::create );
  1036. registerMotion( ANIM_AGENT_EXPRESS_WORRY, LLEmote::create );
  1037. registerMotion( ANIM_AGENT_RUN, LLKeyframeWalkMotion::create );
  1038. registerMotion( ANIM_AGENT_STAND, LLKeyframeStandMotion::create );
  1039. registerMotion( ANIM_AGENT_STAND_1, LLKeyframeStandMotion::create );
  1040. registerMotion( ANIM_AGENT_STAND_2, LLKeyframeStandMotion::create );
  1041. registerMotion( ANIM_AGENT_STAND_3, LLKeyframeStandMotion::create );
  1042. registerMotion( ANIM_AGENT_STAND_4, LLKeyframeStandMotion::create );
  1043. registerMotion( ANIM_AGENT_STANDUP, LLKeyframeFallMotion::create );
  1044. registerMotion( ANIM_AGENT_TURNLEFT, LLKeyframeWalkMotion::create );
  1045. registerMotion( ANIM_AGENT_TURNRIGHT, LLKeyframeWalkMotion::create );
  1046. registerMotion( ANIM_AGENT_WALK, LLKeyframeWalkMotion::create );
  1047. // motions without a start/stop bit
  1048. registerMotion( ANIM_AGENT_BODY_NOISE, LLBodyNoiseMotion::create );
  1049. registerMotion( ANIM_AGENT_BREATHE_ROT, LLBreatheMotionRot::create );
  1050. registerMotion( ANIM_AGENT_EDITING, LLEditingMotion::create );
  1051. registerMotion( ANIM_AGENT_EYE, LLEyeMotion::create );
  1052. registerMotion( ANIM_AGENT_FEMALE_WALK, LLKeyframeWalkMotion::create );
  1053. registerMotion( ANIM_AGENT_FLY_ADJUST, LLFlyAdjustMotion::create );
  1054. registerMotion( ANIM_AGENT_HAND_MOTION, LLHandMotion::create );
  1055. registerMotion( ANIM_AGENT_HEAD_ROT, LLHeadRotMotion::create );
  1056. registerMotion( ANIM_AGENT_PELVIS_FIX, LLPelvisFixMotion::create );
  1057. registerMotion( ANIM_AGENT_SIT_FEMALE, LLKeyframeMotion::create );
  1058. registerMotion( ANIM_AGENT_TARGET, LLTargetingMotion::create );
  1059. registerMotion( ANIM_AGENT_WALK_ADJUST, LLWalkAdjustMotion::create );
  1060. }
  1061. if (gNoRender)
  1062. {
  1063. return;
  1064. }
  1065. buildCharacter();
  1066. if (gNoRender)
  1067. {
  1068. return;
  1069. }
  1070. // preload specific motions here
  1071. createMotion( ANIM_AGENT_CUSTOMIZE);
  1072. createMotion( ANIM_AGENT_CUSTOMIZE_DONE);
  1073. //VTPause();  // VTune
  1074. mVoiceVisualizer->setVoiceEnabled( gVoiceClient->getVoiceEnabled( mID ) );
  1075. }
  1076. const LLVector3 LLVOAvatar::getRenderPosition() const
  1077. {
  1078. if (mDrawable.isNull() || mDrawable->getGeneration() < 0)
  1079. {
  1080. return getPositionAgent();
  1081. }
  1082. else if (isRoot())
  1083. {
  1084. return mDrawable->getPositionAgent();
  1085. }
  1086. else
  1087. {
  1088. return getPosition() * mDrawable->getParent()->getRenderMatrix();
  1089. }
  1090. }
  1091. void LLVOAvatar::updateDrawable(BOOL force_damped)
  1092. {
  1093. clearChanged(SHIFTED);
  1094. }
  1095. void LLVOAvatar::onShift(const LLVector3& shift_vector)
  1096. {
  1097. mLastAnimExtents[0] += shift_vector;
  1098. mLastAnimExtents[1] += shift_vector;
  1099. mNeedsImpostorUpdate = TRUE;
  1100. mNeedsAnimUpdate = TRUE;
  1101. }
  1102. void LLVOAvatar::updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax)
  1103. {
  1104. if (isImpostor() && !needsImpostorUpdate())
  1105. {
  1106. LLVector3 delta = getRenderPosition() -
  1107. ((LLVector3(mDrawable->getPositionGroup())-mImpostorOffset));
  1108. newMin = mLastAnimExtents[0] + delta;
  1109. newMax = mLastAnimExtents[1] + delta;
  1110. }
  1111. else
  1112. {
  1113. getSpatialExtents(newMin,newMax);
  1114. mLastAnimExtents[0] = newMin;
  1115. mLastAnimExtents[1] = newMax;
  1116. LLVector3 pos_group = (newMin+newMax)*0.5f;
  1117. mImpostorOffset = pos_group-getRenderPosition();
  1118. mDrawable->setPositionGroup(pos_group);
  1119. }
  1120. }
  1121. void LLVOAvatar::getSpatialExtents(LLVector3& newMin, LLVector3& newMax)
  1122. {
  1123. LLVector3 buffer(0.25f, 0.25f, 0.25f);
  1124. LLVector3 pos = getRenderPosition();
  1125. newMin = pos - buffer;
  1126. newMax = pos + buffer;
  1127. float max_attachment_span = DEFAULT_MAX_PRIM_SCALE * 5.0f;
  1128. //stretch bounding box by joint positions
  1129. for (polymesh_map_t::iterator i = mMeshes.begin(); i != mMeshes.end(); ++i)
  1130. {
  1131. LLPolyMesh* mesh = i->second;
  1132. for (S32 joint_num = 0; joint_num < mesh->mJointRenderData.count(); joint_num++)
  1133. {
  1134. update_min_max(newMin, newMax, 
  1135.    mesh->mJointRenderData[joint_num]->mWorldMatrix->getTranslation());
  1136. }
  1137. }
  1138. mPixelArea = LLPipeline::calcPixelArea((newMin+newMax)*0.5f, (newMax-newMin)*0.5f, *LLViewerCamera::getInstance());
  1139. //stretch bounding box by attachments
  1140. for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
  1141.  iter != mAttachmentPoints.end();
  1142.  ++iter)
  1143. {
  1144. LLViewerJointAttachment* attachment = iter->second;
  1145. if (!attachment->getValid())
  1146. {
  1147. continue ;
  1148. }
  1149. for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
  1150.  attachment_iter != attachment->mAttachedObjects.end();
  1151.  ++attachment_iter)
  1152. {
  1153. const LLViewerObject* attached_object = (*attachment_iter);
  1154. if (attached_object && !attached_object->isHUDAttachment())
  1155. {
  1156. LLDrawable* drawable = attached_object->mDrawable;
  1157. if (drawable)
  1158. {
  1159. LLSpatialBridge* bridge = drawable->getSpatialBridge();
  1160. if (bridge)
  1161. {
  1162. const LLVector3* ext = bridge->getSpatialExtents();
  1163. LLVector3 distance = (ext[1] - ext[0]);
  1164. // Only add the prim to spatial extents calculations if it isn't a megaprim.
  1165. // max_attachment_span calculated at the start of the function 
  1166. // (currently 5 times our max prim size) 
  1167. if (distance.mV[0] < max_attachment_span 
  1168. && distance.mV[1] < max_attachment_span
  1169. && distance.mV[2] < max_attachment_span)
  1170. {
  1171. update_min_max(newMin,newMax,ext[0]);
  1172. update_min_max(newMin,newMax,ext[1]);
  1173. }
  1174. }
  1175. }
  1176. }
  1177. }
  1178. }
  1179. //pad bounding box
  1180. newMin -= buffer;
  1181. newMax += buffer;
  1182. }
  1183. //-----------------------------------------------------------------------------
  1184. // renderCollisionVolumes()
  1185. //-----------------------------------------------------------------------------
  1186. void LLVOAvatar::renderCollisionVolumes()
  1187. {
  1188. for (S32 i = 0; i < mNumCollisionVolumes; i++)
  1189. {
  1190. mCollisionVolumes[i].renderCollision();
  1191. }
  1192. if (mNameText.notNull())
  1193. {
  1194. LLVector3 unused;
  1195. mNameText->lineSegmentIntersect(LLVector3(0,0,0), LLVector3(0,0,1), unused, TRUE);
  1196. }
  1197. }
  1198. BOOL LLVOAvatar::lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
  1199.   S32 face,
  1200.   BOOL pick_transparent,
  1201.   S32* face_hit,
  1202.   LLVector3* intersection,
  1203.   LLVector2* tex_coord,
  1204.   LLVector3* normal,
  1205.   LLVector3* bi_normal)
  1206. {
  1207. if ((isSelf() && !gAgent.needsRenderAvatar()) || !LLPipeline::sPickAvatar)
  1208. {
  1209. return FALSE;
  1210. }
  1211. if (lineSegmentBoundingBox(start, end))
  1212. {
  1213. for (S32 i = 0; i < mNumCollisionVolumes; ++i)
  1214. {
  1215. mCollisionVolumes[i].updateWorldMatrix();
  1216. glh::matrix4f mat((F32*) mCollisionVolumes[i].getXform()->getWorldMatrix().mMatrix);
  1217. glh::matrix4f inverse = mat.inverse();
  1218. glh::matrix4f norm_mat = inverse.transpose();
  1219. glh::vec3f p1(start.mV);
  1220. glh::vec3f p2(end.mV);
  1221. inverse.mult_matrix_vec(p1);
  1222. inverse.mult_matrix_vec(p2);
  1223. LLVector3 position;
  1224. LLVector3 norm;
  1225. if (linesegment_sphere(LLVector3(p1.v), LLVector3(p2.v), LLVector3(0,0,0), 1.f, position, norm))
  1226. {
  1227. glh::vec3f res_pos(position.mV);
  1228. mat.mult_matrix_vec(res_pos);
  1229. norm.normalize();
  1230. glh::vec3f res_norm(norm.mV);
  1231. norm_mat.mult_matrix_dir(res_norm);
  1232. if (intersection)
  1233. {
  1234. *intersection = LLVector3(res_pos.v);
  1235. }
  1236. if (normal)
  1237. {
  1238. *normal = LLVector3(res_norm.v);
  1239. }
  1240. return TRUE;
  1241. }
  1242. }
  1243. }
  1244. LLVector3 position;
  1245. if (mNameText.notNull() && mNameText->lineSegmentIntersect(start, end, position))
  1246. {
  1247. if (intersection)
  1248. {
  1249. *intersection = position;
  1250. }
  1251. return TRUE;
  1252. }
  1253. return FALSE;
  1254. }
  1255. //-----------------------------------------------------------------------------
  1256. // parseSkeletonFile()
  1257. //-----------------------------------------------------------------------------
  1258. BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
  1259. {
  1260. LLMemType mt(LLMemType::MTYPE_AVATAR);
  1261. //-------------------------------------------------------------------------
  1262. // parse the file
  1263. //-------------------------------------------------------------------------
  1264. BOOL parsesuccess = sSkeletonXMLTree.parseFile( filename, FALSE );
  1265. if (!parsesuccess)
  1266. {
  1267. llerrs << "Can't parse skeleton file: " << filename << llendl;
  1268. return FALSE;
  1269. }
  1270. // now sanity check xml file
  1271. LLXmlTreeNode* root = sSkeletonXMLTree.getRoot();
  1272. if (!root) 
  1273. {
  1274. llerrs << "No root node found in avatar skeleton file: " << filename << llendl;
  1275. return FALSE;
  1276. }
  1277. if( !root->hasName( "linden_skeleton" ) )
  1278. {
  1279. llerrs << "Invalid avatar skeleton file header: " << filename << llendl;
  1280. return FALSE;
  1281. }
  1282. std::string version;
  1283. static LLStdStringHandle version_string = LLXmlTree::addAttributeString("version");
  1284. if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") )
  1285. {
  1286. llerrs << "Invalid avatar skeleton file version: " << version << " in file: " << filename << llendl;
  1287. return FALSE;
  1288. }
  1289. return TRUE;
  1290. }
  1291. //-----------------------------------------------------------------------------
  1292. // setupBone()
  1293. //-----------------------------------------------------------------------------
  1294. BOOL LLVOAvatar::setupBone(const LLVOAvatarBoneInfo* info, LLViewerJoint* parent, S32 &volume_num, S32 &joint_num)
  1295. {
  1296. LLMemType mt(LLMemType::MTYPE_AVATAR);
  1297. LLViewerJoint* joint = NULL;
  1298. if (info->mIsJoint)
  1299. {
  1300. joint = (LLViewerJoint*)getCharacterJoint(joint_num);
  1301. if (!joint)
  1302. {
  1303. llwarns << "Too many bones" << llendl;
  1304. return FALSE;
  1305. }
  1306. joint->setName( info->mName );
  1307. }
  1308. else // collision volume
  1309. {
  1310. if (volume_num >= (S32)mNumCollisionVolumes)
  1311. {
  1312. llwarns << "Too many bones" << llendl;
  1313. return FALSE;
  1314. }
  1315. joint = (LLViewerJoint*)(&mCollisionVolumes[volume_num]);
  1316. joint->setName( info->mName );
  1317. }
  1318. // add to parent
  1319. if (parent)
  1320. {
  1321. parent->addChild( joint );
  1322. }
  1323. joint->setPosition(info->mPos);
  1324. joint->setRotation(mayaQ(info->mRot.mV[VX], info->mRot.mV[VY],
  1325.  info->mRot.mV[VZ], LLQuaternion::XYZ));
  1326. joint->setScale(info->mScale);
  1327. if (info->mIsJoint)
  1328. {
  1329. joint->setSkinOffset( info->mPivot );
  1330. joint_num++;
  1331. }
  1332. else // collision volume
  1333. {
  1334. volume_num++;
  1335. }
  1336. // setup children
  1337. LLVOAvatarBoneInfo::child_list_t::const_iterator iter;
  1338. for (iter = info->mChildList.begin(); iter != info->mChildList.end(); ++iter)
  1339. {
  1340. LLVOAvatarBoneInfo *child_info = *iter;
  1341. if (!setupBone(child_info, joint, volume_num, joint_num))
  1342. {
  1343. return FALSE;
  1344. }
  1345. }
  1346. return TRUE;
  1347. }
  1348. //-----------------------------------------------------------------------------
  1349. // buildSkeleton()
  1350. //-----------------------------------------------------------------------------
  1351. BOOL LLVOAvatar::buildSkeleton(const LLVOAvatarSkeletonInfo *info)
  1352. {
  1353. LLMemType mt(LLMemType::MTYPE_AVATAR);
  1354. //-------------------------------------------------------------------------
  1355. // allocate joints
  1356. //-------------------------------------------------------------------------
  1357. if (!allocateCharacterJoints(info->mNumBones))
  1358. {
  1359. llerrs << "Can't allocate " << info->mNumBones << " joints" << llendl;
  1360. return FALSE;
  1361. }
  1362. //-------------------------------------------------------------------------
  1363. // allocate volumes
  1364. //-------------------------------------------------------------------------
  1365. if (info->mNumCollisionVolumes)
  1366. {
  1367. if (!allocateCollisionVolumes(info->mNumCollisionVolumes))
  1368. {
  1369. llerrs << "Can't allocate " << info->mNumCollisionVolumes << " collision volumes" << llendl;
  1370. return FALSE;
  1371. }
  1372. }
  1373. S32 current_joint_num = 0;
  1374. S32 current_volume_num = 0;
  1375. LLVOAvatarSkeletonInfo::bone_info_list_t::const_iterator iter;
  1376. for (iter = info->mBoneInfoList.begin(); iter != info->mBoneInfoList.end(); ++iter)
  1377. {
  1378. LLVOAvatarBoneInfo *info = *iter;
  1379. if (!setupBone(info, NULL, current_volume_num, current_joint_num))
  1380. {
  1381. llerrs << "Error parsing bone in skeleton file" << llendl;
  1382. return FALSE;
  1383. }
  1384. }
  1385. return TRUE;
  1386. }
  1387. LLVOAvatar* LLVOAvatar::asAvatar()
  1388. {
  1389. return this;
  1390. }
  1391. //-----------------------------------------------------------------------------
  1392. // LLVOAvatar::startDefaultMotions()
  1393. //-----------------------------------------------------------------------------
  1394. void LLVOAvatar::startDefaultMotions()
  1395. {
  1396. //-------------------------------------------------------------------------
  1397. // start default motions
  1398. //-------------------------------------------------------------------------
  1399. startMotion( ANIM_AGENT_HEAD_ROT );
  1400. startMotion( ANIM_AGENT_EYE );
  1401. startMotion( ANIM_AGENT_BODY_NOISE );
  1402. startMotion( ANIM_AGENT_BREATHE_ROT );
  1403. startMotion( ANIM_AGENT_HAND_MOTION );
  1404. startMotion( ANIM_AGENT_PELVIS_FIX );
  1405. //-------------------------------------------------------------------------
  1406. // restart any currently active motions
  1407. //-------------------------------------------------------------------------
  1408. processAnimationStateChanges();
  1409. }
  1410. //-----------------------------------------------------------------------------
  1411. // LLVOAvatar::buildCharacter()
  1412. // Deferred initialization and rebuild of the avatar.
  1413. //-----------------------------------------------------------------------------
  1414. void LLVOAvatar::buildCharacter()
  1415. {
  1416. LLMemType mt(LLMemType::MTYPE_AVATAR);
  1417. //-------------------------------------------------------------------------
  1418. // remove all references to our existing skeleton
  1419. // so we can rebuild it
  1420. //-------------------------------------------------------------------------
  1421. flushAllMotions();
  1422. //-------------------------------------------------------------------------
  1423. // remove all of mRoot's children
  1424. //-------------------------------------------------------------------------
  1425. mRoot.removeAllChildren();
  1426. mIsBuilt = FALSE;
  1427. //-------------------------------------------------------------------------
  1428. // clear mesh data
  1429. //-------------------------------------------------------------------------
  1430. for (std::vector<LLViewerJoint*>::iterator jointIter = mMeshLOD.begin();
  1431.  jointIter != mMeshLOD.end(); ++jointIter)
  1432. {
  1433. LLViewerJoint* joint = (LLViewerJoint*) *jointIter;
  1434. for (std::vector<LLViewerJointMesh*>::iterator meshIter = joint->mMeshParts.begin();
  1435.  meshIter != joint->mMeshParts.end(); ++meshIter)
  1436. {
  1437. LLViewerJointMesh * mesh = (LLViewerJointMesh *) *meshIter;
  1438. mesh->setMesh(NULL);
  1439. }
  1440. }
  1441. //-------------------------------------------------------------------------
  1442. // (re)load our skeleton and meshes
  1443. //-------------------------------------------------------------------------
  1444. LLTimer timer;
  1445. BOOL status = loadAvatar();
  1446. stop_glerror();
  1447. if (gNoRender)
  1448. {
  1449. // Still want to load the avatar skeleton so visual parameters work.
  1450. return;
  1451. }
  1452. //  gPrintMessagesThisFrame = TRUE;
  1453. lldebugs << "Avatar load took " << timer.getElapsedTimeF32() << " seconds." << llendl;
  1454. if (!status)
  1455. {
  1456. if (isSelf())
  1457. {
  1458. llerrs << "Unable to load user's avatar" << llendl;
  1459. }
  1460. else
  1461. {
  1462. llwarns << "Unable to load other's avatar" << llendl;
  1463. }
  1464. return;
  1465. }
  1466. //-------------------------------------------------------------------------
  1467. // initialize "well known" joint pointers
  1468. //-------------------------------------------------------------------------
  1469. mPelvisp = (LLViewerJoint*)mRoot.findJoint("mPelvis");
  1470. mTorsop = (LLViewerJoint*)mRoot.findJoint("mTorso");
  1471. mChestp = (LLViewerJoint*)mRoot.findJoint("mChest");
  1472. mNeckp = (LLViewerJoint*)mRoot.findJoint("mNeck");
  1473. mHeadp = (LLViewerJoint*)mRoot.findJoint("mHead");
  1474. mSkullp = (LLViewerJoint*)mRoot.findJoint("mSkull");
  1475. mHipLeftp = (LLViewerJoint*)mRoot.findJoint("mHipLeft");
  1476. mHipRightp = (LLViewerJoint*)mRoot.findJoint("mHipRight");
  1477. mKneeLeftp = (LLViewerJoint*)mRoot.findJoint("mKneeLeft");
  1478. mKneeRightp = (LLViewerJoint*)mRoot.findJoint("mKneeRight");
  1479. mAnkleLeftp = (LLViewerJoint*)mRoot.findJoint("mAnkleLeft");
  1480. mAnkleRightp = (LLViewerJoint*)mRoot.findJoint("mAnkleRight");
  1481. mFootLeftp = (LLViewerJoint*)mRoot.findJoint("mFootLeft");
  1482. mFootRightp = (LLViewerJoint*)mRoot.findJoint("mFootRight");
  1483. mWristLeftp = (LLViewerJoint*)mRoot.findJoint("mWristLeft");
  1484. mWristRightp = (LLViewerJoint*)mRoot.findJoint("mWristRight");
  1485. mEyeLeftp = (LLViewerJoint*)mRoot.findJoint("mEyeLeft");
  1486. mEyeRightp = (LLViewerJoint*)mRoot.findJoint("mEyeRight");
  1487. //-------------------------------------------------------------------------
  1488. // Make sure "well known" pointers exist
  1489. //-------------------------------------------------------------------------
  1490. if (!(mPelvisp && 
  1491.   mTorsop &&
  1492.   mChestp &&
  1493.   mNeckp &&
  1494.   mHeadp &&
  1495.   mSkullp &&
  1496.   mHipLeftp &&
  1497.   mHipRightp &&
  1498.   mKneeLeftp &&
  1499.   mKneeRightp &&
  1500.   mAnkleLeftp &&
  1501.   mAnkleRightp &&
  1502.   mFootLeftp &&
  1503.   mFootRightp &&
  1504.   mWristLeftp &&
  1505.   mWristRightp &&
  1506.   mEyeLeftp &&
  1507.   mEyeRightp))
  1508. {
  1509. llerrs << "Failed to create avatar." << llendl;
  1510. return;
  1511. }
  1512. //-------------------------------------------------------------------------
  1513. // initialize the pelvis
  1514. //-------------------------------------------------------------------------
  1515. mPelvisp->setPosition( LLVector3(0.0f, 0.0f, 0.0f) );
  1516. //-------------------------------------------------------------------------
  1517. // set head offset from pelvis
  1518. //-------------------------------------------------------------------------
  1519. updateHeadOffset();
  1520. //-------------------------------------------------------------------------
  1521. // initialize lip sync morph pointers
  1522. //-------------------------------------------------------------------------
  1523. mOohMorph     = getVisualParam( "Lipsync_Ooh" );
  1524. mAahMorph     = getVisualParam( "Lipsync_Aah" );
  1525. // If we don't have the Ooh morph, use the Kiss morph
  1526. if (!mOohMorph)
  1527. {
  1528. llwarns << "Missing 'Ooh' morph for lipsync, using fallback." << llendl;
  1529. mOohMorph = getVisualParam( "Express_Kiss" );
  1530. }
  1531. // If we don't have the Aah morph, use the Open Mouth morph
  1532. if (!mAahMorph)
  1533. {
  1534. llwarns << "Missing 'Aah' morph for lipsync, using fallback." << llendl;
  1535. mAahMorph = getVisualParam( "Express_Open_Mouth" );
  1536. }
  1537. startDefaultMotions();
  1538. //-------------------------------------------------------------------------
  1539. // restart any currently active motions
  1540. //-------------------------------------------------------------------------
  1541. processAnimationStateChanges();
  1542. mIsBuilt = TRUE;
  1543. stop_glerror();
  1544. mMeshValid = TRUE;
  1545. }
  1546. //-----------------------------------------------------------------------------
  1547. // releaseMeshData()
  1548. //-----------------------------------------------------------------------------
  1549. void LLVOAvatar::releaseMeshData()
  1550. {
  1551. LLMemType mt(LLMemType::MTYPE_AVATAR);
  1552. if (sInstances.size() < AVATAR_RELEASE_THRESHOLD || mIsDummy)
  1553. {
  1554. return;
  1555. }
  1556. //llinfos << "Releasing" << llendl;
  1557. // cleanup mesh data
  1558. for (std::vector<LLViewerJoint*>::iterator iter = mMeshLOD.begin();
  1559.  iter != mMeshLOD.end(); 
  1560.  ++iter)
  1561. {
  1562. LLViewerJoint* joint = (LLViewerJoint*) *iter;
  1563. joint->setValid(FALSE, TRUE);
  1564. }
  1565. //cleanup data
  1566. if (mDrawable.notNull())
  1567. {
  1568. LLFace* facep = mDrawable->getFace(0);
  1569. facep->setSize(0, 0);
  1570. for(S32 i = mNumInitFaces ; i < mDrawable->getNumFaces(); i++)
  1571. {
  1572. facep = mDrawable->getFace(i);
  1573. facep->setSize(0, 0);
  1574. }
  1575. }
  1576. for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
  1577.  iter != mAttachmentPoints.end();
  1578.  ++iter)
  1579. {
  1580. LLViewerJointAttachment* attachment = iter->second;
  1581. if (!attachment->getIsHUDAttachment())
  1582. {
  1583. attachment->setAttachmentVisibility(FALSE);
  1584. }
  1585. }
  1586. mMeshValid = FALSE;
  1587. }
  1588. //-----------------------------------------------------------------------------
  1589. // restoreMeshData()
  1590. //-----------------------------------------------------------------------------
  1591. // virtual
  1592. void LLVOAvatar::restoreMeshData()
  1593. {
  1594. llassert(!isSelf());
  1595. LLMemType mt(LLMemType::MTYPE_AVATAR);
  1596. //llinfos << "Restoring" << llendl;
  1597. mMeshValid = TRUE;
  1598. updateJointLODs();
  1599. for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
  1600.  iter != mAttachmentPoints.end();
  1601.  ++iter)
  1602. {
  1603. LLViewerJointAttachment* attachment = iter->second;
  1604. if (!attachment->getIsHUDAttachment())
  1605. {
  1606. attachment->setAttachmentVisibility(TRUE);
  1607. }
  1608. }
  1609. // force mesh update as LOD might not have changed to trigger this
  1610. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE);
  1611. }
  1612. //-----------------------------------------------------------------------------
  1613. // updateMeshData()
  1614. //-----------------------------------------------------------------------------
  1615. void LLVOAvatar::updateMeshData()
  1616. {
  1617. if (mDrawable.notNull())
  1618. {
  1619. stop_glerror();
  1620. S32 f_num = 0 ;
  1621. const U32 VERTEX_NUMBER_THRESHOLD = 128 ;//small number of this means each part of an avatar has its own vertex buffer.
  1622. const S32 num_parts = mMeshLOD.size();
  1623. // this order is determined by number of LODS
  1624. // if a mesh earlier in this list changed LODs while a later mesh doesn't,
  1625. // the later mesh's index offset will be inaccurate
  1626. for(S32 part_index = 0 ; part_index < num_parts ;)
  1627. {
  1628. S32 j = part_index ;
  1629. U32 last_v_num = 0, num_vertices = 0 ;
  1630. U32 last_i_num = 0, num_indices = 0 ;
  1631. while(part_index < num_parts && num_vertices < VERTEX_NUMBER_THRESHOLD)
  1632. {
  1633. last_v_num = num_vertices ;
  1634. last_i_num = num_indices ;
  1635. mMeshLOD[part_index++]->updateFaceSizes(num_vertices, num_indices, mAdjustedPixelArea);
  1636. }
  1637. if(num_vertices < 1)//skip empty meshes
  1638. {
  1639. break ;
  1640. }
  1641. if(last_v_num > 0)//put the last inserted part into next vertex buffer.
  1642. {
  1643. num_vertices = last_v_num ;
  1644. num_indices = last_i_num ;
  1645. part_index-- ;
  1646. }
  1647. LLFace* facep ;
  1648. if(f_num < mDrawable->getNumFaces()) 
  1649. {
  1650. facep = mDrawable->getFace(f_num);
  1651. }
  1652. else
  1653. {
  1654. facep = mDrawable->addFace(mDrawable->getFace(0)->getPool(), mDrawable->getFace(0)->getTexture()) ;
  1655. }
  1656. // resize immediately
  1657. facep->setSize(num_vertices, num_indices);
  1658. if(facep->mVertexBuffer.isNull())
  1659. {
  1660. facep->mVertexBuffer = new LLVertexBufferAvatar();
  1661. facep->mVertexBuffer->allocateBuffer(num_vertices, num_indices, TRUE);
  1662. }
  1663. else
  1664. {
  1665. facep->mVertexBuffer->resizeBuffer(num_vertices, num_indices) ;
  1666. }
  1667. facep->setGeomIndex(0);
  1668. facep->setIndicesIndex(0);
  1669. // This is a hack! Avatars have their own pool, so we are detecting
  1670. //   the case of more than one avatar in the pool (thus > 0 instead of >= 0)
  1671. if (facep->getGeomIndex() > 0)
  1672. {
  1673. llerrs << "non-zero geom index: " << facep->getGeomIndex() << " in LLVOAvatar::restoreMeshData" << llendl;
  1674. }
  1675. for(S32 k = j ; k < part_index ; k++)
  1676. {
  1677. mMeshLOD[k]->updateFaceData(facep, mAdjustedPixelArea, k == MESH_ID_HAIR);
  1678. }
  1679. stop_glerror();
  1680. facep->mVertexBuffer->setBuffer(0);
  1681. if(!f_num)
  1682. {
  1683. f_num += mNumInitFaces ;
  1684. }
  1685. else
  1686. {
  1687. f_num++ ;
  1688. }
  1689. }
  1690. }
  1691. }
  1692. //------------------------------------------------------------------------
  1693. //------------------------------------------------------------------------
  1694. // The viewer can only suggest a good size for the agent,
  1695. // the simulator will keep it inside a reasonable range.
  1696. void LLVOAvatar::computeBodySize() 
  1697. {
  1698. LLVector3 pelvis_scale = mPelvisp->getScale();
  1699. // some of the joints have not been cached
  1700. LLVector3 skull = mSkullp->getPosition();
  1701. LLVector3 skull_scale = mSkullp->getScale();
  1702. LLVector3 neck = mNeckp->getPosition();
  1703. LLVector3 neck_scale = mNeckp->getScale();
  1704. LLVector3 chest = mChestp->getPosition();
  1705. LLVector3 chest_scale = mChestp->getScale();
  1706. // the rest of the joints have been cached
  1707. LLVector3 head = mHeadp->getPosition();
  1708. LLVector3 head_scale = mHeadp->getScale();
  1709. LLVector3 torso = mTorsop->getPosition();
  1710. LLVector3 torso_scale = mTorsop->getScale();
  1711. LLVector3 hip = mHipLeftp->getPosition();
  1712. LLVector3 hip_scale = mHipLeftp->getScale();
  1713. LLVector3 knee = mKneeLeftp->getPosition();
  1714. LLVector3 knee_scale = mKneeLeftp->getScale();
  1715. LLVector3 ankle = mAnkleLeftp->getPosition();
  1716. LLVector3 ankle_scale = mAnkleLeftp->getScale();
  1717. LLVector3 foot  = mFootLeftp->getPosition();
  1718. mPelvisToFoot = hip.mV[VZ] * pelvis_scale.mV[VZ] -
  1719.   knee.mV[VZ] * hip_scale.mV[VZ] -
  1720.   ankle.mV[VZ] * knee_scale.mV[VZ] -
  1721.   foot.mV[VZ] * ankle_scale.mV[VZ];
  1722. mBodySize.mV[VZ] = mPelvisToFoot +
  1723.    // the sqrt(2) correction below is an approximate
  1724.    // correction to get to the top of the head
  1725.    F_SQRT2 * (skull.mV[VZ] * head_scale.mV[VZ]) + 
  1726.    head.mV[VZ] * neck_scale.mV[VZ] + 
  1727.    neck.mV[VZ] * chest_scale.mV[VZ] + 
  1728.    chest.mV[VZ] * torso_scale.mV[VZ] + 
  1729.    torso.mV[VZ] * pelvis_scale.mV[VZ]; 
  1730. // TODO -- measure the real depth and width
  1731. mBodySize.mV[VX] = DEFAULT_AGENT_DEPTH;
  1732. mBodySize.mV[VY] = DEFAULT_AGENT_WIDTH;
  1733. /* debug spam
  1734. std::cout << "skull = " << skull << std::endl; // adebug
  1735. std::cout << "head = " << head << std::endl; // adebug
  1736. std::cout << "head_scale = " << head_scale << std::endl; // adebug
  1737. std::cout << "neck = " << neck << std::endl; // adebug
  1738. std::cout << "neck_scale = " << neck_scale << std::endl; // adebug
  1739. std::cout << "chest = " << chest << std::endl; // adebug
  1740. std::cout << "chest_scale = " << chest_scale << std::endl; // adebug
  1741. std::cout << "torso = " << torso << std::endl; // adebug
  1742. std::cout << "torso_scale = " << torso_scale << std::endl; // adebug
  1743. std::cout << std::endl; // adebug
  1744. std::cout << "pelvis_scale = " << pelvis_scale << std::endl;// adebug
  1745. std::cout << std::endl; // adebug
  1746. std::cout << "hip = " << hip << std::endl; // adebug
  1747. std::cout << "hip_scale = " << hip_scale << std::endl; // adebug
  1748. std::cout << "ankle = " << ankle << std::endl; // adebug
  1749. std::cout << "ankle_scale = " << ankle_scale << std::endl; // adebug
  1750. std::cout << "foot = " << foot << std::endl; // adebug
  1751. std::cout << "mBodySize = " << mBodySize << std::endl; // adebug
  1752. std::cout << "mPelvisToFoot = " << mPelvisToFoot << std::endl; // adebug
  1753. std::cout << std::endl; // adebug
  1754. */
  1755. }
  1756. //------------------------------------------------------------------------
  1757. // LLVOAvatar::processUpdateMessage()
  1758. //------------------------------------------------------------------------
  1759. U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys,
  1760.  void **user_data,
  1761.  U32 block_num, const EObjectUpdateType update_type,
  1762.  LLDataPacker *dp)
  1763. {
  1764. LLMemType mt(LLMemType::MTYPE_AVATAR);
  1765. LLVector3 old_vel = getVelocity();
  1766. // Do base class updates...
  1767. U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp);
  1768. if(retval & LLViewerObject::INVALID_UPDATE)
  1769. {
  1770. if(this == gAgent.getAvatarObject())
  1771. {
  1772. //tell sim to cancel this update
  1773. gAgent.teleportViaLocation(gAgent.getPositionGlobal());
  1774. }
  1775. }
  1776. //llinfos << getRotation() << llendl;
  1777. //llinfos << getPosition() << llendl;
  1778. return retval;
  1779. }
  1780. // virtual
  1781. S32 LLVOAvatar::setTETexture(const U8 te, const LLUUID& uuid)
  1782. {
  1783. // The core setTETexture() method requests images, so we need
  1784. // to redirect certain avatar texture requests to different sims.
  1785. if (isIndexBakedTexture((ETextureIndex)te))
  1786. {
  1787. LLHost target_host = getObjectHost();
  1788. return setTETextureCore(te, uuid, target_host);
  1789. }
  1790. else
  1791. {
  1792. return setTETextureCore(te, uuid, LLHost::invalid);
  1793. }
  1794. }
  1795. static LLFastTimer::DeclareTimer FTM_AVATAR_UPDATE("Update Avatar");
  1796. static LLFastTimer::DeclareTimer FTM_JOINT_UPDATE("Update Joints");
  1797. //------------------------------------------------------------------------
  1798. // idleUpdate()
  1799. //------------------------------------------------------------------------
  1800. BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
  1801. {
  1802. LLMemType mt(LLMemType::MTYPE_AVATAR);
  1803. LLFastTimer t(FTM_AVATAR_UPDATE);
  1804. if (isDead())
  1805. {
  1806. llinfos << "Warning!  Idle on dead avatar" << llendl;
  1807. return TRUE;
  1808. }
  1809.   if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR)))
  1810. {
  1811. return TRUE;
  1812. }
  1813. // force immediate pixel area update on avatars using last frames data (before drawable or camera updates)
  1814. setPixelAreaAndAngle(gAgent);
  1815. // force asynchronous drawable update
  1816. if(mDrawable.notNull() && !gNoRender)
  1817. {
  1818. LLFastTimer t(FTM_JOINT_UPDATE);
  1819. if (mIsSitting && getParent())
  1820. {
  1821. LLViewerObject *root_object = (LLViewerObject*)getRoot();
  1822. LLDrawable* drawablep = root_object->mDrawable;
  1823. // if this object hasn't already been updated by another avatar...
  1824. if (drawablep) // && !drawablep->isState(LLDrawable::EARLY_MOVE))
  1825. {
  1826. if (root_object->isSelected())
  1827. {
  1828. gPipeline.updateMoveNormalAsync(drawablep);
  1829. }
  1830. else
  1831. {
  1832. gPipeline.updateMoveDampedAsync(drawablep);
  1833. }
  1834. }
  1835. }
  1836. else 
  1837. {
  1838. gPipeline.updateMoveDampedAsync(mDrawable);
  1839. }
  1840. }
  1841. //--------------------------------------------------------------------
  1842. // set alpha flag depending on state
  1843. //--------------------------------------------------------------------
  1844. if (isSelf())
  1845. {
  1846. LLViewerObject::idleUpdate(agent, world, time);
  1847. // trigger fidget anims
  1848. if (isAnyAnimationSignaled(AGENT_STAND_ANIMS, NUM_AGENT_STAND_ANIMS))
  1849. {
  1850. agent.fidget();
  1851. }
  1852. }
  1853. else
  1854. {
  1855. // Should override the idleUpdate stuff and leave out the angular update part.
  1856. LLQuaternion rotation = getRotation();
  1857. LLViewerObject::idleUpdate(agent, world, time);
  1858. setRotation(rotation);
  1859. }
  1860. // attach objects that were waiting for a drawable
  1861. lazyAttach();
  1862. // animate the character
  1863. // store off last frame's root position to be consistent with camera position
  1864. LLVector3 root_pos_last = mRoot.getWorldPosition();
  1865. BOOL detailed_update = updateCharacter(agent);
  1866. if (gNoRender)
  1867. {
  1868. return TRUE;
  1869. }
  1870. static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false);
  1871. bool voice_enabled = (visualizers_in_calls || gVoiceClient->inProximalChannel()) &&
  1872.  gVoiceClient->getVoiceEnabled(mID);
  1873. idleUpdateVoiceVisualizer( voice_enabled );
  1874. idleUpdateMisc( detailed_update );
  1875. idleUpdateAppearanceAnimation();
  1876. if (detailed_update)
  1877. {
  1878. idleUpdateLipSync( voice_enabled );
  1879. idleUpdateLoadingEffect();
  1880. idleUpdateBelowWater(); // wind effect uses this
  1881. idleUpdateWindEffect();
  1882. }
  1883. idleUpdateNameTag( root_pos_last );
  1884. idleUpdateRenderCost();
  1885. idleUpdateTractorBeam();
  1886. return TRUE;
  1887. }
  1888. void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
  1889. {
  1890. // disable voice visualizer when in mouselook
  1891. mVoiceVisualizer->setVoiceEnabled( voice_enabled && !(isSelf() && gAgent.cameraMouselook()) );
  1892. if ( voice_enabled )
  1893. {
  1894. //----------------------------------------------------------------
  1895. // Only do gesture triggering for your own avatar, and only when you're in a proximal channel.
  1896. //----------------------------------------------------------------
  1897. if( isSelf() )
  1898. {
  1899. //----------------------------------------------------------------------------------------
  1900. // The following takes the voice signal and uses that to trigger gesticulations. 
  1901. //----------------------------------------------------------------------------------------
  1902. int lastGesticulationLevel = mCurrentGesticulationLevel;
  1903. mCurrentGesticulationLevel = mVoiceVisualizer->getCurrentGesticulationLevel();
  1904. //---------------------------------------------------------------------------------------------------
  1905. // If "current gesticulation level" changes, we catch this, and trigger the new gesture
  1906. //---------------------------------------------------------------------------------------------------
  1907. if ( lastGesticulationLevel != mCurrentGesticulationLevel )
  1908. {
  1909. if ( mCurrentGesticulationLevel != VOICE_GESTICULATION_LEVEL_OFF )
  1910. {
  1911. std::string gestureString = "unInitialized";
  1912. if ( mCurrentGesticulationLevel == 0 ) { gestureString = "/voicelevel1"; }
  1913. else if ( mCurrentGesticulationLevel == 1 ) { gestureString = "/voicelevel2"; }
  1914. else if ( mCurrentGesticulationLevel == 2 ) { gestureString = "/voicelevel3"; }
  1915. else { llinfos << "oops - CurrentGesticulationLevel can be only 0, 1, or 2"  << llendl; }
  1916. // this is the call that Karl S. created for triggering gestures from within the code.
  1917. LLGestureManager::instance().triggerAndReviseString( gestureString );
  1918. }
  1919. }
  1920. } //if( isSelf() )
  1921. //-----------------------------------------------------------------------------------------------------------------
  1922. // If the avatar is speaking, then the voice amplitude signal is passed to the voice visualizer.
  1923. // Also, here we trigger voice visualizer start and stop speaking, so it can animate the voice symbol.
  1924. //
  1925. // Notice the calls to "gAwayTimer.reset()". This resets the timer that determines how long the avatar has been
  1926. // "away", so that the avatar doesn't lapse into away-mode (and slump over) while the user is still talking. 
  1927. //-----------------------------------------------------------------------------------------------------------------
  1928. if (gVoiceClient->getIsSpeaking( mID ))
  1929. {
  1930. if (!mVoiceVisualizer->getCurrentlySpeaking())
  1931. {
  1932. mVoiceVisualizer->setStartSpeaking();
  1933. //printf( "gAwayTimer.reset();n" );
  1934. }
  1935. mVoiceVisualizer->setSpeakingAmplitude( gVoiceClient->getCurrentPower( mID ) );
  1936. if( isSelf() )
  1937. {
  1938. gAgent.clearAFK();
  1939. }
  1940. }
  1941. else
  1942. {
  1943. if ( mVoiceVisualizer->getCurrentlySpeaking() )
  1944. {
  1945. mVoiceVisualizer->setStopSpeaking();
  1946. if ( mLipSyncActive )
  1947. {
  1948. if( mOohMorph ) mOohMorph->setWeight(mOohMorph->getMinWeight(), FALSE);
  1949. if( mAahMorph ) mAahMorph->setWeight(mAahMorph->getMinWeight(), FALSE);
  1950. mLipSyncActive = false;
  1951. LLCharacter::updateVisualParams();
  1952. dirtyMesh();
  1953. }
  1954. }
  1955. }
  1956. //--------------------------------------------------------------------------------------------
  1957. // here we get the approximate head position and set as sound source for the voice symbol
  1958. // (the following version uses a tweak of "mHeadOffset" which handle sitting vs. standing)
  1959. //--------------------------------------------------------------------------------------------
  1960. LLVector3 headOffset = LLVector3( 0.0f, 0.0f, mHeadOffset.mV[2] );
  1961. mVoiceVisualizer->setVoiceSourceWorldPosition( mRoot.getWorldPosition() + headOffset );
  1962. }//if ( voiceEnabled )
  1963. }
  1964. static LLFastTimer::DeclareTimer FTM_ATTACHMENT_UPDATE("Update Attachments");
  1965. void LLVOAvatar::idleUpdateMisc(bool detailed_update)
  1966. {
  1967. if (LLVOAvatar::sJointDebug)
  1968. {
  1969. llinfos << getFullname() << ": joint touches: " << LLJoint::sNumTouches << " updates: " << LLJoint::sNumUpdates << llendl;
  1970. }
  1971. LLJoint::sNumUpdates = 0;
  1972. LLJoint::sNumTouches = 0;
  1973. // *NOTE: this is necessary for the floating name text above your head.
  1974. if (mDrawable.notNull())
  1975. {
  1976. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_SHADOW, TRUE);
  1977. }
  1978. BOOL visible = isVisible() || mNeedsAnimUpdate;
  1979. // update attachments positions
  1980. if (detailed_update || !sUseImpostors)
  1981. {
  1982. LLFastTimer t(FTM_ATTACHMENT_UPDATE);
  1983. for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
  1984.  iter != mAttachmentPoints.end();
  1985.  ++iter)
  1986. {
  1987. LLViewerJointAttachment* attachment = iter->second;
  1988. for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
  1989.  attachment_iter != attachment->mAttachedObjects.end();
  1990.  ++attachment_iter)
  1991. {
  1992. LLViewerObject* attached_object = (*attachment_iter);
  1993. BOOL visibleAttachment = visible || (attached_object && 
  1994.  !(attached_object->mDrawable->getSpatialBridge() &&
  1995.    attached_object->mDrawable->getSpatialBridge()->getRadius() < 2.0));
  1996. if (visibleAttachment && attached_object && !attached_object->isDead() && attachment->getValid())
  1997. {
  1998. // if selecting any attachments, update all of them as non-damped
  1999. if (LLSelectMgr::getInstance()->getSelection()->getObjectCount() && LLSelectMgr::getInstance()->getSelection()->isAttachment())
  2000. {
  2001. gPipeline.updateMoveNormalAsync(attached_object->mDrawable);
  2002. }
  2003. else
  2004. {
  2005. gPipeline.updateMoveDampedAsync(attached_object->mDrawable);
  2006. }
  2007. LLSpatialBridge* bridge = attached_object->mDrawable->getSpatialBridge();
  2008. if (bridge)
  2009. {
  2010. gPipeline.updateMoveNormalAsync(bridge);
  2011. }
  2012. attached_object->updateText();
  2013. }
  2014. }
  2015. }
  2016. }
  2017. mNeedsAnimUpdate = FALSE;
  2018. if (isImpostor() && !mNeedsImpostorUpdate)
  2019. {
  2020. LLVector3 ext[2];
  2021. F32 distance;
  2022. LLVector3 angle;
  2023. getImpostorValues(ext, angle, distance);
  2024. for (U32 i = 0; i < 3 && !mNeedsImpostorUpdate; i++)
  2025. {
  2026. F32 cur_angle = angle.mV[i];
  2027. F32 old_angle = mImpostorAngle.mV[i];
  2028. F32 angle_diff = fabsf(cur_angle-old_angle);
  2029. if (angle_diff > F_PI/512.f*distance*mUpdatePeriod)
  2030. {
  2031. mNeedsImpostorUpdate = TRUE;
  2032. }
  2033. }
  2034. if (detailed_update && !mNeedsImpostorUpdate)
  2035. { //update impostor if view angle, distance, or bounding box change
  2036. //significantly
  2037. F32 dist_diff = fabsf(distance-mImpostorDistance);
  2038. if (dist_diff/mImpostorDistance > 0.1f)
  2039. {
  2040. mNeedsImpostorUpdate = TRUE;
  2041. }
  2042. else
  2043. {
  2044. getSpatialExtents(ext[0], ext[1]);
  2045. if ((ext[1]-mImpostorExtents[1]).length() > 0.05f ||
  2046. (ext[0]-mImpostorExtents[0]).length() > 0.05f)
  2047. {
  2048. mNeedsImpostorUpdate = TRUE;
  2049. }
  2050. }
  2051. }
  2052. }
  2053. mDrawable->movePartition();
  2054. //force a move if sitting on an active object
  2055. if (getParent() && ((LLViewerObject*) getParent())->mDrawable->isActive())
  2056. {
  2057. gPipeline.markMoved(mDrawable, TRUE);
  2058. }
  2059. }
  2060. void LLVOAvatar::idleUpdateAppearanceAnimation()
  2061. {
  2062. // update morphing params
  2063. if (mAppearanceAnimating)
  2064. {
  2065. ESex avatar_sex = getSex();
  2066. F32 appearance_anim_time = mAppearanceMorphTimer.getElapsedTimeF32();
  2067. if (appearance_anim_time >= APPEARANCE_MORPH_TIME)
  2068. {
  2069. mAppearanceAnimating = FALSE;
  2070. for (LLVisualParam *param = getFirstVisualParam(); 
  2071.  param;
  2072.  param = getNextVisualParam())
  2073. {
  2074. if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
  2075. {
  2076. param->stopAnimating(FALSE);
  2077. }
  2078. }
  2079. updateVisualParams();
  2080. if (isSelf())
  2081. {
  2082. gAgent.sendAgentSetAppearance();
  2083. }
  2084. }
  2085. else
  2086. {
  2087. F32 morph_amt = calcMorphAmount();
  2088. LLVisualParam *param;
  2089. if (!isSelf())
  2090. {
  2091. // animate only top level params for non-self avatars
  2092. for (param = getFirstVisualParam();
  2093.  param;
  2094.  param = getNextVisualParam())
  2095. {
  2096. if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
  2097. {
  2098. param->animate(morph_amt, FALSE);
  2099. }
  2100. }
  2101. }
  2102. // apply all params
  2103. for (param = getFirstVisualParam();
  2104.  param;
  2105.  param = getNextVisualParam())
  2106. {
  2107. param->apply(avatar_sex);
  2108. }
  2109. mLastAppearanceBlendTime = appearance_anim_time;
  2110. }
  2111. dirtyMesh();
  2112. }
  2113. }
  2114. F32 LLVOAvatar::calcMorphAmount()
  2115. {
  2116. F32 appearance_anim_time = mAppearanceMorphTimer.getElapsedTimeF32();
  2117. F32 blend_frac = calc_bouncy_animation(appearance_anim_time / APPEARANCE_MORPH_TIME);
  2118. F32 last_blend_frac = calc_bouncy_animation(mLastAppearanceBlendTime / APPEARANCE_MORPH_TIME);
  2119. F32 morph_amt;
  2120. if (last_blend_frac == 1.f)
  2121. {
  2122. morph_amt = 1.f;
  2123. }
  2124. else
  2125. {
  2126. morph_amt = (blend_frac - last_blend_frac) / (1.f - last_blend_frac);
  2127. }
  2128. return morph_amt;
  2129. }
  2130. void LLVOAvatar::idleUpdateLipSync(bool voice_enabled)
  2131. {
  2132. // Use the Lipsync_Ooh and Lipsync_Aah morphs for lip sync
  2133. if ( voice_enabled && (gVoiceClient->lipSyncEnabled()) && gVoiceClient->getIsSpeaking( mID ) )
  2134. {
  2135. F32 ooh_morph_amount = 0.0f;
  2136. F32 aah_morph_amount = 0.0f;
  2137. mVoiceVisualizer->lipSyncOohAah( ooh_morph_amount, aah_morph_amount );
  2138. if( mOohMorph )
  2139. {
  2140. F32 ooh_weight = mOohMorph->getMinWeight()
  2141. + ooh_morph_amount * (mOohMorph->getMaxWeight() - mOohMorph->getMinWeight());
  2142. mOohMorph->setWeight( ooh_weight, FALSE );
  2143. }
  2144. if( mAahMorph )
  2145. {
  2146. F32 aah_weight = mAahMorph->getMinWeight()
  2147. + aah_morph_amount * (mAahMorph->getMaxWeight() - mAahMorph->getMinWeight());
  2148. mAahMorph->setWeight( aah_weight, FALSE );
  2149. }
  2150. mLipSyncActive = true;
  2151. LLCharacter::updateVisualParams();
  2152. dirtyMesh();
  2153. }
  2154. }
  2155. void LLVOAvatar::idleUpdateLoadingEffect()
  2156. {
  2157. // update visibility when avatar is partially loaded
  2158. if (updateIsFullyLoaded()) // changed?
  2159. {
  2160. if (isFullyLoaded() && isSelf())
  2161. {
  2162. static bool first_fully_visible = true;
  2163. if (first_fully_visible)
  2164. {
  2165. llinfos << "self isFullyLoaded, first_fully_visible" << llendl;
  2166. first_fully_visible = false;
  2167. LLAppearanceManager::instance().onFirstFullyVisible();
  2168. }
  2169. }
  2170. if (isFullyLoaded())
  2171. {
  2172. deleteParticleSource();
  2173. updateLOD();
  2174. }
  2175. else
  2176. {
  2177. LLPartSysData particle_parameters;
  2178. // fancy particle cloud designed by Brent
  2179. particle_parameters.mPartData.mMaxAge            = 4.f;
  2180. particle_parameters.mPartData.mStartScale.mV[VX] = 0.8f;
  2181. particle_parameters.mPartData.mStartScale.mV[VX] = 0.8f;
  2182. particle_parameters.mPartData.mStartScale.mV[VY] = 1.0f;
  2183. particle_parameters.mPartData.mEndScale.mV[VX]   = 0.02f;
  2184. particle_parameters.mPartData.mEndScale.mV[VY]   = 0.02f;
  2185. particle_parameters.mPartData.mStartColor        = LLColor4(1, 1, 1, 0.5f);
  2186. particle_parameters.mPartData.mEndColor          = LLColor4(1, 1, 1, 0.0f);
  2187. particle_parameters.mPartData.mStartScale.mV[VX] = 0.8f;
  2188. LLViewerTexture* cloud = LLViewerTextureManager::getFetchedTextureFromFile("cloud-particle.j2c");
  2189. particle_parameters.mPartImageID                 = cloud->getID();
  2190. particle_parameters.mMaxAge                      = 0.f;
  2191. particle_parameters.mPattern                     = LLPartSysData::LL_PART_SRC_PATTERN_ANGLE_CONE;
  2192. particle_parameters.mInnerAngle                  = F_PI;
  2193. particle_parameters.mOuterAngle                  = 0.f;
  2194. particle_parameters.mBurstRate                   = 0.02f;
  2195. particle_parameters.mBurstRadius                 = 0.0f;
  2196. particle_parameters.mBurstPartCount              = 1;
  2197. particle_parameters.mBurstSpeedMin               = 0.1f;
  2198. particle_parameters.mBurstSpeedMax               = 1.f;
  2199. particle_parameters.mPartData.mFlags             = ( LLPartData::LL_PART_INTERP_COLOR_MASK | LLPartData::LL_PART_INTERP_SCALE_MASK |
  2200.  LLPartData::LL_PART_EMISSIVE_MASK | // LLPartData::LL_PART_FOLLOW_SRC_MASK |
  2201.  LLPartData::LL_PART_TARGET_POS_MASK );
  2202. setParticleSource(particle_parameters, getID());
  2203. }
  2204. }
  2205. }
  2206. void LLVOAvatar::idleUpdateWindEffect()
  2207. {
  2208. // update wind effect
  2209. if ((LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH))
  2210. {
  2211. F32 hover_strength = 0.f;
  2212. F32 time_delta = mRippleTimer.getElapsedTimeF32() - mRippleTimeLast;
  2213. mRippleTimeLast = mRippleTimer.getElapsedTimeF32();
  2214. LLVector3 velocity = getVelocity();
  2215. F32 speed = velocity.length();
  2216. //RN: velocity varies too much frame to frame for this to work
  2217. mRippleAccel.clearVec();//lerp(mRippleAccel, (velocity - mLastVel) * time_delta, LLCriticalDamp::getInterpolant(0.02f));
  2218. mLastVel = velocity;
  2219. LLVector4 wind;
  2220. wind.setVec(getRegion()->mWind.getVelocityNoisy(getPositionAgent(), 4.f) - velocity);
  2221. if (mInAir)
  2222. {
  2223. hover_strength = HOVER_EFFECT_STRENGTH * llmax(0.f, HOVER_EFFECT_MAX_SPEED - speed);
  2224. }
  2225. if (mBelowWater)
  2226. {
  2227. // TODO: make cloth flow more gracefully when underwater
  2228. hover_strength += UNDERWATER_EFFECT_STRENGTH;
  2229. }
  2230. wind.mV[VZ] += hover_strength;
  2231. wind.normalize();
  2232. wind.mV[VW] = llmin(0.025f + (speed * 0.015f) + hover_strength, 0.5f);
  2233. F32 interp;
  2234. if (wind.mV[VW] > mWindVec.mV[VW])
  2235. {
  2236. interp = LLCriticalDamp::getInterpolant(0.2f);
  2237. }
  2238. else
  2239. {
  2240. interp = LLCriticalDamp::getInterpolant(0.4f);
  2241. }
  2242. mWindVec = lerp(mWindVec, wind, interp);
  2243. F32 wind_freq = hover_strength + llclamp(8.f + (speed * 0.7f) + (noise1(mRipplePhase) * 4.f), 8.f, 25.f);
  2244. mWindFreq = lerp(mWindFreq, wind_freq, interp); 
  2245. if (mBelowWater)
  2246. {
  2247. mWindFreq *= UNDERWATER_FREQUENCY_DAMP;
  2248. }
  2249. mRipplePhase += (time_delta * mWindFreq);
  2250. if (mRipplePhase > F_TWO_PI)
  2251. {
  2252. mRipplePhase = fmodf(mRipplePhase, F_TWO_PI);
  2253. }
  2254. }
  2255. }
  2256. void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
  2257. {
  2258. // update chat bubble
  2259. //--------------------------------------------------------------------
  2260. // draw text label over characters head
  2261. //--------------------------------------------------------------------
  2262. if (mChatTimer.getElapsedTimeF32() > BUBBLE_CHAT_TIME)
  2263. {
  2264. mChats.clear();
  2265. }
  2266. const F32 time_visible = mTimeVisible.getElapsedTimeF32();
  2267. const F32 NAME_SHOW_TIME = gSavedSettings.getF32("RenderNameShowTime"); // seconds
  2268. const F32 FADE_DURATION = gSavedSettings.getF32("RenderNameFadeDuration"); // seconds
  2269. BOOL visible_avatar = isVisible() || mNeedsAnimUpdate;
  2270. BOOL visible_chat = gSavedSettings.getBOOL("UseChatBubbles") && (mChats.size() || mTyping);
  2271. BOOL render_name = visible_chat ||
  2272. (visible_avatar &&
  2273.  ((sRenderName == RENDER_NAME_ALWAYS) ||
  2274.   (sRenderName == RENDER_NAME_FADE && time_visible < NAME_SHOW_TIME)));
  2275. // If it's your own avatar, don't draw in mouselook, and don't
  2276. // draw if we're specifically hiding our own name.
  2277. if (isSelf())
  2278. {
  2279. render_name = render_name
  2280. && !gAgent.cameraMouselook()
  2281. && (visible_chat || (gSavedSettings.getBOOL("RenderNameShowSelf") 
  2282.  && gSavedSettings.getS32("AvatarNameTagMode") ));
  2283. }
  2284. if ( render_name )
  2285. {
  2286. BOOL new_name = FALSE;
  2287. if (visible_chat != mVisibleChat)
  2288. {
  2289. mVisibleChat = visible_chat;
  2290. new_name = TRUE;
  2291. }
  2292. if (sRenderGroupTitles != mRenderGroupTitles)
  2293. {
  2294. mRenderGroupTitles = sRenderGroupTitles;
  2295. new_name = TRUE;
  2296. }
  2297. // First Calculate Alpha
  2298. // If alpha > 0, create mNameText if necessary, otherwise delete it
  2299. {
  2300. F32 alpha = 0.f;
  2301. if (mAppAngle > 5.f)
  2302. {
  2303. const F32 START_FADE_TIME = NAME_SHOW_TIME - FADE_DURATION;
  2304. if (!visible_chat && sRenderName == RENDER_NAME_FADE && time_visible > START_FADE_TIME)
  2305. {
  2306. alpha = 1.f - (time_visible - START_FADE_TIME) / FADE_DURATION;
  2307. }
  2308. else
  2309. {
  2310. // ...not fading, full alpha
  2311. alpha = 1.f;
  2312. }
  2313. }
  2314. else if (mAppAngle > 2.f)
  2315. {
  2316. // far away is faded out also
  2317. alpha = (mAppAngle-2.f)/3.f;
  2318. }
  2319. if (alpha > 0.f)
  2320. {
  2321. if (!mNameText)
  2322. {
  2323. mNameText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT);
  2324. mNameText->setMass(10.f);
  2325. mNameText->setSourceObject(this);
  2326. mNameText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP);
  2327. mNameText->setVisibleOffScreen(TRUE);
  2328. mNameText->setMaxLines(11);
  2329. mNameText->setFadeDistance(CHAT_NORMAL_RADIUS, 5.f);
  2330. mNameText->setUseBubble(TRUE);
  2331. sNumVisibleChatBubbles++;
  2332. new_name = TRUE;
  2333. }
  2334. LLColor4 avatar_name_color = LLUIColorTable::instance().getColor( "AvatarNameColor" );
  2335. avatar_name_color.setAlpha(alpha);
  2336. mNameText->setColor(avatar_name_color);
  2337. LLQuaternion root_rot = mRoot.getWorldRotation();
  2338. mNameText->setUsePixelSize(TRUE);
  2339. LLVector3 pixel_right_vec;
  2340. LLVector3 pixel_up_vec;
  2341. LLViewerCamera::getInstance()->getPixelVectors(root_pos_last, pixel_up_vec, pixel_right_vec);
  2342. LLVector3 camera_to_av = root_pos_last - LLViewerCamera::getInstance()->getOrigin();
  2343. camera_to_av.normalize();
  2344. LLVector3 local_camera_at = camera_to_av * ~root_rot;
  2345. LLVector3 local_camera_up = camera_to_av % LLViewerCamera::getInstance()->getLeftAxis();
  2346. local_camera_up.normalize();
  2347. local_camera_up = local_camera_up * ~root_rot;
  2348. local_camera_up.scaleVec(mBodySize * 0.5f);
  2349. local_camera_at.scaleVec(mBodySize * 0.5f);
  2350. LLVector3 name_position = mRoot.getWorldPosition() + 
  2351. (local_camera_up * root_rot) -
  2352. (projected_vec(local_camera_at * root_rot, camera_to_av));
  2353. name_position += pixel_up_vec * 15.f;
  2354. mNameText->setPositionAgent(name_position);
  2355. }
  2356. else if (mNameText)
  2357. {
  2358. mNameText->markDead();
  2359. mNameText = NULL;
  2360. sNumVisibleChatBubbles--;
  2361. }
  2362. }
  2363. LLNameValue *title = getNVPair("Title");
  2364. LLNameValue* firstname = getNVPair("FirstName");
  2365. LLNameValue* lastname = getNVPair("LastName");
  2366. if (mNameText.notNull() && firstname && lastname)
  2367. {
  2368. BOOL is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY)  != mSignaledAnimations.end();
  2369. BOOL is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end();
  2370. BOOL is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end();
  2371. BOOL is_muted;
  2372. if (isSelf())
  2373. {
  2374. is_muted = FALSE;
  2375. }
  2376. else
  2377. {
  2378. is_muted = LLMuteList::getInstance()->isMuted(getID());
  2379. }
  2380. if (mNameString.empty() ||
  2381. new_name ||
  2382. (!title && !mTitle.empty()) ||
  2383. (title && mTitle != title->getString()) ||
  2384. (is_away != mNameAway || is_busy != mNameBusy || is_muted != mNameMute)
  2385. || is_appearance != mNameAppearance)
  2386. {
  2387. std::string line;
  2388. if (!sRenderGroupTitles)
  2389. {
  2390. // If all group titles are turned off, stack first name
  2391. // on a line above last name
  2392. line += firstname->getString();
  2393. line += "n";
  2394. }
  2395. else if (title && title->getString() && title->getString()[0] != '')
  2396. {
  2397. line += title->getString();
  2398. LLStringFn::replace_ascii_controlchars(line,LL_UNKNOWN_CHAR);
  2399. line += "n";
  2400. line += firstname->getString();
  2401. }
  2402. else
  2403. {
  2404. line += firstname->getString();
  2405. }
  2406. line += " ";
  2407. line += lastname->getString();
  2408. BOOL need_comma = FALSE;
  2409. if (is_away || is_muted || is_busy)
  2410. {
  2411. line += " (";
  2412. if (is_away)
  2413. {
  2414. line += LLTrans::getString("AvatarAway");
  2415. need_comma = TRUE;
  2416. }
  2417. if (is_busy)
  2418. {
  2419. if (need_comma)
  2420. {
  2421. line += ", ";
  2422. }
  2423. line += LLTrans::getString("AvatarBusy");
  2424. need_comma = TRUE;
  2425. }
  2426. if (is_muted)
  2427. {
  2428. if (need_comma)
  2429. {
  2430. line += ", ";
  2431. }
  2432. line += LLTrans::getString("AvatarMuted");
  2433. need_comma = TRUE;
  2434. }
  2435. line += ")";
  2436. }
  2437. if (is_appearance)
  2438. {
  2439. line += "n";
  2440. line += LLTrans::getString("AvatarEditingAppearance");
  2441. }
  2442. mNameAway = is_away;
  2443. mNameBusy = is_busy;
  2444. mNameMute = is_muted;
  2445. mNameAppearance = is_appearance;
  2446. mTitle = title ? title->getString() : "";
  2447. LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR);
  2448. mNameString = utf8str_to_wstring(line);
  2449. new_name = TRUE;
  2450. }
  2451. if (visible_chat)
  2452. {
  2453. mNameText->setDropShadow(TRUE);
  2454. mNameText->setFont(LLFontGL::getFontSansSerif());
  2455. mNameText->setTextAlignment(LLHUDText::ALIGN_TEXT_LEFT);
  2456. mNameText->setFadeDistance(CHAT_NORMAL_RADIUS * 2.f, 5.f);
  2457. if (new_name)
  2458. {
  2459. mNameText->setLabel(mNameString);
  2460. }
  2461. char line[MAX_STRING]; /* Flawfinder: ignore */
  2462. line[0] = '';
  2463. std::deque<LLChat>::iterator chat_iter = mChats.begin();
  2464. mNameText->clearString();
  2465. LLColor4 new_chat = LLUIColorTable::instance().getColor( "AvatarNameColor" );
  2466. LLColor4 normal_chat = lerp(new_chat, LLColor4(0.8f, 0.8f, 0.8f, 1.f), 0.7f);
  2467. LLColor4 old_chat = lerp(normal_chat, LLColor4(0.6f, 0.6f, 0.6f, 1.f), 0.7f);
  2468. if (mTyping && mChats.size() >= MAX_BUBBLE_CHAT_UTTERANCES) 
  2469. {
  2470. ++chat_iter;
  2471. }
  2472. for(; chat_iter != mChats.end(); ++chat_iter)
  2473. {
  2474. F32 chat_fade_amt = llclamp((F32)((LLFrameTimer::getElapsedSeconds() - chat_iter->mTime) / CHAT_FADE_TIME), 0.f, 4.f);
  2475. LLFontGL::StyleFlags style;
  2476. switch(chat_iter->mChatType)
  2477. {
  2478. case CHAT_TYPE_WHISPER:
  2479. style = LLFontGL::ITALIC;
  2480. break;
  2481. case CHAT_TYPE_SHOUT:
  2482. style = LLFontGL::BOLD;
  2483. break;
  2484. default:
  2485. style = LLFontGL::NORMAL;
  2486. break;
  2487. }
  2488. if (chat_fade_amt < 1.f)
  2489. {
  2490. F32 u = clamp_rescale(chat_fade_amt, 0.9f, 1.f, 0.f, 1.f);
  2491. mNameText->addLine(utf8str_to_wstring(chat_iter->mText), lerp(new_chat, normal_chat, u), style);
  2492. }
  2493. else if (chat_fade_amt < 2.f)
  2494. {
  2495. F32 u = clamp_rescale(chat_fade_amt, 1.9f, 2.f, 0.f, 1.f);
  2496. mNameText->addLine(utf8str_to_wstring(chat_iter->mText), lerp(normal_chat, old_chat, u), style);
  2497. }
  2498. else if (chat_fade_amt < 3.f)
  2499. {
  2500. // *NOTE: only remove lines down to minimum number
  2501. mNameText->addLine(utf8str_to_wstring(chat_iter->mText), old_chat, style);
  2502. }
  2503. }
  2504. mNameText->setVisibleOffScreen(TRUE);
  2505. if (mTyping)
  2506. {
  2507. S32 dot_count = (llfloor(mTypingTimer.getElapsedTimeF32() * 3.f) + 2) % 3 + 1;
  2508. switch(dot_count)
  2509. {
  2510. case 1:
  2511. mNameText->addLine(".", new_chat);
  2512. break;
  2513. case 2:
  2514. mNameText->addLine("..", new_chat);
  2515. break;
  2516. case 3:
  2517. mNameText->addLine("...", new_chat);
  2518. break;
  2519. }
  2520. }
  2521. }
  2522. else
  2523. {
  2524. if (gSavedSettings.getBOOL("SmallAvatarNames"))
  2525. {
  2526. mNameText->setFont(LLFontGL::getFontSansSerif());
  2527. }
  2528. else
  2529. {
  2530. mNameText->setFont(LLFontGL::getFontSansSerifBig());
  2531. }
  2532. mNameText->setTextAlignment(LLHUDText::ALIGN_TEXT_CENTER);
  2533. mNameText->setFadeDistance(CHAT_NORMAL_RADIUS, 5.f);
  2534. mNameText->setVisibleOffScreen(FALSE);
  2535. if (new_name)
  2536. {
  2537. mNameText->setLabel("");
  2538. mNameText->setString(mNameString);
  2539. }
  2540. }
  2541. }
  2542. }
  2543. else if (mNameText)
  2544. {
  2545. mNameText->markDead();
  2546. mNameText = NULL;
  2547. sNumVisibleChatBubbles--;
  2548. }
  2549. }
  2550. //--------------------------------------------------------------------
  2551. // draw tractor beam when editing objects
  2552. //--------------------------------------------------------------------
  2553. // virtual
  2554. void LLVOAvatar::idleUpdateTractorBeam()
  2555. {
  2556. }
  2557. void LLVOAvatar::idleUpdateBelowWater()
  2558. {
  2559. F32 avatar_height = (F32)(getPositionGlobal().mdV[VZ]);
  2560. F32 water_height;
  2561. water_height = getRegion()->getWaterHeight();
  2562. mBelowWater =  avatar_height < water_height;
  2563. }
  2564. void LLVOAvatar::slamPosition()
  2565. {
  2566. gAgent.setPositionAgent(getPositionAgent());
  2567. mRoot.setWorldPosition(getPositionAgent()); // teleport
  2568. setChanged(TRANSLATED);
  2569. if (mDrawable.notNull())
  2570. {
  2571. gPipeline.updateMoveNormalAsync(mDrawable);
  2572. }
  2573. mRoot.updateWorldMatrixChildren();
  2574. }
  2575. //------------------------------------------------------------------------
  2576. // updateCharacter()
  2577. // called on both your avatar and other avatars
  2578. //------------------------------------------------------------------------
  2579. BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
  2580. {
  2581. LLMemType mt(LLMemType::MTYPE_AVATAR);
  2582. // clear debug text
  2583. mDebugText.clear();
  2584. if (LLVOAvatar::sShowAnimationDebug)
  2585. {
  2586. for (LLMotionController::motion_list_t::iterator iter = mMotionController.getActiveMotions().begin();
  2587.  iter != mMotionController.getActiveMotions().end(); ++iter)
  2588. {
  2589. LLMotion* motionp = *iter;
  2590. if (motionp->getMinPixelArea() < getPixelArea())
  2591. {
  2592. std::string output;
  2593. if (motionp->getName().empty())
  2594. {
  2595. output = llformat("%s - %d",
  2596.   motionp->getID().asString().c_str(),
  2597.   (U32)motionp->getPriority());
  2598. }
  2599. else
  2600. {
  2601. output = llformat("%s - %d",
  2602.   motionp->getName().c_str(),
  2603.   (U32)motionp->getPriority());
  2604. }
  2605. addDebugText(output);
  2606. }
  2607. }
  2608. }
  2609. if (gNoRender)
  2610. {
  2611. // Hack if we're running drones...
  2612. if (isSelf())
  2613. {
  2614. gAgent.setPositionAgent(getPositionAgent());
  2615. }
  2616. return FALSE;
  2617. }
  2618. LLVector3d root_pos_global;
  2619. if (!mIsBuilt)
  2620. {
  2621. return FALSE;
  2622. }
  2623. BOOL visible = isVisible();
  2624. // For fading out the names above heads, only let the timer
  2625. // run if we're visible.
  2626. if (mDrawable.notNull() && !visible)
  2627. {
  2628. mTimeVisible.reset();
  2629. }
  2630. //--------------------------------------------------------------------
  2631. // the rest should only be done occasionally for far away avatars
  2632. //--------------------------------------------------------------------
  2633. if (visible && !isSelf() && !mIsDummy && sUseImpostors && !mNeedsAnimUpdate && !sFreezeCounter)
  2634. {
  2635. F32 impostor_area = 256.f*512.f*(8.125f - LLVOAvatar::sLODFactor*8.f);
  2636. if (LLMuteList::getInstance()->isMuted(getID()))
  2637. { // muted avatars update at 16 hz
  2638. mUpdatePeriod = 16;
  2639. }
  2640. else if (visible && mVisibilityRank <= LLVOAvatar::sMaxVisible * 0.25f)
  2641. { //first 25% of max visible avatars are not impostored
  2642. mUpdatePeriod = 1;
  2643. }
  2644. else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 0.75f)
  2645. { //back 25% of max visible avatars are slow updating impostors
  2646. mUpdatePeriod = 8;
  2647. }
  2648. else if (visible && mVisibilityRank > (U32) LLVOAvatar::sMaxVisible)
  2649. { //background avatars are REALLY slow updating impostors
  2650. mUpdatePeriod = 16;
  2651. }
  2652. else if (visible && mImpostorPixelArea <= impostor_area)
  2653. {  // stuff in between gets an update period based on pixel area
  2654. mUpdatePeriod = llclamp((S32) sqrtf(impostor_area*4.f/mImpostorPixelArea), 2, 8);
  2655. }
  2656. else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 0.25f)
  2657. { // force nearby impostors in ultra crowded areas
  2658. mUpdatePeriod = 2;
  2659. }
  2660. else
  2661. { // not impostored
  2662. mUpdatePeriod = 1;
  2663. }
  2664. visible = (LLDrawable::getCurrentFrame()+mID.mData[0])%mUpdatePeriod == 0 ? TRUE : FALSE;
  2665. }
  2666. if (!visible)
  2667. {
  2668. updateMotions(LLCharacter::HIDDEN_UPDATE);
  2669. return FALSE;
  2670. }
  2671. // change animation time quanta based on avatar render load
  2672. if (!isSelf() && !mIsDummy)
  2673. {
  2674. F32 time_quantum = clamp_rescale((F32)sInstances.size(), 10.f, 35.f, 0.f, 0.25f);
  2675. F32 pixel_area_scale = clamp_rescale(mPixelArea, 100, 5000, 1.f, 0.f);
  2676. F32 time_step = time_quantum * pixel_area_scale;
  2677. if (time_step != 0.f)
  2678. {
  2679. // disable walk motion servo controller as it doesn't work with motion timesteps
  2680. stopMotion(ANIM_AGENT_WALK_ADJUST);
  2681. removeAnimationData("Walk Speed");
  2682. }
  2683. mMotionController.setTimeStep(time_step);
  2684. // llinfos << "Setting timestep to " << time_quantum * pixel_area_scale << llendl;
  2685. }
  2686. if (getParent() && !mIsSitting)
  2687. {
  2688. sitOnObject((LLViewerObject*)getParent());
  2689. }
  2690. else if (!getParent() && mIsSitting && !isMotionActive(ANIM_AGENT_SIT_GROUND_CONSTRAINED))
  2691. {
  2692. getOffObject();
  2693. }
  2694. //--------------------------------------------------------------------
  2695. // create local variables in world coords for region position values
  2696. //--------------------------------------------------------------------
  2697. F32 speed;
  2698. LLVector3 normal;
  2699. LLVector3 xyVel = getVelocity();
  2700. xyVel.mV[VZ] = 0.0f;
  2701. speed = xyVel.length();
  2702. BOOL throttle = TRUE;
  2703. if (!(mIsSitting && getParent()))
  2704. {
  2705. //--------------------------------------------------------------------
  2706. // get timing info
  2707. // handle initial condition case
  2708. //--------------------------------------------------------------------
  2709. F32 animation_time = mAnimTimer.getElapsedTimeF32();
  2710. if (mTimeLast == 0.0f)
  2711. {
  2712. mTimeLast = animation_time;
  2713. throttle = FALSE;
  2714. // put the pelvis at slaved position/mRotation
  2715. mRoot.setWorldPosition( getPositionAgent() ); // first frame
  2716. mRoot.setWorldRotation( getRotation() );
  2717. }
  2718. //--------------------------------------------------------------------
  2719. // dont' let dT get larger than 1/5th of a second
  2720. //--------------------------------------------------------------------
  2721. F32 deltaTime = animation_time - mTimeLast;
  2722. deltaTime = llclamp( deltaTime, DELTA_TIME_MIN, DELTA_TIME_MAX );
  2723. mTimeLast = animation_time;
  2724. mSpeedAccum = (mSpeedAccum * 0.95f) + (speed * 0.05f);
  2725. //--------------------------------------------------------------------
  2726. // compute the position of the avatar's root
  2727. //--------------------------------------------------------------------
  2728. LLVector3d root_pos;
  2729. LLVector3d ground_under_pelvis;
  2730. if (isSelf())
  2731. {
  2732. gAgent.setPositionAgent(getRenderPosition());
  2733. }
  2734. root_pos = gAgent.getPosGlobalFromAgent(getRenderPosition());
  2735. resolveHeightGlobal(root_pos, ground_under_pelvis, normal);
  2736. F32 foot_to_ground = (F32) (root_pos.mdV[VZ] - mPelvisToFoot - ground_under_pelvis.mdV[VZ]);
  2737. BOOL in_air = ((!LLWorld::getInstance()->getRegionFromPosGlobal(ground_under_pelvis)) || 
  2738. foot_to_ground > FOOT_GROUND_COLLISION_TOLERANCE);
  2739. if (in_air && !mInAir)
  2740. {
  2741. mTimeInAir.reset();
  2742. }
  2743. mInAir = in_air;
  2744. // correct for the fact that the pelvis is not necessarily the center 
  2745. // of the agent's physical representation
  2746. root_pos.mdV[VZ] -= (0.5f * mBodySize.mV[VZ]) - mPelvisToFoot;
  2747. LLVector3 newPosition = gAgent.getPosAgentFromGlobal(root_pos);
  2748. if (newPosition != mRoot.getXform()->getWorldPosition())
  2749. {
  2750. mRoot.touch();
  2751. mRoot.setWorldPosition(newPosition ); // regular update
  2752. }
  2753. //--------------------------------------------------------------------
  2754. // Propagate viewer object rotation to root of avatar
  2755. //--------------------------------------------------------------------
  2756. if (!isAnyAnimationSignaled(AGENT_NO_ROTATE_ANIMS, NUM_AGENT_NO_ROTATE_ANIMS))
  2757. {
  2758. LLQuaternion iQ;
  2759. LLVector3 upDir( 0.0f, 0.0f, 1.0f );
  2760. // Compute a forward direction vector derived from the primitive rotation
  2761. // and the velocity vector.  When walking or jumping, don't let body deviate
  2762. // more than 90 from the view, if necessary, flip the velocity vector.
  2763. LLVector3 primDir;
  2764. if (isSelf())
  2765. {
  2766. primDir = agent.getAtAxis() - projected_vec(agent.getAtAxis(), agent.getReferenceUpVector());
  2767. primDir.normalize();
  2768. }
  2769. else
  2770. {
  2771. primDir = getRotation().getMatrix3().getFwdRow();
  2772. }
  2773. LLVector3 velDir = getVelocity();
  2774. velDir.normalize();
  2775. if ( mSignaledAnimations.find(ANIM_AGENT_WALK) != mSignaledAnimations.end())
  2776. {
  2777. F32 vpD = velDir * primDir;
  2778. if (vpD < -0.5f)
  2779. {
  2780. velDir *= -1.0f;
  2781. }
  2782. }
  2783. LLVector3 fwdDir = lerp(primDir, velDir, clamp_rescale(speed, 0.5f, 2.0f, 0.0f, 1.0f));
  2784. if (isSelf() && gAgent.cameraMouselook())
  2785. {
  2786. // make sure fwdDir stays in same general direction as primdir
  2787. if (gAgent.getFlying())
  2788. {
  2789. fwdDir = LLViewerCamera::getInstance()->getAtAxis();
  2790. }
  2791. else
  2792. {
  2793. LLVector3 at_axis = LLViewerCamera::getInstance()->getAtAxis();
  2794. LLVector3 up_vector = gAgent.getReferenceUpVector();
  2795. at_axis -= up_vector * (at_axis * up_vector);
  2796. at_axis.normalize();
  2797. F32 dot = fwdDir * at_axis;
  2798. if (dot < 0.f)
  2799. {
  2800. fwdDir -= 2.f * at_axis * dot;
  2801. fwdDir.normalize();
  2802. }
  2803. }
  2804. }
  2805. LLQuaternion root_rotation = mRoot.getWorldMatrix().quaternion();
  2806. F32 root_roll, root_pitch, root_yaw;
  2807. root_rotation.getEulerAngles(&root_roll, &root_pitch, &root_yaw);
  2808. // When moving very slow, the pelvis is allowed to deviate from the
  2809. // forward direction to allow it to hold it's position while the torso
  2810. // and head turn.  Once in motion, it must conform however.
  2811. BOOL self_in_mouselook = isSelf() && gAgent.cameraMouselook();
  2812. LLVector3 pelvisDir( mRoot.getWorldMatrix().getFwdRow4().mV );
  2813. F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, PELVIS_ROT_THRESHOLD_SLOW, PELVIS_ROT_THRESHOLD_FAST);
  2814. if (self_in_mouselook)
  2815. {
  2816. pelvis_rot_threshold *= MOUSELOOK_PELVIS_FOLLOW_FACTOR;
  2817. }
  2818. pelvis_rot_threshold *= DEG_TO_RAD;
  2819. F32 angle = angle_between( pelvisDir, fwdDir );
  2820. // The avatar's root is allowed to have a yaw that deviates widely
  2821. // from the forward direction, but if roll or pitch are off even
  2822. // a little bit we need to correct the rotation.
  2823. if(root_roll < 1.f * DEG_TO_RAD
  2824.    && root_pitch < 5.f * DEG_TO_RAD)
  2825. {
  2826. // smaller correction vector means pelvis follows prim direction more closely
  2827. if (!mTurning && angle > pelvis_rot_threshold*0.75f)
  2828. {
  2829. mTurning = TRUE;
  2830. }
  2831. // use tighter threshold when turning
  2832. if (mTurning)
  2833. {
  2834. pelvis_rot_threshold *= 0.4f;
  2835. }
  2836. // am I done turning?
  2837. if (angle < pelvis_rot_threshold)
  2838. {
  2839. mTurning = FALSE;
  2840. }
  2841. LLVector3 correction_vector = (pelvisDir - fwdDir) * clamp_rescale(angle, pelvis_rot_threshold*0.75f, pelvis_rot_threshold, 1.0f, 0.0f);
  2842. fwdDir += correction_vector;
  2843. }
  2844. else
  2845. {
  2846. mTurning = FALSE;
  2847. }
  2848. // Now compute the full world space rotation for the whole body (wQv)
  2849. LLVector3 leftDir = upDir % fwdDir;
  2850. leftDir.normalize();
  2851. fwdDir = leftDir % upDir;
  2852. LLQuaternion wQv( fwdDir, leftDir, upDir );
  2853. if (isSelf() && mTurning)
  2854. {
  2855. if ((fwdDir % pelvisDir) * upDir > 0.f)
  2856. {
  2857. gAgent.setControlFlags(AGENT_CONTROL_TURN_RIGHT);
  2858. }
  2859. else
  2860. {
  2861. gAgent.setControlFlags(AGENT_CONTROL_TURN_LEFT);
  2862. }
  2863. }
  2864. // Set the root rotation, but do so incrementally so that it
  2865. // lags in time by some fixed amount.
  2866. //F32 u = LLCriticalDamp::getInterpolant(PELVIS_LAG);
  2867. F32 pelvis_lag_time = 0.f;
  2868. if (self_in_mouselook)
  2869. {
  2870. pelvis_lag_time = PELVIS_LAG_MOUSELOOK;
  2871. }
  2872. else if (mInAir)
  2873. {
  2874. pelvis_lag_time = PELVIS_LAG_FLYING;
  2875. // increase pelvis lag time when moving slowly
  2876. pelvis_lag_time *= clamp_rescale(mSpeedAccum, 0.f, 15.f, 3.f, 1.f);
  2877. }
  2878. else
  2879. {
  2880. pelvis_lag_time = PELVIS_LAG_WALKING;
  2881. }
  2882. F32 u = llclamp((deltaTime / pelvis_lag_time), 0.0f, 1.0f);
  2883. mRoot.setWorldRotation( slerp(u, mRoot.getWorldRotation(), wQv) );
  2884. }
  2885. }
  2886. else if (mDrawable.notNull())
  2887. {
  2888. mRoot.setPosition(mDrawable->getPosition());
  2889. mRoot.setRotation(mDrawable->getRotation());
  2890. }
  2891. //-------------------------------------------------------------------------
  2892. // Update character motions
  2893. //-------------------------------------------------------------------------
  2894. // store data relevant to motions
  2895. mSpeed = speed;
  2896. // update animations
  2897. if (mSpecialRenderMode == 1) // Animation Preview
  2898. updateMotions(LLCharacter::FORCE_UPDATE);
  2899. else
  2900. updateMotions(LLCharacter::NORMAL_UPDATE);
  2901. // update head position
  2902. updateHeadOffset();
  2903. //-------------------------------------------------------------------------
  2904. // Find the ground under each foot, these are used for a variety
  2905. // of things that follow
  2906. //-------------------------------------------------------------------------
  2907. LLVector3 ankle_left_pos_agent = mFootLeftp->getWorldPosition();
  2908. LLVector3 ankle_right_pos_agent = mFootRightp->getWorldPosition();
  2909. LLVector3 ankle_left_ground_agent = ankle_left_pos_agent;
  2910. LLVector3 ankle_right_ground_agent = ankle_right_pos_agent;
  2911. resolveHeightAgent(ankle_left_pos_agent, ankle_left_ground_agent, normal);
  2912. resolveHeightAgent(ankle_right_pos_agent, ankle_right_ground_agent, normal);
  2913. F32 leftElev = llmax(-0.2f, ankle_left_pos_agent.mV[VZ] - ankle_left_ground_agent.mV[VZ]);
  2914. F32 rightElev = llmax(-0.2f, ankle_right_pos_agent.mV[VZ] - ankle_right_ground_agent.mV[VZ]);
  2915. if (!mIsSitting)
  2916. {
  2917. //-------------------------------------------------------------------------
  2918. // Figure out which foot is on ground
  2919. //-------------------------------------------------------------------------
  2920. if (!mInAir)
  2921. {
  2922. if ((leftElev < 0.0f) || (rightElev < 0.0f))
  2923. {
  2924. ankle_left_pos_agent = mFootLeftp->getWorldPosition();
  2925. ankle_right_pos_agent = mFootRightp->getWorldPosition();
  2926. leftElev = ankle_left_pos_agent.mV[VZ] - ankle_left_ground_agent.mV[VZ];
  2927. rightElev = ankle_right_pos_agent.mV[VZ] - ankle_right_ground_agent.mV[VZ];
  2928. }
  2929. }
  2930. }
  2931. //-------------------------------------------------------------------------
  2932. // Generate footstep sounds when feet hit the ground
  2933. //-------------------------------------------------------------------------
  2934. const LLUUID AGENT_FOOTSTEP_ANIMS[] = {ANIM_AGENT_WALK, ANIM_AGENT_RUN, ANIM_AGENT_LAND};
  2935. const S32 NUM_AGENT_FOOTSTEP_ANIMS = LL_ARRAY_SIZE(AGENT_FOOTSTEP_ANIMS);
  2936. if ( gAudiop && isAnyAnimationSignaled(AGENT_FOOTSTEP_ANIMS, NUM_AGENT_FOOTSTEP_ANIMS) )
  2937. {
  2938. BOOL playSound = FALSE;
  2939. LLVector3 foot_pos_agent;
  2940. BOOL onGroundLeft = (leftElev <= 0.05f);
  2941. BOOL onGroundRight = (rightElev <= 0.05f);
  2942. // did left foot hit the ground?
  2943. if ( onGroundLeft && !mWasOnGroundLeft )
  2944. {
  2945. foot_pos_agent = ankle_left_pos_agent;
  2946. playSound = TRUE;
  2947. }
  2948. // did right foot hit the ground?
  2949. if ( onGroundRight && !mWasOnGroundRight )
  2950. {
  2951. foot_pos_agent = ankle_right_pos_agent;
  2952. playSound = TRUE;
  2953. }
  2954. mWasOnGroundLeft = onGroundLeft;
  2955. mWasOnGroundRight = onGroundRight;
  2956. if ( playSound )
  2957. {
  2958. // F32 gain = clamp_rescale( mSpeedAccum,
  2959. // AUDIO_STEP_LO_SPEED, AUDIO_STEP_HI_SPEED,
  2960. // AUDIO_STEP_LO_GAIN, AUDIO_STEP_HI_GAIN );
  2961. const F32 STEP_VOLUME = 0.5f;
  2962. const LLUUID& step_sound_id = getStepSound();
  2963. LLVector3d foot_pos_global = gAgent.getPosGlobalFromAgent(foot_pos_agent);
  2964. if (LLViewerParcelMgr::getInstance()->canHearSound(foot_pos_global)
  2965. && !LLMuteList::getInstance()->isMuted(getID(), LLMute::flagObjectSounds))
  2966. {
  2967. gAudiop->triggerSound(step_sound_id, getID(), STEP_VOLUME, LLAudioEngine::AUDIO_TYPE_AMBIENT, foot_pos_global);
  2968. }
  2969. }
  2970. }
  2971. mRoot.updateWorldMatrixChildren();
  2972. if (!mDebugText.size() && mText.notNull())
  2973. {
  2974. mText->markDead();
  2975. mText = NULL;
  2976. }
  2977. else if (mDebugText.size())
  2978. {
  2979. setDebugText(mDebugText);
  2980. }
  2981. //mesh vertices need to be reskinned
  2982. mNeedsSkin = TRUE;
  2983. return TRUE;
  2984. }
  2985. //-----------------------------------------------------------------------------
  2986. // updateHeadOffset()
  2987. //-----------------------------------------------------------------------------
  2988. void LLVOAvatar::updateHeadOffset()
  2989. {
  2990. // since we only care about Z, just grab one of the eyes
  2991. LLVector3 midEyePt = mEyeLeftp->getWorldPosition();
  2992. midEyePt -= mDrawable.notNull() ? mDrawable->getWorldPosition() : mRoot.getWorldPosition();
  2993. midEyePt.mV[VZ] = llmax(-mPelvisToFoot + LLViewerCamera::getInstance()->getNear(), midEyePt.mV[VZ]);
  2994. if (mDrawable.notNull())
  2995. {
  2996. midEyePt = midEyePt * ~mDrawable->getWorldRotation();
  2997. }
  2998. if (mIsSitting)
  2999. {
  3000. mHeadOffset = midEyePt;
  3001. }
  3002. else
  3003. {
  3004. F32 u = llmax(0.f, HEAD_MOVEMENT_AVG_TIME - (1.f / gFPSClamped));
  3005. mHeadOffset = lerp(midEyePt, mHeadOffset,  u);
  3006. }
  3007. }
  3008. //------------------------------------------------------------------------
  3009. // updateVisibility()
  3010. //------------------------------------------------------------------------
  3011. void LLVOAvatar::updateVisibility()
  3012. {
  3013. BOOL visible = FALSE;
  3014. if (mIsDummy)
  3015. {
  3016. visible = TRUE;
  3017. }
  3018. else if (mDrawable.isNull())
  3019. {
  3020. visible = FALSE;
  3021. }
  3022. else
  3023. {
  3024. if (!mDrawable->getSpatialGroup() || mDrawable->getSpatialGroup()->isVisible())
  3025. {
  3026. visible = TRUE;
  3027. }
  3028. else
  3029. {
  3030. visible = FALSE;
  3031. }
  3032. if(isSelf())
  3033. {
  3034. if (!gAgentWearables.areWearablesLoaded())
  3035. {
  3036. visible = FALSE;
  3037. }
  3038. }
  3039. else if( !mFirstAppearanceMessageReceived )
  3040. {
  3041. visible = FALSE;
  3042. }
  3043. if (sDebugInvisible)
  3044. {
  3045. LLNameValue* firstname = getNVPair("FirstName");
  3046. if (firstname)
  3047. {
  3048. llinfos << "Avatar " << firstname->getString() << " updating visiblity" << llendl;
  3049. }
  3050. else
  3051. {
  3052. llinfos << "Avatar " << this << " updating visiblity" << llendl;
  3053. }
  3054. if (visible)
  3055. {
  3056. llinfos << "Visible" << llendl;
  3057. }
  3058. else
  3059. {
  3060. llinfos << "Not visible" << llendl;
  3061. }
  3062. /*if (avatar_in_frustum)
  3063. {
  3064. llinfos << "Avatar in frustum" << llendl;
  3065. }
  3066. else
  3067. {
  3068. llinfos << "Avatar not in frustum" << llendl;
  3069. }*/
  3070. /*if (LLViewerCamera::getInstance()->sphereInFrustum(sel_pos_agent, 2.0f))
  3071. {
  3072. llinfos << "Sel pos visible" << llendl;
  3073. }
  3074. if (LLViewerCamera::getInstance()->sphereInFrustum(wrist_right_pos_agent, 0.2f))
  3075. {
  3076. llinfos << "Wrist pos visible" << llendl;
  3077. }
  3078. if (LLViewerCamera::getInstance()->sphereInFrustum(getPositionAgent(), getMaxScale()*2.f))
  3079. {
  3080. llinfos << "Agent visible" << llendl;
  3081. }*/
  3082. llinfos << "PA: " << getPositionAgent() << llendl;
  3083. /*llinfos << "SPA: " << sel_pos_agent << llendl;
  3084. llinfos << "WPA: " << wrist_right_pos_agent << llendl;*/
  3085. for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
  3086.  iter != mAttachmentPoints.end();
  3087.  ++iter)
  3088. {
  3089. LLViewerJointAttachment* attachment = iter->second;
  3090. for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
  3091.  attachment_iter != attachment->mAttachedObjects.end();
  3092.  ++attachment_iter)
  3093. {
  3094. if (LLViewerObject *attached_object = (*attachment_iter))
  3095. {
  3096. if(attached_object->mDrawable->isVisible())
  3097. {
  3098. llinfos << attachment->getName() << " visible" << llendl;
  3099. }
  3100. else
  3101. {
  3102. llinfos << attachment->getName() << " not visible at " << mDrawable->getWorldPosition() << " and radius " << mDrawable->getRadius() << llendl;
  3103. }
  3104. }
  3105. }
  3106. }
  3107. }
  3108. }
  3109. if (!visible && mVisible)
  3110. {
  3111. mMeshInvisibleTime.reset();
  3112. }
  3113. if (visible)
  3114. {
  3115. if (!mMeshValid)
  3116. {
  3117. restoreMeshData();
  3118. }
  3119. }
  3120. else
  3121. {
  3122. if (mMeshValid && mMeshInvisibleTime.getElapsedTimeF32() > TIME_BEFORE_MESH_CLEANUP)
  3123. {
  3124. releaseMeshData();
  3125. }
  3126. // this breaks off-screen chat bubbles
  3127. //if (mNameText)
  3128. //{
  3129. // mNameText->markDead();
  3130. // mNameText = NULL;
  3131. // sNumVisibleChatBubbles--;
  3132. //}
  3133. }
  3134. mVisible = visible;
  3135. }
  3136. // private
  3137. bool LLVOAvatar::shouldAlphaMask()
  3138. {
  3139. const bool should_alpha_mask = mSupportsAlphaLayers && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked
  3140. && !LLDrawPoolAvatar::sSkipTransparent;
  3141. return should_alpha_mask;
  3142. }
  3143. //-----------------------------------------------------------------------------
  3144. // renderSkinned()
  3145. //-----------------------------------------------------------------------------
  3146. U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
  3147. {
  3148. U32 num_indices = 0;
  3149. if (!mIsBuilt)
  3150. {
  3151. return num_indices;
  3152. }
  3153. if (mDirtyMesh || mDrawable->isState(LLDrawable::REBUILD_GEOMETRY))
  3154. { //LOD changed or new mesh created, allocate new vertex buffer if needed
  3155. updateMeshData();
  3156. mDirtyMesh = FALSE;
  3157. mNeedsSkin = TRUE;
  3158. mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY);
  3159. }
  3160. if (LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) <= 0)
  3161. {
  3162. if (mNeedsSkin)
  3163. {
  3164. //generate animated mesh
  3165. mMeshLOD[MESH_ID_LOWER_BODY]->updateJointGeometry();
  3166. mMeshLOD[MESH_ID_UPPER_BODY]->updateJointGeometry();
  3167. if( isWearingWearableType( WT_SKIRT ) )
  3168. {
  3169. mMeshLOD[MESH_ID_SKIRT]->updateJointGeometry();
  3170. }
  3171. if (!isSelf() || gAgent.needsRenderHead() || LLPipeline::sShadowRender)
  3172. {
  3173. mMeshLOD[MESH_ID_EYELASH]->updateJointGeometry();
  3174. mMeshLOD[MESH_ID_HEAD]->updateJointGeometry();
  3175. mMeshLOD[MESH_ID_HAIR]->updateJointGeometry();
  3176. }
  3177. mNeedsSkin = FALSE;
  3178. LLVertexBuffer* vb = mDrawable->getFace(0)->mVertexBuffer;
  3179. if (vb)
  3180. {
  3181. vb->setBuffer(0);
  3182. }
  3183. }
  3184. }
  3185. else
  3186. {
  3187. mNeedsSkin = FALSE;
  3188. }
  3189. if (sDebugInvisible)
  3190. {
  3191. LLNameValue* firstname = getNVPair("FirstName");
  3192. if (firstname)
  3193. {
  3194. llinfos << "Avatar " << firstname->getString() << " in render" << llendl;
  3195. }
  3196. else
  3197. {
  3198. llinfos << "Avatar " << this << " in render" << llendl;
  3199. }
  3200. if (!mIsBuilt)
  3201. {
  3202. llinfos << "Not built!" << llendl;
  3203. }
  3204. else if (!gAgent.needsRenderAvatar())
  3205. {
  3206. llinfos << "Doesn't need avatar render!" << llendl;
  3207. }
  3208. else
  3209. {
  3210. llinfos << "Rendering!" << llendl;
  3211. }
  3212. }
  3213. if (!mIsBuilt)
  3214. {
  3215. return num_indices;
  3216. }
  3217. if (isSelf() && !gAgent.needsRenderAvatar())
  3218. {
  3219. return num_indices;
  3220. }
  3221. // render collision normal
  3222. // *NOTE: this is disabled (there is no UI for enabling sShowFootPlane) due
  3223. // to DEV-14477.  the code is left here to aid in tracking down the cause
  3224. // of the crash in the future. -brad
  3225. if (!gRenderForSelect && sShowFootPlane && mDrawable.notNull())
  3226. {
  3227. LLVector3 slaved_pos = mDrawable->getPositionAgent();
  3228. LLVector3 foot_plane_normal(mFootPlane.mV[VX], mFootPlane.mV[VY], mFootPlane.mV[VZ]);
  3229. F32 dist_from_plane = (slaved_pos * foot_plane_normal) - mFootPlane.mV[VW];
  3230. LLVector3 collide_point = slaved_pos;
  3231. collide_point.mV[VZ] -= foot_plane_normal.mV[VZ] * (dist_from_plane + COLLISION_TOLERANCE - FOOT_COLLIDE_FUDGE);
  3232. gGL.begin(LLRender::LINES);
  3233. {
  3234. F32 SQUARE_SIZE = 0.2f;
  3235. gGL.color4f(1.f, 0.f, 0.f, 1.f);
  3236. gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]);
  3237. gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]);
  3238. gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]);
  3239. gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]);
  3240. gGL.vertex3f(collide_point.mV[VX] + SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]);
  3241. gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]);
  3242. gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] + SQUARE_SIZE, collide_point.mV[VZ]);
  3243. gGL.vertex3f(collide_point.mV[VX] - SQUARE_SIZE, collide_point.mV[VY] - SQUARE_SIZE, collide_point.mV[VZ]);
  3244. gGL.vertex3f(collide_point.mV[VX], collide_point.mV[VY], collide_point.mV[VZ]);
  3245. gGL.vertex3f(collide_point.mV[VX] + mFootPlane.mV[VX], collide_point.mV[VY] + mFootPlane.mV[VY], collide_point.mV[VZ] + mFootPlane.mV[VZ]);
  3246. }
  3247. gGL.end();
  3248. gGL.flush();
  3249. }
  3250. //--------------------------------------------------------------------
  3251. // render all geometry attached to the skeleton
  3252. //--------------------------------------------------------------------
  3253. static LLStat render_stat;
  3254. LLViewerJointMesh::sRenderPass = pass;
  3255. if (pass == AVATAR_RENDER_PASS_SINGLE)
  3256. {
  3257. bool should_alpha_mask = shouldAlphaMask();
  3258. LLGLState test(GL_ALPHA_TEST, should_alpha_mask);
  3259. if (should_alpha_mask)
  3260. {
  3261. gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
  3262. }
  3263. BOOL first_pass = TRUE;
  3264. if (!LLDrawPoolAvatar::sSkipOpaque)
  3265. {
  3266. if (!isSelf() || gAgent.needsRenderHead() || LLPipeline::sShadowRender)
  3267. {
  3268. if (isTextureVisible(TEX_HEAD_BAKED) || mIsDummy)
  3269. {
  3270. num_indices += mMeshLOD[MESH_ID_HEAD]->render(mAdjustedPixelArea, TRUE, mIsDummy);
  3271. first_pass = FALSE;
  3272. }
  3273. }
  3274. if (isTextureVisible(TEX_UPPER_BAKED) || mIsDummy)
  3275. {
  3276. num_indices += mMeshLOD[MESH_ID_UPPER_BODY]->render(mAdjustedPixelArea, first_pass, mIsDummy);
  3277. first_pass = FALSE;
  3278. }
  3279. if (isTextureVisible(TEX_LOWER_BAKED) || mIsDummy)
  3280. {
  3281. num_indices += mMeshLOD[MESH_ID_LOWER_BODY]->render(mAdjustedPixelArea, first_pass, mIsDummy);
  3282. first_pass = FALSE;
  3283. }
  3284. }
  3285. gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
  3286. if (!LLDrawPoolAvatar::sSkipTransparent || LLPipeline::sImpostorRender)
  3287. {
  3288. LLGLState blend(GL_BLEND, !mIsDummy);
  3289. LLGLState test(GL_ALPHA_TEST, !mIsDummy);
  3290. num_indices += renderTransparent(first_pass);
  3291. }
  3292. }
  3293. LLViewerJointMesh::sRenderPass = AVATAR_RENDER_PASS_SINGLE;
  3294. //llinfos << "Avatar render: " << render_timer.getElapsedTimeF32() << llendl;
  3295. //render_stat.addValue(render_timer.getElapsedTimeF32()*1000.f);
  3296. return num_indices;
  3297. }
  3298. U32 LLVOAvatar::renderTransparent(BOOL first_pass)
  3299. {
  3300. U32 num_indices = 0;
  3301. if( isWearingWearableType( WT_SKIRT ) && (mIsDummy || isTextureVisible(TEX_SKIRT_BAKED)) )
  3302. {
  3303. gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.25f);
  3304. num_indices += mMeshLOD[MESH_ID_SKIRT]->render(mAdjustedPixelArea, FALSE);
  3305. first_pass = FALSE;
  3306. gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
  3307. }
  3308. if (!isSelf() || gAgent.needsRenderHead() || LLPipeline::sShadowRender)
  3309. {
  3310. if (LLPipeline::sImpostorRender)
  3311. {
  3312. gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
  3313. }
  3314. if (isTextureVisible(TEX_HEAD_BAKED))
  3315. {
  3316. num_indices += mMeshLOD[MESH_ID_EYELASH]->render(mAdjustedPixelArea, first_pass, mIsDummy);
  3317. first_pass = FALSE;
  3318. }
  3319. // Can't test for baked hair being defined, since that won't always be the case (not all viewers send baked hair)
  3320. // TODO: 1.25 will be able to switch this logic back to calling isTextureVisible();
  3321. if (getImage(TEX_HAIR_BAKED, 0)->getID() != IMG_INVISIBLE || LLDrawPoolAlpha::sShowDebugAlpha)
  3322. {
  3323. num_indices += mMeshLOD[MESH_ID_HAIR]->render(mAdjustedPixelArea, first_pass, mIsDummy);
  3324. first_pass = FALSE;
  3325. }
  3326. if (LLPipeline::sImpostorRender)
  3327. {
  3328. gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
  3329. }
  3330. }
  3331. return num_indices;
  3332. }
  3333. //-----------------------------------------------------------------------------
  3334. // renderRigid()
  3335. //-----------------------------------------------------------------------------
  3336. U32 LLVOAvatar::renderRigid()
  3337. {
  3338. U32 num_indices = 0;
  3339. if (!mIsBuilt)
  3340. {
  3341. return 0;
  3342. }
  3343. if (isSelf() && (!gAgent.needsRenderAvatar() || !gAgent.needsRenderHead()))
  3344. {
  3345. return 0;
  3346. }
  3347. if (!mIsBuilt)
  3348. {
  3349. return 0;
  3350. }
  3351. bool should_alpha_mask = shouldAlphaMask();