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

游戏引擎

开发平台:

C++ Builder

  1. LLGLState test(GL_ALPHA_TEST, should_alpha_mask);
  2. if (should_alpha_mask)
  3. {
  4. gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
  5. }
  6. if (isTextureVisible(TEX_EYES_BAKED)  || mIsDummy)
  7. {
  8. num_indices += mMeshLOD[MESH_ID_EYEBALL_LEFT]->render(mAdjustedPixelArea, TRUE, mIsDummy);
  9. num_indices += mMeshLOD[MESH_ID_EYEBALL_RIGHT]->render(mAdjustedPixelArea, TRUE, mIsDummy);
  10. }
  11. gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
  12. return num_indices;
  13. }
  14. U32 LLVOAvatar::renderFootShadows()
  15. {
  16. U32 num_indices = 0;
  17. if (!mIsBuilt)
  18. {
  19. return 0;
  20. }
  21. if (isSelf() && (!gAgent.needsRenderAvatar() || !gAgent.needsRenderHead()))
  22. {
  23. return 0;
  24. }
  25. if (!mIsBuilt)
  26. {
  27. return 0;
  28. }
  29. // Don't render foot shadows if your lower body is completely invisible.
  30. // (non-humanoid avatars rule!)
  31. if (!isTextureVisible(TEX_LOWER_BAKED))
  32. {
  33. return 0;
  34. }
  35. // Update the shadow, tractor, and text label geometry.
  36. if (mDrawable->isState(LLDrawable::REBUILD_SHADOW) && !isImpostor())
  37. {
  38. updateShadowFaces();
  39. mDrawable->clearState(LLDrawable::REBUILD_SHADOW);
  40. }
  41. U32 foot_mask = LLVertexBuffer::MAP_VERTEX |
  42. LLVertexBuffer::MAP_TEXCOORD0;
  43. LLGLDepthTest test(GL_TRUE, GL_FALSE);
  44. //render foot shadows
  45. LLGLEnable blend(GL_BLEND);
  46. gGL.getTexUnit(0)->bind(mShadowImagep, TRUE);
  47. glColor4fv(mShadow0Facep->getRenderColor().mV);
  48. mShadow0Facep->renderIndexed(foot_mask);
  49. glColor4fv(mShadow1Facep->getRenderColor().mV);
  50. mShadow1Facep->renderIndexed(foot_mask);
  51. return num_indices;
  52. }
  53. U32 LLVOAvatar::renderImpostor(LLColor4U color, S32 diffuse_channel)
  54. {
  55. if (!mImpostor.isComplete())
  56. {
  57. return 0;
  58. }
  59. LLVector3 pos(getRenderPosition()+mImpostorOffset);
  60. LLVector3 at = (pos - LLViewerCamera::getInstance()->getOrigin());
  61. at.normalize();
  62. LLVector3 left = LLViewerCamera::getInstance()->getUpAxis() % at;
  63. LLVector3 up = at%left;
  64. left *= mImpostorDim.mV[0];
  65. up *= mImpostorDim.mV[1];
  66. LLGLEnable test(GL_ALPHA_TEST);
  67. gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f);
  68. gGL.color4ubv(color.mV);
  69. gGL.getTexUnit(diffuse_channel)->bind(&mImpostor);
  70. gGL.begin(LLRender::QUADS);
  71. gGL.texCoord2f(0,0);
  72. gGL.vertex3fv((pos+left-up).mV);
  73. gGL.texCoord2f(1,0);
  74. gGL.vertex3fv((pos-left-up).mV);
  75. gGL.texCoord2f(1,1);
  76. gGL.vertex3fv((pos-left+up).mV);
  77. gGL.texCoord2f(0,1);
  78. gGL.vertex3fv((pos+left+up).mV);
  79. gGL.end();
  80. gGL.flush();
  81. return 6;
  82. }
  83. //------------------------------------------------------------------------
  84. // LLVOAvatar::updateTextures()
  85. //------------------------------------------------------------------------
  86. void LLVOAvatar::updateTextures()
  87. {
  88. BOOL render_avatar = TRUE;
  89. if (mIsDummy || gNoRender)
  90. {
  91. return;
  92. }
  93. if( isSelf() )
  94. {
  95. render_avatar = TRUE;
  96. }
  97. else
  98. {
  99. render_avatar = isVisible() && !mCulled;
  100. }
  101. std::vector<BOOL> layer_baked;
  102. // GL NOT ACTIVE HERE - *TODO
  103. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  104. {
  105. layer_baked.push_back(isTextureDefined(mBakedTextureDatas[i].mTextureIndex));
  106. // bind the texture so that they'll be decoded slightly 
  107. // inefficient, we can short-circuit this if we have to
  108. if (render_avatar && !gGLManager.mIsDisabled)
  109. {
  110. if (layer_baked[i] && !mBakedTextureDatas[i].mIsLoaded)
  111. {
  112. gGL.getTexUnit(0)->bind(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ));
  113. }
  114. }
  115. }
  116. mMaxPixelArea = 0.f;
  117. mMinPixelArea = 99999999.f;
  118. mHasGrey = FALSE; // debug
  119. for (U32 texture_index = 0; texture_index < getNumTEs(); texture_index++)
  120. {
  121. EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)texture_index);
  122. U32 num_wearables = gAgentWearables.getWearableCount(wearable_type);
  123. const LLTextureEntry *te = getTE(texture_index);
  124. const F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT);
  125. LLViewerFetchedTexture *imagep = NULL;
  126. for (U32 wearable_index = 0; wearable_index < num_wearables; wearable_index++)
  127. {
  128. imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index, wearable_index), TRUE);
  129. if (imagep)
  130. {
  131. const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture((ETextureIndex)texture_index);
  132. const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
  133. if (texture_dict->mIsLocalTexture)
  134. {
  135. addLocalTextureStats((ETextureIndex)texture_index, imagep, texel_area_ratio, render_avatar, layer_baked[baked_index]);
  136. }
  137. }
  138. }
  139. if (isIndexBakedTexture((ETextureIndex) texture_index))
  140. {
  141. const S32 boost_level = getAvatarBakedBoostLevel();
  142. imagep = LLViewerTextureManager::staticCastToFetchedTexture(getImage(texture_index,0), TRUE);
  143. // Spam if this is a baked texture, not set to default image, without valid host info
  144. if (isIndexBakedTexture((ETextureIndex)texture_index)
  145. && imagep->getID() != IMG_DEFAULT_AVATAR
  146. && imagep->getID() != IMG_INVISIBLE
  147. && !imagep->getTargetHost().isOk())
  148. {
  149. LL_WARNS_ONCE("Texture") << "LLVOAvatar::updateTextures No host for texture "
  150.  << imagep->getID() << " for avatar "
  151.  << (isSelf() ? "<myself>" : getID().asString()) 
  152.  << " on host " << getRegion()->getHost() << llendl;
  153. }
  154. addBakedTextureStats( imagep, mPixelArea, texel_area_ratio, boost_level );
  155. }
  156. }
  157. if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
  158. {
  159. setDebugText(llformat("%4.0f:%4.0f", fsqrtf(mMinPixelArea),fsqrtf(mMaxPixelArea)));
  160. }
  161. if( render_avatar )
  162. {
  163. mShadowImagep->addTextureStats(mPixelArea);
  164. }
  165. }
  166. void LLVOAvatar::addLocalTextureStats( ETextureIndex idx, LLViewerFetchedTexture* imagep,
  167.    F32 texel_area_ratio, BOOL render_avatar, BOOL covered_by_baked, U32 index )
  168. {
  169. // No local texture stats for non-self avatars
  170. return;
  171. }
  172.     
  173. void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel_area, F32 texel_area_ratio, S32 boost_level)
  174. {
  175. mMaxPixelArea = llmax(pixel_area, mMaxPixelArea);
  176. mMinPixelArea = llmin(pixel_area, mMinPixelArea);
  177. imagep->addTextureStats(pixel_area / texel_area_ratio);
  178. imagep->setBoostLevel(boost_level);
  179. }
  180. //virtual
  181. void LLVOAvatar::setImage(const U8 te, LLViewerTexture *imagep, const U32 index)
  182. {
  183. setTEImage(te, imagep);
  184. }
  185. //virtual 
  186. LLViewerTexture* LLVOAvatar::getImage(const U8 te, const U32 index) const
  187. {
  188. return getTEImage(te);
  189. }
  190. //virtual 
  191. const LLTextureEntry* LLVOAvatar::getTexEntry(const U8 te_num) const
  192. {
  193. return getTE(te_num);
  194. }
  195. //virtual 
  196. void LLVOAvatar::setTexEntry(const U8 index, const LLTextureEntry &te)
  197. {
  198. setTE(index, te);
  199. }
  200. //-----------------------------------------------------------------------------
  201. // resolveHeight()
  202. //-----------------------------------------------------------------------------
  203. void LLVOAvatar::resolveHeightAgent(const LLVector3 &in_pos_agent, LLVector3 &out_pos_agent, LLVector3 &out_norm)
  204. {
  205. LLVector3d in_pos_global, out_pos_global;
  206. in_pos_global = gAgent.getPosGlobalFromAgent(in_pos_agent);
  207. resolveHeightGlobal(in_pos_global, out_pos_global, out_norm);
  208. out_pos_agent = gAgent.getPosAgentFromGlobal(out_pos_global);
  209. }
  210. void LLVOAvatar::resolveRayCollisionAgent(const LLVector3d start_pt, const LLVector3d end_pt, LLVector3d &out_pos, LLVector3 &out_norm)
  211. {
  212. LLViewerObject *obj;
  213. LLWorld::getInstance()->resolveStepHeightGlobal(this, start_pt, end_pt, out_pos, out_norm, &obj);
  214. }
  215. void LLVOAvatar::resolveHeightGlobal(const LLVector3d &inPos, LLVector3d &outPos, LLVector3 &outNorm)
  216. {
  217. LLVector3d zVec(0.0f, 0.0f, 0.5f);
  218. LLVector3d p0 = inPos + zVec;
  219. LLVector3d p1 = inPos - zVec;
  220. LLViewerObject *obj;
  221. LLWorld::getInstance()->resolveStepHeightGlobal(this, p0, p1, outPos, outNorm, &obj);
  222. if (!obj)
  223. {
  224. mStepOnLand = TRUE;
  225. mStepMaterial = 0;
  226. mStepObjectVelocity.setVec(0.0f, 0.0f, 0.0f);
  227. }
  228. else
  229. {
  230. mStepOnLand = FALSE;
  231. mStepMaterial = obj->getMaterial();
  232. // We want the primitive velocity, not our velocity... (which actually subtracts the
  233. // step object velocity)
  234. LLVector3 angularVelocity = obj->getAngularVelocity();
  235. LLVector3 relativePos = gAgent.getPosAgentFromGlobal(outPos) - obj->getPositionAgent();
  236. LLVector3 linearComponent = angularVelocity % relativePos;
  237. // llinfos << "Linear Component of Rotation Velocity " << linearComponent << llendl;
  238. mStepObjectVelocity = obj->getVelocity() + linearComponent;
  239. }
  240. }
  241. //-----------------------------------------------------------------------------
  242. // getStepSound()
  243. //-----------------------------------------------------------------------------
  244. const LLUUID& LLVOAvatar::getStepSound() const
  245. {
  246. if ( mStepOnLand )
  247. {
  248. return sStepSoundOnLand;
  249. }
  250. return sStepSounds[mStepMaterial];
  251. }
  252. //-----------------------------------------------------------------------------
  253. // processAnimationStateChanges()
  254. //-----------------------------------------------------------------------------
  255. void LLVOAvatar::processAnimationStateChanges()
  256. {
  257. LLMemType mt(LLMemType::MTYPE_AVATAR);
  258. if (gNoRender)
  259. {
  260. return;
  261. }
  262. if ( isAnyAnimationSignaled(AGENT_WALK_ANIMS, NUM_AGENT_WALK_ANIMS) )
  263. {
  264. startMotion(ANIM_AGENT_WALK_ADJUST);
  265. stopMotion(ANIM_AGENT_FLY_ADJUST);
  266. }
  267. else if (mInAir && !mIsSitting)
  268. {
  269. stopMotion(ANIM_AGENT_WALK_ADJUST);
  270. startMotion(ANIM_AGENT_FLY_ADJUST);
  271. }
  272. else
  273. {
  274. stopMotion(ANIM_AGENT_WALK_ADJUST);
  275. stopMotion(ANIM_AGENT_FLY_ADJUST);
  276. }
  277. if ( isAnyAnimationSignaled(AGENT_GUN_AIM_ANIMS, NUM_AGENT_GUN_AIM_ANIMS) )
  278. {
  279. startMotion(ANIM_AGENT_TARGET);
  280. stopMotion(ANIM_AGENT_BODY_NOISE);
  281. }
  282. else
  283. {
  284. stopMotion(ANIM_AGENT_TARGET);
  285. startMotion(ANIM_AGENT_BODY_NOISE);
  286. }
  287. // clear all current animations
  288. AnimIterator anim_it;
  289. for (anim_it = mPlayingAnimations.begin(); anim_it != mPlayingAnimations.end();)
  290. {
  291. AnimIterator found_anim = mSignaledAnimations.find(anim_it->first);
  292. // playing, but not signaled, so stop
  293. if (found_anim == mSignaledAnimations.end())
  294. {
  295. processSingleAnimationStateChange(anim_it->first, FALSE);
  296. mPlayingAnimations.erase(anim_it++);
  297. continue;
  298. }
  299. ++anim_it;
  300. }
  301. // start up all new anims
  302. for (anim_it = mSignaledAnimations.begin(); anim_it != mSignaledAnimations.end();)
  303. {
  304. AnimIterator found_anim = mPlayingAnimations.find(anim_it->first);
  305. // signaled but not playing, or different sequence id, start motion
  306. if (found_anim == mPlayingAnimations.end() || found_anim->second != anim_it->second)
  307. {
  308. if (processSingleAnimationStateChange(anim_it->first, TRUE))
  309. {
  310. mPlayingAnimations[anim_it->first] = anim_it->second;
  311. ++anim_it;
  312. continue;
  313. }
  314. }
  315. ++anim_it;
  316. }
  317. // clear source information for animations which have been stopped
  318. if (isSelf())
  319. {
  320. AnimSourceIterator source_it = mAnimationSources.begin();
  321. for (source_it = mAnimationSources.begin(); source_it != mAnimationSources.end();)
  322. {
  323. if (mSignaledAnimations.find(source_it->second) == mSignaledAnimations.end())
  324. {
  325. mAnimationSources.erase(source_it++);
  326. }
  327. else
  328. {
  329. ++source_it;
  330. }
  331. }
  332. }
  333. stop_glerror();
  334. }
  335. //-----------------------------------------------------------------------------
  336. // processSingleAnimationStateChange();
  337. //-----------------------------------------------------------------------------
  338. BOOL LLVOAvatar::processSingleAnimationStateChange( const LLUUID& anim_id, BOOL start )
  339. {
  340. LLMemType mt(LLMemType::MTYPE_AVATAR);
  341. BOOL result = FALSE;
  342. if ( start ) // start animation
  343. {
  344. if (anim_id == ANIM_AGENT_TYPE)
  345. {
  346. if (gAudiop)
  347. {
  348. LLVector3d char_pos_global = gAgent.getPosGlobalFromAgent(getCharacterPosition());
  349. if (LLViewerParcelMgr::getInstance()->canHearSound(char_pos_global)
  350.     && !LLMuteList::getInstance()->isMuted(getID(), LLMute::flagObjectSounds))
  351. {
  352. // RN: uncomment this to play on typing sound at fixed volume once sound engine is fixed
  353. // to support both spatialized and non-spatialized instances of the same sound
  354. //if (isSelf())
  355. //{
  356. // gAudiop->triggerSound(LLUUID(gSavedSettings.getString("UISndTyping")), 1.0f, LLAudioEngine::AUDIO_TYPE_UI);
  357. //}
  358. //else
  359. {
  360. LLUUID sound_id = LLUUID(gSavedSettings.getString("UISndTyping"));
  361. gAudiop->triggerSound(sound_id, getID(), 1.0f, LLAudioEngine::AUDIO_TYPE_SFX, char_pos_global);
  362. }
  363. }
  364. }
  365. }
  366. else if (anim_id == ANIM_AGENT_SIT_GROUND_CONSTRAINED)
  367. {
  368. sitDown(TRUE);
  369. }
  370. if (startMotion(anim_id))
  371. {
  372. result = TRUE;
  373. }
  374. else
  375. {
  376. llwarns << "Failed to start motion!" << llendl;
  377. }
  378. }
  379. else //stop animation
  380. {
  381. if (anim_id == ANIM_AGENT_SIT_GROUND_CONSTRAINED)
  382. {
  383. sitDown(FALSE);
  384. }
  385. stopMotion(anim_id);
  386. result = TRUE;
  387. }
  388. return result;
  389. }
  390. //-----------------------------------------------------------------------------
  391. // isAnyAnimationSignaled()
  392. //-----------------------------------------------------------------------------
  393. BOOL LLVOAvatar::isAnyAnimationSignaled(const LLUUID *anim_array, const S32 num_anims) const
  394. {
  395. for (S32 i = 0; i < num_anims; i++)
  396. {
  397. if(mSignaledAnimations.find(anim_array[i]) != mSignaledAnimations.end())
  398. {
  399. return TRUE;
  400. }
  401. }
  402. return FALSE;
  403. }
  404. //-----------------------------------------------------------------------------
  405. // resetAnimations()
  406. //-----------------------------------------------------------------------------
  407. void LLVOAvatar::resetAnimations()
  408. {
  409. LLKeyframeMotion::flushKeyframeCache();
  410. flushAllMotions();
  411. }
  412. //-----------------------------------------------------------------------------
  413. // startMotion()
  414. // id is the asset if of the animation to start
  415. // time_offset is the offset into the animation at which to start playing
  416. //-----------------------------------------------------------------------------
  417. BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset)
  418. {
  419. LLMemType mt(LLMemType::MTYPE_AVATAR);
  420. // start special case female walk for female avatars
  421. if (getSex() == SEX_FEMALE)
  422. {
  423. if (id == ANIM_AGENT_WALK)
  424. {
  425. return LLCharacter::startMotion(ANIM_AGENT_FEMALE_WALK, time_offset);
  426. }
  427. else if (id == ANIM_AGENT_SIT)
  428. {
  429. return LLCharacter::startMotion(ANIM_AGENT_SIT_FEMALE, time_offset);
  430. }
  431. }
  432. if (isSelf() && id == ANIM_AGENT_AWAY)
  433. {
  434. gAgent.setAFK();
  435. }
  436. return LLCharacter::startMotion(id, time_offset);
  437. }
  438. //-----------------------------------------------------------------------------
  439. // stopMotion()
  440. //-----------------------------------------------------------------------------
  441. BOOL LLVOAvatar::stopMotion(const LLUUID& id, BOOL stop_immediate)
  442. {
  443. if (isSelf())
  444. {
  445. gAgent.onAnimStop(id);
  446. }
  447. if (id == ANIM_AGENT_WALK)
  448. {
  449. LLCharacter::stopMotion(ANIM_AGENT_FEMALE_WALK, stop_immediate);
  450. }
  451. else if (id == ANIM_AGENT_SIT)
  452. {
  453. LLCharacter::stopMotion(ANIM_AGENT_SIT_FEMALE, stop_immediate);
  454. }
  455. return LLCharacter::stopMotion(id, stop_immediate);
  456. }
  457. //-----------------------------------------------------------------------------
  458. // stopMotionFromSource()
  459. //-----------------------------------------------------------------------------
  460. // virtual
  461. void LLVOAvatar::stopMotionFromSource(const LLUUID& source_id)
  462. {
  463. }
  464. //-----------------------------------------------------------------------------
  465. // getVolumePos()
  466. //-----------------------------------------------------------------------------
  467. LLVector3 LLVOAvatar::getVolumePos(S32 joint_index, LLVector3& volume_offset)
  468. {
  469. if (joint_index > mNumCollisionVolumes)
  470. {
  471. return LLVector3::zero;
  472. }
  473. return mCollisionVolumes[joint_index].getVolumePos(volume_offset);
  474. }
  475. //-----------------------------------------------------------------------------
  476. // findCollisionVolume()
  477. //-----------------------------------------------------------------------------
  478. LLJoint* LLVOAvatar::findCollisionVolume(U32 volume_id)
  479. {
  480. if ((S32)volume_id > mNumCollisionVolumes)
  481. {
  482. return NULL;
  483. }
  484. return &mCollisionVolumes[volume_id];
  485. }
  486. //-----------------------------------------------------------------------------
  487. // findCollisionVolume()
  488. //-----------------------------------------------------------------------------
  489. S32 LLVOAvatar::getCollisionVolumeID(std::string &name)
  490. {
  491. for (S32 i = 0; i < mNumCollisionVolumes; i++)
  492. {
  493. if (mCollisionVolumes[i].getName() == name)
  494. {
  495. return i;
  496. }
  497. }
  498. return -1;
  499. }
  500. //-----------------------------------------------------------------------------
  501. // addDebugText()
  502. //-----------------------------------------------------------------------------
  503. void LLVOAvatar::addDebugText(const std::string& text)
  504. {
  505. mDebugText.append(1, 'n');
  506. mDebugText.append(text);
  507. }
  508. //-----------------------------------------------------------------------------
  509. // getID()
  510. //-----------------------------------------------------------------------------
  511. const LLUUID& LLVOAvatar::getID()
  512. {
  513. return mID;
  514. }
  515. //-----------------------------------------------------------------------------
  516. // getJoint()
  517. //-----------------------------------------------------------------------------
  518. // RN: avatar joints are multi-rooted to include screen-based attachments
  519. LLJoint *LLVOAvatar::getJoint( const std::string &name )
  520. {
  521. LLJoint* jointp = mRoot.findJoint(name);
  522. return jointp;
  523. }
  524. //-----------------------------------------------------------------------------
  525. // getCharacterPosition()
  526. //-----------------------------------------------------------------------------
  527. LLVector3 LLVOAvatar::getCharacterPosition()
  528. {
  529. if (mDrawable.notNull())
  530. {
  531. return mDrawable->getPositionAgent();
  532. }
  533. else
  534. {
  535. return getPositionAgent();
  536. }
  537. }
  538. //-----------------------------------------------------------------------------
  539. // LLVOAvatar::getCharacterRotation()
  540. //-----------------------------------------------------------------------------
  541. LLQuaternion LLVOAvatar::getCharacterRotation()
  542. {
  543. return getRotation();
  544. }
  545. //-----------------------------------------------------------------------------
  546. // LLVOAvatar::getCharacterVelocity()
  547. //-----------------------------------------------------------------------------
  548. LLVector3 LLVOAvatar::getCharacterVelocity()
  549. {
  550. return getVelocity() - mStepObjectVelocity;
  551. }
  552. //-----------------------------------------------------------------------------
  553. // LLVOAvatar::getCharacterAngularVelocity()
  554. //-----------------------------------------------------------------------------
  555. LLVector3 LLVOAvatar::getCharacterAngularVelocity()
  556. {
  557. return getAngularVelocity();
  558. }
  559. //-----------------------------------------------------------------------------
  560. // LLVOAvatar::getGround()
  561. //-----------------------------------------------------------------------------
  562. void LLVOAvatar::getGround(const LLVector3 &in_pos_agent, LLVector3 &out_pos_agent, LLVector3 &outNorm)
  563. {
  564. LLVector3d z_vec(0.0f, 0.0f, 1.0f);
  565. LLVector3d p0_global, p1_global;
  566. if (gNoRender || mIsDummy)
  567. {
  568. outNorm.setVec(z_vec);
  569. out_pos_agent = in_pos_agent;
  570. return;
  571. }
  572. p0_global = gAgent.getPosGlobalFromAgent(in_pos_agent) + z_vec;
  573. p1_global = gAgent.getPosGlobalFromAgent(in_pos_agent) - z_vec;
  574. LLViewerObject *obj;
  575. LLVector3d out_pos_global;
  576. LLWorld::getInstance()->resolveStepHeightGlobal(this, p0_global, p1_global, out_pos_global, outNorm, &obj);
  577. out_pos_agent = gAgent.getPosAgentFromGlobal(out_pos_global);
  578. }
  579. //-----------------------------------------------------------------------------
  580. // LLVOAvatar::getTimeDilation()
  581. //-----------------------------------------------------------------------------
  582. F32 LLVOAvatar::getTimeDilation()
  583. {
  584. return mTimeDilation;
  585. }
  586. //-----------------------------------------------------------------------------
  587. // LLVOAvatar::getPixelArea()
  588. //-----------------------------------------------------------------------------
  589. F32 LLVOAvatar::getPixelArea() const
  590. {
  591. if (mIsDummy)
  592. {
  593. return 100000.f;
  594. }
  595. return mPixelArea;
  596. }
  597. //-----------------------------------------------------------------------------
  598. // LLVOAvatar::getHeadMesh()
  599. //-----------------------------------------------------------------------------
  600. LLPolyMesh* LLVOAvatar::getHeadMesh()
  601. {
  602. return mMeshLOD[MESH_ID_HEAD]->mMeshParts[0]->getMesh();
  603. }
  604. //-----------------------------------------------------------------------------
  605. // LLVOAvatar::getUpperBodyMesh()
  606. //-----------------------------------------------------------------------------
  607. LLPolyMesh* LLVOAvatar::getUpperBodyMesh()
  608. {
  609. return mMeshLOD[MESH_ID_UPPER_BODY]->mMeshParts[0]->getMesh();
  610. }
  611. //-----------------------------------------------------------------------------
  612. // LLVOAvatar::getPosGlobalFromAgent()
  613. //-----------------------------------------------------------------------------
  614. LLVector3d LLVOAvatar::getPosGlobalFromAgent(const LLVector3 &position)
  615. {
  616. return gAgent.getPosGlobalFromAgent(position);
  617. }
  618. //-----------------------------------------------------------------------------
  619. // getPosAgentFromGlobal()
  620. //-----------------------------------------------------------------------------
  621. LLVector3 LLVOAvatar::getPosAgentFromGlobal(const LLVector3d &position)
  622. {
  623. return gAgent.getPosAgentFromGlobal(position);
  624. }
  625. //-----------------------------------------------------------------------------
  626. // allocateCharacterJoints()
  627. //-----------------------------------------------------------------------------
  628. BOOL LLVOAvatar::allocateCharacterJoints( U32 num )
  629. {
  630. deleteAndClearArray(mSkeleton);
  631. mNumJoints = 0;
  632. mSkeleton = new LLViewerJoint[num];
  633. for(S32 joint_num = 0; joint_num < (S32)num; joint_num++)
  634. {
  635. mSkeleton[joint_num].setJointNum(joint_num);
  636. }
  637. if (!mSkeleton)
  638. {
  639. return FALSE;
  640. }
  641. mNumJoints = num;
  642. return TRUE;
  643. }
  644. //-----------------------------------------------------------------------------
  645. // allocateCollisionVolumes()
  646. //-----------------------------------------------------------------------------
  647. BOOL LLVOAvatar::allocateCollisionVolumes( U32 num )
  648. {
  649. deleteAndClearArray(mCollisionVolumes);
  650. mNumCollisionVolumes = 0;
  651. mCollisionVolumes = new LLViewerJointCollisionVolume[num];
  652. if (!mCollisionVolumes)
  653. {
  654. return FALSE;
  655. }
  656. mNumCollisionVolumes = num;
  657. return TRUE;
  658. }
  659. //-----------------------------------------------------------------------------
  660. // getCharacterJoint()
  661. //-----------------------------------------------------------------------------
  662. LLJoint *LLVOAvatar::getCharacterJoint( U32 num )
  663. {
  664. if ((S32)num >= mNumJoints 
  665.     || (S32)num < 0)
  666. {
  667. return NULL;
  668. }
  669. return (LLJoint*)&mSkeleton[num];
  670. }
  671. //-----------------------------------------------------------------------------
  672. // requestStopMotion()
  673. //-----------------------------------------------------------------------------
  674. // virtual
  675. void LLVOAvatar::requestStopMotion( LLMotion* motion )
  676. {
  677. // Only agent avatars should handle the stop motion notifications.
  678. }
  679. //-----------------------------------------------------------------------------
  680. // loadAvatar()
  681. //-----------------------------------------------------------------------------
  682. static LLFastTimer::DeclareTimer FTM_LOAD_AVATAR("Load Avatar");
  683. BOOL LLVOAvatar::loadAvatar()
  684. {
  685. //  LLFastTimer t(FTM_LOAD_AVATAR);
  686. // avatar_skeleton.xml
  687. if( !buildSkeleton(sAvatarSkeletonInfo) )
  688. {
  689. llwarns << "avatar file: buildSkeleton() failed" << llendl;
  690. return FALSE;
  691. }
  692. // avatar_lad.xml : <skeleton>
  693. if( !loadSkeletonNode() )
  694. {
  695. llwarns << "avatar file: loadNodeSkeleton() failed" << llendl;
  696. return FALSE;
  697. }
  698. // avatar_lad.xml : <mesh>
  699. if( !loadMeshNodes() )
  700. {
  701. llwarns << "avatar file: loadNodeMesh() failed" << llendl;
  702. return FALSE;
  703. }
  704. // avatar_lad.xml : <global_color>
  705. if( sAvatarXmlInfo->mTexSkinColorInfo )
  706. {
  707. mTexSkinColor = new LLTexGlobalColor( this );
  708. if( !mTexSkinColor->setInfo( sAvatarXmlInfo->mTexSkinColorInfo ) )
  709. {
  710. llwarns << "avatar file: mTexSkinColor->setInfo() failed" << llendl;
  711. return FALSE;
  712. }
  713. }
  714. else
  715. {
  716. llwarns << "<global_color> name="skin_color" not found" << llendl;
  717. return FALSE;
  718. }
  719. if( sAvatarXmlInfo->mTexHairColorInfo )
  720. {
  721. mTexHairColor = new LLTexGlobalColor( this );
  722. if( !mTexHairColor->setInfo( sAvatarXmlInfo->mTexHairColorInfo ) )
  723. {
  724. llwarns << "avatar file: mTexHairColor->setInfo() failed" << llendl;
  725. return FALSE;
  726. }
  727. }
  728. else
  729. {
  730. llwarns << "<global_color> name="hair_color" not found" << llendl;
  731. return FALSE;
  732. }
  733. if( sAvatarXmlInfo->mTexEyeColorInfo )
  734. {
  735. mTexEyeColor = new LLTexGlobalColor( this );
  736. if( !mTexEyeColor->setInfo( sAvatarXmlInfo->mTexEyeColorInfo ) )
  737. {
  738. llwarns << "avatar file: mTexEyeColor->setInfo() failed" << llendl;
  739. return FALSE;
  740. }
  741. }
  742. else
  743. {
  744. llwarns << "<global_color> name="eye_color" not found" << llendl;
  745. return FALSE;
  746. }
  747. // avatar_lad.xml : <layer_set>
  748. if (sAvatarXmlInfo->mLayerInfoList.empty())
  749. {
  750. llwarns << "avatar file: missing <layer_set> node" << llendl;
  751. return FALSE;
  752. }
  753. if (sAvatarXmlInfo->mMorphMaskInfoList.empty())
  754. {
  755. llwarns << "avatar file: missing <morph_masks> node" << llendl;
  756. return FALSE;
  757. }
  758. // avatar_lad.xml : <morph_masks>
  759. for (LLVOAvatarXmlInfo::morph_info_list_t::iterator iter = sAvatarXmlInfo->mMorphMaskInfoList.begin();
  760.  iter != sAvatarXmlInfo->mMorphMaskInfoList.end();
  761.  ++iter)
  762. {
  763. LLVOAvatarXmlInfo::LLVOAvatarMorphInfo *info = *iter;
  764. EBakedTextureIndex baked = LLVOAvatarDictionary::findBakedByRegionName(info->mRegion); 
  765. if (baked != BAKED_NUM_INDICES)
  766. {
  767. LLPolyMorphTarget *morph_param;
  768. const std::string *name = &info->mName;
  769. morph_param = (LLPolyMorphTarget *)(getVisualParam(name->c_str()));
  770. if (morph_param)
  771. {
  772. BOOL invert = info->mInvert;
  773. addMaskedMorph(baked, morph_param, invert, info->mLayer);
  774. }
  775. }
  776. }
  777. loadLayersets();
  778. // avatar_lad.xml : <driver_parameters>
  779. for (LLVOAvatarXmlInfo::driver_info_list_t::iterator iter = sAvatarXmlInfo->mDriverInfoList.begin();
  780.  iter != sAvatarXmlInfo->mDriverInfoList.end(); 
  781.  ++iter)
  782. {
  783. LLDriverParamInfo *info = *iter;
  784. LLDriverParam* driver_param = new LLDriverParam( this );
  785. if (driver_param->setInfo(info))
  786. {
  787. addVisualParam( driver_param );
  788. LLVisualParam*(LLVOAvatar::*avatar_function)(S32)const = &LLVOAvatar::getVisualParam; 
  789. if( !driver_param->linkDrivenParams(boost::bind(avatar_function,(LLVOAvatar*)this,_1 ), false))
  790. {
  791. llwarns << "could not link driven params for avatar " << this->getFullname() << " id: " << driver_param->getID() << llendl;
  792. continue;
  793. }
  794. }
  795. else
  796. {
  797. delete driver_param;
  798. llwarns << "avatar file: driver_param->parseData() failed" << llendl;
  799. return FALSE;
  800. }
  801. }
  802. // Uncomment to enable avatar_lad.xml debugging. 
  803. /* std::ofstream file;
  804. file.open("avatar_lad.log");
  805. for( LLViewerVisualParam* param = (LLViewerVisualParam*) getFirstVisualParam(); 
  806. param;
  807. param = (LLViewerVisualParam*) getNextVisualParam() )
  808. {
  809. param->getInfo()->toStream(file);
  810. file << std::endl;
  811. }
  812. file.close();*/
  813. return TRUE;
  814. }
  815. //-----------------------------------------------------------------------------
  816. // loadSkeletonNode(): loads <skeleton> node from XML tree
  817. //-----------------------------------------------------------------------------
  818. BOOL LLVOAvatar::loadSkeletonNode ()
  819. {
  820. mRoot.addChild( &mSkeleton[0] );
  821. for (std::vector<LLViewerJoint *>::iterator iter = mMeshLOD.begin();
  822.  iter != mMeshLOD.end(); 
  823.  ++iter)
  824. {
  825. LLViewerJoint *joint = (LLViewerJoint *) *iter;
  826. joint->mUpdateXform = FALSE;
  827. joint->setMeshesToChildren();
  828. }
  829. mRoot.addChild(mMeshLOD[MESH_ID_HEAD]);
  830. mRoot.addChild(mMeshLOD[MESH_ID_EYELASH]);
  831. mRoot.addChild(mMeshLOD[MESH_ID_UPPER_BODY]);
  832. mRoot.addChild(mMeshLOD[MESH_ID_LOWER_BODY]);
  833. mRoot.addChild(mMeshLOD[MESH_ID_SKIRT]);
  834. mRoot.addChild(mMeshLOD[MESH_ID_HEAD]);
  835. LLViewerJoint *skull = (LLViewerJoint*)mRoot.findJoint("mSkull");
  836. if (skull)
  837. {
  838. skull->addChild(mMeshLOD[MESH_ID_HAIR] );
  839. }
  840. LLViewerJoint *eyeL = (LLViewerJoint*)mRoot.findJoint("mEyeLeft");
  841. if (eyeL)
  842. {
  843. eyeL->addChild( mMeshLOD[MESH_ID_EYEBALL_LEFT] );
  844. }
  845. LLViewerJoint *eyeR = (LLViewerJoint*)mRoot.findJoint("mEyeRight");
  846. if (eyeR)
  847. {
  848. eyeR->addChild( mMeshLOD[MESH_ID_EYEBALL_RIGHT] );
  849. }
  850. // SKELETAL DISTORTIONS
  851. {
  852. LLVOAvatarXmlInfo::skeletal_distortion_info_list_t::iterator iter;
  853. for (iter = sAvatarXmlInfo->mSkeletalDistortionInfoList.begin();
  854.  iter != sAvatarXmlInfo->mSkeletalDistortionInfoList.end(); 
  855.  ++iter)
  856. {
  857. LLPolySkeletalDistortionInfo *info = *iter;
  858. LLPolySkeletalDistortion *param = new LLPolySkeletalDistortion(this);
  859. if (!param->setInfo(info))
  860. {
  861. delete param;
  862. return FALSE;
  863. }
  864. else
  865. {
  866. addVisualParam(param);
  867. }
  868. }
  869. }
  870. // ATTACHMENTS
  871. {
  872. LLVOAvatarXmlInfo::attachment_info_list_t::iterator iter;
  873. for (iter = sAvatarXmlInfo->mAttachmentInfoList.begin();
  874.  iter != sAvatarXmlInfo->mAttachmentInfoList.end(); 
  875.  ++iter)
  876. {
  877. LLVOAvatarXmlInfo::LLVOAvatarAttachmentInfo *info = *iter;
  878. if (!isSelf() && info->mJointName == "mScreen")
  879. { //don't process screen joint for other avatars
  880. continue;
  881. }
  882. LLViewerJointAttachment* attachment = new LLViewerJointAttachment();
  883. attachment->setName(info->mName);
  884. LLJoint *parentJoint = getJoint(info->mJointName);
  885. if (!parentJoint)
  886. {
  887. llwarns << "No parent joint by name " << info->mJointName << " found for attachment point " << info->mName << llendl;
  888. delete attachment;
  889. continue;
  890. }
  891. if (info->mHasPosition)
  892. {
  893. attachment->setOriginalPosition(info->mPosition);
  894. }
  895. if (info->mHasRotation)
  896. {
  897. LLQuaternion rotation;
  898. rotation.setQuat(info->mRotationEuler.mV[VX] * DEG_TO_RAD,
  899.  info->mRotationEuler.mV[VY] * DEG_TO_RAD,
  900.  info->mRotationEuler.mV[VZ] * DEG_TO_RAD);
  901. attachment->setRotation(rotation);
  902. }
  903. int group = info->mGroup;
  904. if (group >= 0)
  905. {
  906. if (group < 0 || group >= 9)
  907. {
  908. llwarns << "Invalid group number (" << group << ") for attachment point " << info->mName << llendl;
  909. }
  910. else
  911. {
  912. attachment->setGroup(group);
  913. }
  914. }
  915. S32 attachmentID = info->mAttachmentID;
  916. if (attachmentID < 1 || attachmentID > 255)
  917. {
  918. llwarns << "Attachment point out of range [1-255]: " << attachmentID << " on attachment point " << info->mName << llendl;
  919. delete attachment;
  920. continue;
  921. }
  922. if (mAttachmentPoints.find(attachmentID) != mAttachmentPoints.end())
  923. {
  924. llwarns << "Attachment point redefined with id " << attachmentID << " on attachment point " << info->mName << llendl;
  925. delete attachment;
  926. continue;
  927. }
  928. attachment->setPieSlice(info->mPieMenuSlice);
  929. attachment->setVisibleInFirstPerson(info->mVisibleFirstPerson);
  930. attachment->setIsHUDAttachment(info->mIsHUDAttachment);
  931. mAttachmentPoints[attachmentID] = attachment;
  932. // now add attachment joint
  933. parentJoint->addChild(attachment);
  934. }
  935. }
  936. return TRUE;
  937. }
  938. //-----------------------------------------------------------------------------
  939. // loadMeshNodes(): loads <mesh> nodes from XML tree
  940. //-----------------------------------------------------------------------------
  941. BOOL LLVOAvatar::loadMeshNodes()
  942. {
  943. for (LLVOAvatarXmlInfo::mesh_info_list_t::const_iterator meshinfo_iter = sAvatarXmlInfo->mMeshInfoList.begin();
  944.  meshinfo_iter != sAvatarXmlInfo->mMeshInfoList.end(); 
  945.  ++meshinfo_iter)
  946. {
  947. const LLVOAvatarXmlInfo::LLVOAvatarMeshInfo *info = *meshinfo_iter;
  948. const std::string &type = info->mType;
  949. S32 lod = info->mLOD;
  950. LLViewerJointMesh* mesh = NULL;
  951. U8 mesh_id = 0;
  952. BOOL found_mesh_id = FALSE;
  953. /* if (type == "hairMesh")
  954. switch(lod)
  955.   case 0:
  956. mesh = &mHairMesh0; */
  957. for (LLVOAvatarDictionary::Meshes::const_iterator mesh_iter = LLVOAvatarDictionary::getInstance()->getMeshes().begin();
  958.  mesh_iter != LLVOAvatarDictionary::getInstance()->getMeshes().end();
  959.  ++mesh_iter)
  960. {
  961. const EMeshIndex mesh_index = mesh_iter->first;
  962. const LLVOAvatarDictionary::MeshEntry *mesh_dict = mesh_iter->second;
  963. if (type.compare(mesh_dict->mName) == 0)
  964. {
  965. mesh_id = mesh_index;
  966. found_mesh_id = TRUE;
  967. break;
  968. }
  969. }
  970. if (found_mesh_id)
  971. {
  972. if (lod < (S32)mMeshLOD[mesh_id]->mMeshParts.size())
  973. {
  974. mesh = mMeshLOD[mesh_id]->mMeshParts[lod];
  975. }
  976. else
  977. {
  978. llwarns << "Avatar file: <mesh> has invalid lod setting " << lod << llendl;
  979. return FALSE;
  980. }
  981. }
  982. else 
  983. {
  984. llwarns << "Ignoring unrecognized mesh type: " << type << llendl;
  985. return FALSE;
  986. }
  987. // llinfos << "Parsing mesh data for " << type << "..." << llendl;
  988. // If this isn't set to white (1.0), avatars will *ALWAYS* be darker than their surroundings.
  989. // Do not touch!!!
  990. mesh->setColor( 1.0f, 1.0f, 1.0f, 1.0f );
  991. LLPolyMesh *poly_mesh = NULL;
  992. if (!info->mReferenceMeshName.empty())
  993. {
  994. polymesh_map_t::const_iterator polymesh_iter = mMeshes.find(info->mReferenceMeshName);
  995. if (polymesh_iter != mMeshes.end())
  996. {
  997. poly_mesh = LLPolyMesh::getMesh(info->mMeshFileName, polymesh_iter->second);
  998. poly_mesh->setAvatar(this);
  999. }
  1000. else
  1001. {
  1002. // This should never happen
  1003. LL_WARNS("Avatar") << "Could not find avatar mesh: " << info->mReferenceMeshName << LL_ENDL;
  1004. }
  1005. }
  1006. else
  1007. {
  1008. poly_mesh = LLPolyMesh::getMesh(info->mMeshFileName);
  1009. poly_mesh->setAvatar(this);
  1010. }
  1011. if( !poly_mesh )
  1012. {
  1013. llwarns << "Failed to load mesh of type " << type << llendl;
  1014. return FALSE;
  1015. }
  1016. // Multimap insert
  1017. mMeshes.insert(std::make_pair(info->mMeshFileName, poly_mesh));
  1018. mesh->setMesh( poly_mesh );
  1019. mesh->setLOD( info->mMinPixelArea );
  1020. for (LLVOAvatarXmlInfo::LLVOAvatarMeshInfo::morph_info_list_t::const_iterator xmlinfo_iter = info->mPolyMorphTargetInfoList.begin();
  1021.  xmlinfo_iter != info->mPolyMorphTargetInfoList.end(); 
  1022.  ++xmlinfo_iter)
  1023. {
  1024. const LLVOAvatarXmlInfo::LLVOAvatarMeshInfo::morph_info_pair_t *info_pair = &(*xmlinfo_iter);
  1025. LLPolyMorphTarget *param = new LLPolyMorphTarget(mesh->getMesh());
  1026. if (!param->setInfo(info_pair->first))
  1027. {
  1028. delete param;
  1029. return FALSE;
  1030. }
  1031. else
  1032. {
  1033. if (info_pair->second)
  1034. {
  1035. addSharedVisualParam(param);
  1036. }
  1037. else
  1038. {
  1039. addVisualParam(param);
  1040. }
  1041. }
  1042. }
  1043. }
  1044. return TRUE;
  1045. }
  1046. //-----------------------------------------------------------------------------
  1047. // loadLayerSets()
  1048. //-----------------------------------------------------------------------------
  1049. BOOL LLVOAvatar::loadLayersets()
  1050. {
  1051. BOOL success = TRUE;
  1052. for (LLVOAvatarXmlInfo::layer_info_list_t::const_iterator layerset_iter = sAvatarXmlInfo->mLayerInfoList.begin();
  1053.  layerset_iter != sAvatarXmlInfo->mLayerInfoList.end(); 
  1054.  ++layerset_iter)
  1055. {
  1056. // Construct a layerset for each one specified in avatar_lad.xml and initialize it as such.
  1057. LLTexLayerSetInfo *layerset_info = *layerset_iter;
  1058. layerset_info->createVisualParams(this);
  1059. }
  1060. return success;
  1061. }
  1062. //-----------------------------------------------------------------------------
  1063. // updateVisualParams()
  1064. //-----------------------------------------------------------------------------
  1065. void LLVOAvatar::updateVisualParams()
  1066. {
  1067. if (gNoRender)
  1068. {
  1069. return;
  1070. }
  1071. setSex( (getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE );
  1072. LLCharacter::updateVisualParams();
  1073. if (mLastSkeletonSerialNum != mSkeletonSerialNum)
  1074. {
  1075. computeBodySize();
  1076. mLastSkeletonSerialNum = mSkeletonSerialNum;
  1077. mRoot.updateWorldMatrixChildren();
  1078. }
  1079. dirtyMesh();
  1080. updateHeadOffset();
  1081. }
  1082. //-----------------------------------------------------------------------------
  1083. // isActive()
  1084. //-----------------------------------------------------------------------------
  1085. BOOL LLVOAvatar::isActive() const
  1086. {
  1087. return TRUE;
  1088. }
  1089. //-----------------------------------------------------------------------------
  1090. // setPixelAreaAndAngle()
  1091. //-----------------------------------------------------------------------------
  1092. void LLVOAvatar::setPixelAreaAndAngle(LLAgent &agent)
  1093. {
  1094. LLMemType mt(LLMemType::MTYPE_AVATAR);
  1095. if (mDrawable.isNull())
  1096. {
  1097. return;
  1098. }
  1099. const LLVector3* ext = mDrawable->getSpatialExtents();
  1100. LLVector3 center = (ext[1] + ext[0]) * 0.5f;
  1101. LLVector3 size = (ext[1]-ext[0])*0.5f;
  1102. mImpostorPixelArea = LLPipeline::calcPixelArea(center, size, *LLViewerCamera::getInstance());
  1103. F32 range = mDrawable->mDistanceWRTCamera;
  1104. if (range < 0.001f) // range == zero
  1105. {
  1106. mAppAngle = 180.f;
  1107. }
  1108. else
  1109. {
  1110. F32 radius = size.length();
  1111. mAppAngle = (F32) atan2( radius, range) * RAD_TO_DEG;
  1112. }
  1113. // We always want to look good to ourselves
  1114. if( isSelf() )
  1115. {
  1116. mPixelArea = llmax( mPixelArea, F32(getTexImageSize() / 16) );
  1117. }
  1118. }
  1119. //-----------------------------------------------------------------------------
  1120. // updateJointLODs()
  1121. //-----------------------------------------------------------------------------
  1122. BOOL LLVOAvatar::updateJointLODs()
  1123. {
  1124. const F32 MAX_PIXEL_AREA = 100000000.f;
  1125. F32 lod_factor = (sLODFactor * AVATAR_LOD_TWEAK_RANGE + (1.f - AVATAR_LOD_TWEAK_RANGE));
  1126. F32 avatar_num_min_factor = clamp_rescale(sLODFactor, 0.f, 1.f, 0.25f, 0.6f);
  1127. F32 avatar_num_factor = clamp_rescale((F32)sNumVisibleAvatars, 8, 25, 1.f, avatar_num_min_factor);
  1128. F32 area_scale = 0.16f;
  1129. {
  1130. if (isSelf())
  1131. {
  1132. if(gAgent.cameraCustomizeAvatar() || gAgent.cameraMouselook())
  1133. {
  1134. mAdjustedPixelArea = MAX_PIXEL_AREA;
  1135. }
  1136. else
  1137. {
  1138. mAdjustedPixelArea = mPixelArea*area_scale;
  1139. }
  1140. }
  1141. else if (mIsDummy)
  1142. {
  1143. mAdjustedPixelArea = MAX_PIXEL_AREA;
  1144. }
  1145. else
  1146. {
  1147. // reported avatar pixel area is dependent on avatar render load, based on number of visible avatars
  1148. mAdjustedPixelArea = (F32)mPixelArea * area_scale * lod_factor * lod_factor * avatar_num_factor * avatar_num_factor;
  1149. }
  1150. // now select meshes to render based on adjusted pixel area
  1151. BOOL res = mRoot.updateLOD(mAdjustedPixelArea, TRUE);
  1152.   if (res)
  1153. {
  1154. sNumLODChangesThisFrame++;
  1155. dirtyMesh();
  1156. return TRUE;
  1157. }
  1158. }
  1159. return FALSE;
  1160. }
  1161. //-----------------------------------------------------------------------------
  1162. // createDrawable()
  1163. //-----------------------------------------------------------------------------
  1164. LLDrawable *LLVOAvatar::createDrawable(LLPipeline *pipeline)
  1165. {
  1166. pipeline->allocDrawable(this);
  1167. mDrawable->setLit(FALSE);
  1168. LLDrawPoolAvatar *poolp = (LLDrawPoolAvatar*) gPipeline.getPool(LLDrawPool::POOL_AVATAR);
  1169. // Only a single face (one per avatar)
  1170. //this face will be splitted into several if its vertex buffer is too long.
  1171. mDrawable->setState(LLDrawable::ACTIVE);
  1172. mDrawable->addFace(poolp, NULL);
  1173. mDrawable->setRenderType(LLPipeline::RENDER_TYPE_AVATAR);
  1174. LLFace *facep;
  1175. // Add faces for the foot shadows
  1176. facep = mDrawable->addFace((LLFacePool*) NULL, mShadowImagep);
  1177. mShadow0Facep = facep;
  1178. facep = mDrawable->addFace((LLFacePool*) NULL, mShadowImagep);
  1179. mShadow1Facep = facep;
  1180. mNumInitFaces = mDrawable->getNumFaces() ;
  1181. dirtyMesh();
  1182. return mDrawable;
  1183. }
  1184. void LLVOAvatar::updateGL()
  1185. {
  1186. if (mMeshTexturesDirty)
  1187. {
  1188. updateMeshTextures();
  1189. mMeshTexturesDirty = FALSE;
  1190. }
  1191. }
  1192. //-----------------------------------------------------------------------------
  1193. // updateGeometry()
  1194. //-----------------------------------------------------------------------------
  1195. static LLFastTimer::DeclareTimer FTM_UPDATE_AVATAR("Update Avatar");
  1196. BOOL LLVOAvatar::updateGeometry(LLDrawable *drawable)
  1197. {
  1198. LLFastTimer ftm(FTM_UPDATE_AVATAR);
  1199.   if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR)))
  1200. {
  1201. return TRUE;
  1202. }
  1203. if (!mMeshValid)
  1204. {
  1205. return TRUE;
  1206. }
  1207. if (!drawable)
  1208. {
  1209. llerrs << "LLVOAvatar::updateGeometry() called with NULL drawable" << llendl;
  1210. }
  1211. return TRUE;
  1212. }
  1213. //-----------------------------------------------------------------------------
  1214. // updateShadowFaces()
  1215. //-----------------------------------------------------------------------------
  1216. void LLVOAvatar::updateShadowFaces()
  1217. {
  1218. LLFace *face0p = mShadow0Facep;
  1219. LLFace *face1p = mShadow1Facep;
  1220. //
  1221. // render avatar shadows
  1222. //
  1223. if (mInAir || mUpdatePeriod >= IMPOSTOR_PERIOD)
  1224. {
  1225. face0p->setSize(0, 0);
  1226. face1p->setSize(0, 0);
  1227. return;
  1228. }
  1229. LLSprite sprite(mShadowImagep.notNull() ? mShadowImagep->getID() : LLUUID::null);
  1230. sprite.setFollow(FALSE);
  1231. const F32 cos_angle = gSky.getSunDirection().mV[2];
  1232. F32 cos_elev = sqrt(1 - cos_angle * cos_angle);
  1233. if (cos_angle < 0) cos_elev = -cos_elev;
  1234. sprite.setSize(0.4f + cos_elev * 0.8f, 0.3f);
  1235. LLVector3 sun_vec = gSky.mVOSkyp ? gSky.mVOSkyp->getToSun() : LLVector3(0.f, 0.f, 0.f);
  1236. if (mShadowImagep->hasGLTexture())
  1237. {
  1238. LLVector3 normal;
  1239. LLVector3d shadow_pos;
  1240. LLVector3 shadow_pos_agent;
  1241. F32 foot_height;
  1242. if (mFootLeftp)
  1243. {
  1244. LLVector3 joint_world_pos = mFootLeftp->getWorldPosition();
  1245. // this only does a ray straight down from the foot, as our client-side ray-tracing is very limited now
  1246. // but we make an explicit ray trace call in expectation of future improvements
  1247. resolveRayCollisionAgent(gAgent.getPosGlobalFromAgent(joint_world_pos), 
  1248.  gAgent.getPosGlobalFromAgent(gSky.getSunDirection() + joint_world_pos), shadow_pos, normal);
  1249. shadow_pos_agent = gAgent.getPosAgentFromGlobal(shadow_pos);
  1250. foot_height = joint_world_pos.mV[VZ] - shadow_pos_agent.mV[VZ];
  1251. // Pull sprite in direction of surface normal
  1252. shadow_pos_agent += normal * SHADOW_OFFSET_AMT;
  1253. // Render sprite
  1254. sprite.setNormal(normal);
  1255. if (isSelf() && gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
  1256. {
  1257. sprite.setColor(0.f, 0.f, 0.f, 0.f);
  1258. }
  1259. else
  1260. {
  1261. sprite.setColor(0.f, 0.f, 0.f, clamp_rescale(foot_height, MIN_SHADOW_HEIGHT, MAX_SHADOW_HEIGHT, 0.5f, 0.f));
  1262. }
  1263. sprite.setPosition(shadow_pos_agent);
  1264. LLVector3 foot_to_knee = mKneeLeftp->getWorldPosition() - joint_world_pos;
  1265. //foot_to_knee.normalize();
  1266. foot_to_knee -= projected_vec(foot_to_knee, sun_vec);
  1267. sprite.setYaw(azimuth(sun_vec - foot_to_knee));
  1268. sprite.updateFace(*face0p);
  1269. }
  1270. if (mFootRightp)
  1271. {
  1272. LLVector3 joint_world_pos = mFootRightp->getWorldPosition();
  1273. // this only does a ray straight down from the foot, as our client-side ray-tracing is very limited now
  1274. // but we make an explicit ray trace call in expectation of future improvements
  1275. resolveRayCollisionAgent(gAgent.getPosGlobalFromAgent(joint_world_pos), 
  1276.  gAgent.getPosGlobalFromAgent(gSky.getSunDirection() + joint_world_pos), shadow_pos, normal);
  1277. shadow_pos_agent = gAgent.getPosAgentFromGlobal(shadow_pos);
  1278. foot_height = joint_world_pos.mV[VZ] - shadow_pos_agent.mV[VZ];
  1279. // Pull sprite in direction of surface normal
  1280. shadow_pos_agent += normal * SHADOW_OFFSET_AMT;
  1281. // Render sprite
  1282. sprite.setNormal(normal);
  1283. if (isSelf() && gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
  1284. {
  1285. sprite.setColor(0.f, 0.f, 0.f, 0.f);
  1286. }
  1287. else
  1288. {
  1289. sprite.setColor(0.f, 0.f, 0.f, clamp_rescale(foot_height, MIN_SHADOW_HEIGHT, MAX_SHADOW_HEIGHT, 0.5f, 0.f));
  1290. }
  1291. sprite.setPosition(shadow_pos_agent);
  1292. LLVector3 foot_to_knee = mKneeRightp->getWorldPosition() - joint_world_pos;
  1293. //foot_to_knee.normalize();
  1294. foot_to_knee -= projected_vec(foot_to_knee, sun_vec);
  1295. sprite.setYaw(azimuth(sun_vec - foot_to_knee));
  1296. sprite.updateFace(*face1p);
  1297. }
  1298. }
  1299. }
  1300. //-----------------------------------------------------------------------------
  1301. // updateSexDependentLayerSets()
  1302. //-----------------------------------------------------------------------------
  1303. void LLVOAvatar::updateSexDependentLayerSets( BOOL upload_bake )
  1304. {
  1305. invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake );
  1306. invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, upload_bake );
  1307. invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, upload_bake );
  1308. }
  1309. //-----------------------------------------------------------------------------
  1310. // dirtyMesh()
  1311. //-----------------------------------------------------------------------------
  1312. void LLVOAvatar::dirtyMesh()
  1313. {
  1314. mDirtyMesh = TRUE;
  1315. }
  1316. //-----------------------------------------------------------------------------
  1317. // hideSkirt()
  1318. //-----------------------------------------------------------------------------
  1319. void LLVOAvatar::hideSkirt()
  1320. {
  1321. mMeshLOD[MESH_ID_SKIRT]->setVisible(FALSE, TRUE);
  1322. }
  1323. BOOL LLVOAvatar::setParent(LLViewerObject* parent)
  1324. {
  1325. BOOL ret ;
  1326. if (parent == NULL)
  1327. {
  1328. getOffObject();
  1329. ret = LLViewerObject::setParent(parent);
  1330. if (isSelf())
  1331. {
  1332. gAgent.resetCamera();
  1333. }
  1334. }
  1335. else
  1336. {
  1337. ret = LLViewerObject::setParent(parent);
  1338. if(ret)
  1339. {
  1340. sitOnObject(parent);
  1341. }
  1342. }
  1343. return ret ;
  1344. }
  1345. void LLVOAvatar::addChild(LLViewerObject *childp)
  1346. {
  1347. LLViewerObject::addChild(childp);
  1348. if (childp->mDrawable)
  1349. {
  1350. attachObject(childp);
  1351. }
  1352. else
  1353. {
  1354. mPendingAttachment.push_back(childp);
  1355. }
  1356. }
  1357. void LLVOAvatar::removeChild(LLViewerObject *childp)
  1358. {
  1359. LLViewerObject::removeChild(childp);
  1360. if (!detachObject(childp))
  1361. {
  1362. llwarns << "Calling detach on non-attached object " << llendl;
  1363. }
  1364. }
  1365. LLViewerJointAttachment* LLVOAvatar::getTargetAttachmentPoint(LLViewerObject* viewer_object)
  1366. {
  1367. S32 attachmentID = ATTACHMENT_ID_FROM_STATE(viewer_object->getState());
  1368. LLViewerJointAttachment* attachment = get_if_there(mAttachmentPoints, attachmentID, (LLViewerJointAttachment*)NULL);
  1369. if (!attachment)
  1370. {
  1371. llwarns << "Object attachment point invalid: " << attachmentID << llendl;
  1372. }
  1373. return attachment;
  1374. }
  1375. //-----------------------------------------------------------------------------
  1376. // attachObject()
  1377. //-----------------------------------------------------------------------------
  1378. const LLViewerJointAttachment *LLVOAvatar::attachObject(LLViewerObject *viewer_object)
  1379. {
  1380. LLViewerJointAttachment* attachment = getTargetAttachmentPoint(viewer_object);
  1381. if (!attachment || !attachment->addObject(viewer_object))
  1382. {
  1383. return 0;
  1384. }
  1385. if (viewer_object->isSelected())
  1386. {
  1387. LLSelectMgr::getInstance()->updateSelectionCenter();
  1388. LLSelectMgr::getInstance()->updatePointAt();
  1389. }
  1390. return attachment;
  1391. }
  1392. //-----------------------------------------------------------------------------
  1393. // attachObject()
  1394. //-----------------------------------------------------------------------------
  1395. U32 LLVOAvatar::getNumAttachments() const
  1396. {
  1397. U32 num_attachments = 0;
  1398. for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
  1399.  iter != mAttachmentPoints.end();
  1400.  ++iter)
  1401. {
  1402. const LLViewerJointAttachment *attachment_pt = (*iter).second;
  1403. num_attachments += attachment_pt->getNumObjects();
  1404. }
  1405. return num_attachments;
  1406. }
  1407. //-----------------------------------------------------------------------------
  1408. // canAttachMoreObjects()
  1409. //-----------------------------------------------------------------------------
  1410. BOOL LLVOAvatar::canAttachMoreObjects() const
  1411. {
  1412. return (getNumAttachments() < MAX_AGENT_ATTACHMENTS);
  1413. }
  1414. //-----------------------------------------------------------------------------
  1415. // lazyAttach()
  1416. //-----------------------------------------------------------------------------
  1417. void LLVOAvatar::lazyAttach()
  1418. {
  1419. std::vector<LLPointer<LLViewerObject> > still_pending;
  1420. for (U32 i = 0; i < mPendingAttachment.size(); i++)
  1421. {
  1422. if (mPendingAttachment[i]->mDrawable)
  1423. {
  1424. attachObject(mPendingAttachment[i]);
  1425. }
  1426. else
  1427. {
  1428. still_pending.push_back(mPendingAttachment[i]);
  1429. }
  1430. }
  1431. mPendingAttachment = still_pending;
  1432. }
  1433. void LLVOAvatar::resetHUDAttachments()
  1434. {
  1435. for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
  1436.  iter != mAttachmentPoints.end();
  1437.  ++iter)
  1438. {
  1439. LLViewerJointAttachment* attachment = iter->second;
  1440. if (attachment->getIsHUDAttachment())
  1441. {
  1442. for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
  1443.  attachment_iter != attachment->mAttachedObjects.end();
  1444.  ++attachment_iter)
  1445. {
  1446. const LLViewerObject* attached_object = (*attachment_iter);
  1447. if (attached_object && attached_object->mDrawable.notNull())
  1448. {
  1449. gPipeline.markMoved(attached_object->mDrawable);
  1450. }
  1451. }
  1452. }
  1453. }
  1454. }
  1455. //-----------------------------------------------------------------------------
  1456. // detachObject()
  1457. //-----------------------------------------------------------------------------
  1458. BOOL LLVOAvatar::detachObject(LLViewerObject *viewer_object)
  1459. {
  1460. for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
  1461.  iter != mAttachmentPoints.end();
  1462.  ++iter)
  1463. {
  1464. LLViewerJointAttachment* attachment = iter->second;
  1465. if (attachment->isObjectAttached(viewer_object))
  1466. {
  1467. attachment->removeObject(viewer_object);
  1468. lldebugs << "Detaching object " << viewer_object->mID << " from " << attachment->getName() << llendl;
  1469. return TRUE;
  1470. }
  1471. }
  1472. return FALSE;
  1473. }
  1474. //-----------------------------------------------------------------------------
  1475. // sitDown()
  1476. //-----------------------------------------------------------------------------
  1477. void LLVOAvatar::sitDown(BOOL bSitting)
  1478. {
  1479. mIsSitting = bSitting;
  1480. if (isSelf())
  1481. {
  1482. // Update Movement Controls according to own Sitting mode
  1483. LLFloaterMove::setSittingMode(bSitting);
  1484. }
  1485. }
  1486. //-----------------------------------------------------------------------------
  1487. // sitOnObject()
  1488. //-----------------------------------------------------------------------------
  1489. void LLVOAvatar::sitOnObject(LLViewerObject *sit_object)
  1490. {
  1491. if (isSelf())
  1492. {
  1493. // Might be first sit
  1494. //LLFirstUse::useSit();
  1495. gAgent.setFlying(FALSE);
  1496. gAgent.setThirdPersonHeadOffset(LLVector3::zero);
  1497. //interpolate to new camera position
  1498. gAgent.startCameraAnimation();
  1499. // make sure we are not trying to autopilot
  1500. gAgent.stopAutoPilot();
  1501. gAgent.setupSitCamera();
  1502. if (gAgent.getForceMouselook())
  1503. {
  1504. gAgent.changeCameraToMouselook();
  1505. }
  1506. }
  1507. if (mDrawable.isNull())
  1508. {
  1509. return;
  1510. }
  1511. LLQuaternion inv_obj_rot = ~sit_object->getRenderRotation();
  1512. LLVector3 obj_pos = sit_object->getRenderPosition();
  1513. LLVector3 rel_pos = getRenderPosition() - obj_pos;
  1514. rel_pos.rotVec(inv_obj_rot);
  1515. mDrawable->mXform.setPosition(rel_pos);
  1516. mDrawable->mXform.setRotation(mDrawable->getWorldRotation() * inv_obj_rot);
  1517. gPipeline.markMoved(mDrawable, TRUE);
  1518. sitDown(TRUE);
  1519. mRoot.getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject
  1520. mRoot.setPosition(getPosition());
  1521. mRoot.updateWorldMatrixChildren();
  1522. stopMotion(ANIM_AGENT_BODY_NOISE);
  1523. }
  1524. //-----------------------------------------------------------------------------
  1525. // getOffObject()
  1526. //-----------------------------------------------------------------------------
  1527. void LLVOAvatar::getOffObject()
  1528. {
  1529. if (mDrawable.isNull())
  1530. {
  1531. return;
  1532. }
  1533. LLViewerObject* sit_object = (LLViewerObject*)getParent();
  1534. if (sit_object) 
  1535. {
  1536. stopMotionFromSource(sit_object->getID());
  1537. LLFollowCamMgr::setCameraActive(sit_object->getID(), FALSE);
  1538. LLViewerObject::const_child_list_t& child_list = sit_object->getChildren();
  1539. for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
  1540.  iter != child_list.end(); ++iter)
  1541. {
  1542. LLViewerObject* child_objectp = *iter;
  1543. stopMotionFromSource(child_objectp->getID());
  1544. LLFollowCamMgr::setCameraActive(child_objectp->getID(), FALSE);
  1545. }
  1546. }
  1547. // assumes that transform will not be updated with drawable still having a parent
  1548. LLVector3 cur_position_world = mDrawable->getWorldPosition();
  1549. LLQuaternion cur_rotation_world = mDrawable->getWorldRotation();
  1550. // set *local* position based on last *world* position, since we're unparenting the avatar
  1551. mDrawable->mXform.setPosition(cur_position_world);
  1552. mDrawable->mXform.setRotation(cur_rotation_world);
  1553. gPipeline.markMoved(mDrawable, TRUE);
  1554. sitDown(FALSE);
  1555. mRoot.getXform()->setParent(NULL); // LLVOAvatar::getOffObject
  1556. mRoot.setPosition(cur_position_world);
  1557. mRoot.setRotation(cur_rotation_world);
  1558. mRoot.getXform()->update();
  1559. startMotion(ANIM_AGENT_BODY_NOISE);
  1560. if (isSelf())
  1561. {
  1562. LLQuaternion av_rot = gAgent.getFrameAgent().getQuaternion();
  1563. LLQuaternion obj_rot = sit_object ? sit_object->getRenderRotation() : LLQuaternion::DEFAULT;
  1564. av_rot = av_rot * obj_rot;
  1565. LLVector3 at_axis = LLVector3::x_axis;
  1566. at_axis = at_axis * av_rot;
  1567. at_axis.mV[VZ] = 0.f;
  1568. at_axis.normalize();
  1569. gAgent.resetAxes(at_axis);
  1570. //reset orientation
  1571. // mRoot.setRotation(avWorldRot);
  1572. gAgent.setThirdPersonHeadOffset(LLVector3(0.f, 0.f, 1.f));
  1573. gAgent.setSitCamera(LLUUID::null);
  1574. }
  1575. }
  1576. //-----------------------------------------------------------------------------
  1577. // findAvatarFromAttachment()
  1578. //-----------------------------------------------------------------------------
  1579. // static 
  1580. LLVOAvatar* LLVOAvatar::findAvatarFromAttachment( LLViewerObject* obj )
  1581. {
  1582. if( obj->isAttachment() )
  1583. {
  1584. do
  1585. {
  1586. obj = (LLViewerObject*) obj->getParent();
  1587. }
  1588. while( obj && !obj->isAvatar() );
  1589. if( obj && !obj->isDead() )
  1590. {
  1591. return (LLVOAvatar*)obj;
  1592. }
  1593. }
  1594. return NULL;
  1595. }
  1596. // warning: order(N) not order(1)
  1597. S32 LLVOAvatar::getAttachmentCount()
  1598. {
  1599. S32 count = mAttachmentPoints.size();
  1600. return count;
  1601. }
  1602. LLColor4 LLVOAvatar::getGlobalColor( const std::string& color_name ) const
  1603. {
  1604. if (color_name=="skin_color" && mTexSkinColor)
  1605. {
  1606. return mTexSkinColor->getColor();
  1607. }
  1608. else if(color_name=="hair_color" && mTexHairColor)
  1609. {
  1610. return mTexHairColor->getColor();
  1611. }
  1612. if(color_name=="eye_color" && mTexEyeColor)
  1613. {
  1614. return mTexEyeColor->getColor();
  1615. }
  1616. else
  1617. {
  1618. // return LLColor4( .5f, .5f, .5f, .5f );
  1619. return LLColor4( 0.f, 1.f, 1.f, 1.f ); // good debugging color
  1620. }
  1621. }
  1622. // virtual
  1623. void LLVOAvatar::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result )
  1624. {
  1625. }
  1626. void LLVOAvatar::invalidateAll()
  1627. {
  1628. }
  1629. // virtual
  1630. void LLVOAvatar::setCompositeUpdatesEnabled( BOOL b )
  1631. {
  1632. }
  1633. void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake )
  1634. {
  1635. if (global_color == mTexSkinColor)
  1636. {
  1637. invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake );
  1638. invalidateComposite( mBakedTextureDatas[BAKED_UPPER].mTexLayerSet, upload_bake );
  1639. invalidateComposite( mBakedTextureDatas[BAKED_LOWER].mTexLayerSet, upload_bake );
  1640. }
  1641. else if (global_color == mTexHairColor)
  1642. {
  1643. invalidateComposite( mBakedTextureDatas[BAKED_HEAD].mTexLayerSet, upload_bake );
  1644. invalidateComposite( mBakedTextureDatas[BAKED_HAIR].mTexLayerSet, upload_bake );
  1645. // ! BACKWARDS COMPATIBILITY !
  1646. // Fix for dealing with avatars from viewers that don't bake hair.
  1647. if (!isTextureDefined(mBakedTextureDatas[BAKED_HAIR].mTextureIndex))
  1648. {
  1649. LLColor4 color = mTexHairColor->getColor();
  1650. for (U32 i = 0; i < mBakedTextureDatas[BAKED_HAIR].mMeshes.size(); i++)
  1651. {
  1652. mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
  1653. }
  1654. }
  1655. else if (global_color == mTexEyeColor)
  1656. {
  1657. // llinfos << "invalidateComposite cause: onGlobalColorChanged( eyecolor )" << llendl; 
  1658. invalidateComposite( mBakedTextureDatas[BAKED_EYES].mTexLayerSet,  upload_bake );
  1659. }
  1660. updateMeshTextures();
  1661. }
  1662. BOOL LLVOAvatar::isVisible() const
  1663. {
  1664. return mDrawable.notNull()
  1665. && (mDrawable->isVisible() || mIsDummy);
  1666. }
  1667. // call periodically to keep isFullyLoaded up to date.
  1668. // returns true if the value has changed.
  1669. BOOL LLVOAvatar::updateIsFullyLoaded()
  1670. {
  1671.     // a "heuristic" to determine if we have enough avatar data to render
  1672.     // (to avoid rendering a "Ruth" - DEV-3168)
  1673. BOOL loading = FALSE;
  1674. // do we have a shape?
  1675. if (visualParamWeightsAreDefault())
  1676. {
  1677. loading = TRUE;
  1678. }
  1679. if (!isTextureDefined(TEX_LOWER_BAKED) || 
  1680. !isTextureDefined(TEX_UPPER_BAKED) || 
  1681. !isTextureDefined(TEX_HEAD_BAKED))
  1682. {
  1683. loading = TRUE;
  1684. }
  1685. updateRuthTimer(loading);
  1686. return processFullyLoadedChange(loading);
  1687. }
  1688. void LLVOAvatar::updateRuthTimer(bool loading)
  1689. {
  1690. if (isSelf() || !loading) 
  1691. {
  1692. return;
  1693. }
  1694. if (mPreviousFullyLoaded)
  1695. {
  1696. mRuthTimer.reset();
  1697. }
  1698. const F32 LOADING_TIMEOUT = 120.f;
  1699. if (mRuthTimer.getElapsedTimeF32() > LOADING_TIMEOUT)
  1700. {
  1701. /*
  1702. llinfos << "Ruth Timer timeout: Missing texture data for '" << getFullname() << "' "
  1703. << "( Params loaded : " << !visualParamWeightsAreDefault() << " ) "
  1704. << "( Lower : " << isTextureDefined(TEX_LOWER_BAKED) << " ) "
  1705. << "( Upper : " << isTextureDefined(TEX_UPPER_BAKED) << " ) "
  1706. << "( Head : " << isTextureDefined(TEX_HEAD_BAKED) << " )."
  1707. << llendl;
  1708. */
  1709. LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID());
  1710. mRuthTimer.reset();
  1711. }
  1712. }
  1713. BOOL LLVOAvatar::processFullyLoadedChange(bool loading)
  1714. {
  1715. // we wait a little bit before giving the all clear,
  1716. // to let textures settle down
  1717. const F32 PAUSE = 1.f;
  1718. if (loading)
  1719. mFullyLoadedTimer.reset();
  1720. mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > PAUSE);
  1721. // did our loading state "change" from last call?
  1722. const S32 UPDATE_RATE = 30;
  1723. BOOL changed =
  1724. ((mFullyLoaded != mPreviousFullyLoaded) ||         // if the value is different from the previous call
  1725.  (!mFullyLoadedInitialized) ||                     // if we've never been called before
  1726.  (mFullyLoadedFrameCounter % UPDATE_RATE == 0));   // every now and then issue a change
  1727. mPreviousFullyLoaded = mFullyLoaded;
  1728. mFullyLoadedInitialized = TRUE;
  1729. mFullyLoadedFrameCounter++;
  1730. return changed;
  1731. }
  1732. BOOL LLVOAvatar::isFullyLoaded() const
  1733. {
  1734. if (gSavedSettings.getBOOL("RenderUnloadedAvatar"))
  1735. return TRUE;
  1736. else
  1737. return mFullyLoaded;
  1738. }
  1739. //-----------------------------------------------------------------------------
  1740. // findMotion()
  1741. //-----------------------------------------------------------------------------
  1742. LLMotion* LLVOAvatar::findMotion(const LLUUID& id) const
  1743. {
  1744. return mMotionController.findMotion(id);
  1745. }
  1746. //-----------------------------------------------------------------------------
  1747. // updateMeshTextures()
  1748. // Uses the current TE values to set the meshes' and layersets' textures.
  1749. //-----------------------------------------------------------------------------
  1750. void LLVOAvatar::updateMeshTextures()
  1751. {
  1752.     // llinfos << "updateMeshTextures" << llendl;
  1753. if (gNoRender) return;
  1754. // if user has never specified a texture, assign the default
  1755. for (U32 i=0; i < getNumTEs(); i++)
  1756. {
  1757. const LLViewerTexture* te_image = getImage(i, 0);
  1758. if(!te_image || te_image->getID().isNull() || (te_image->getID() == IMG_DEFAULT))
  1759. {
  1760. setImage(i, LLViewerTextureManager::getFetchedTexture(i == TEX_HAIR ? IMG_DEFAULT : IMG_DEFAULT_AVATAR), 0); // IMG_DEFAULT_AVATAR = a special texture that's never rendered.
  1761. }
  1762. }
  1763. const BOOL self_customizing = isSelf() && gAgent.cameraCustomizeAvatar(); // During face edit mode, we don't use baked textures
  1764. const BOOL other_culled = !isSelf() && mCulled;
  1765. std::vector<BOOL> is_layer_baked;
  1766. is_layer_baked.resize(mBakedTextureDatas.size(), false);
  1767. std::vector<BOOL> use_lkg_baked_layer; // lkg = "last known good"
  1768. use_lkg_baked_layer.resize(mBakedTextureDatas.size(), false);
  1769. for (U32 i=0; i < mBakedTextureDatas.size(); i++)
  1770. {
  1771. is_layer_baked[i] = isTextureDefined(mBakedTextureDatas[i].mTextureIndex);
  1772. if (!other_culled)
  1773. {
  1774. // When an avatar is changing clothes and not in Appearance mode,
  1775. // use the last-known good baked texture until it finish the first
  1776. // render of the new layerset.
  1777. use_lkg_baked_layer[i] = (!is_layer_baked[i] 
  1778.   && (mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR) 
  1779.   && mBakedTextureDatas[i].mTexLayerSet 
  1780.   && !mBakedTextureDatas[i].mTexLayerSet->getComposite()->isInitialized());
  1781. if (use_lkg_baked_layer[i])
  1782. {
  1783. mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(TRUE);
  1784. }
  1785. }
  1786. else
  1787. {
  1788. use_lkg_baked_layer[i] = (!is_layer_baked[i] 
  1789.   && mBakedTextureDatas[i].mLastTextureIndex != IMG_DEFAULT_AVATAR);
  1790. if (mBakedTextureDatas[i].mTexLayerSet)
  1791. {
  1792. mBakedTextureDatas[i].mTexLayerSet->destroyComposite();
  1793. }
  1794. }
  1795. }
  1796. // Turn on alpha masking correctly for yourself and other avatars on 1.23+
  1797. mSupportsAlphaLayers = isSelf() || is_layer_baked[BAKED_HAIR];
  1798. // Baked textures should be requested from the sim this avatar is on. JC
  1799. const LLHost target_host = getObjectHost();
  1800. if (!target_host.isOk())
  1801. {
  1802. llwarns << "updateMeshTextures: invalid host for object: " << getID() << llendl;
  1803. }
  1804. for (U32 i=0; i < mBakedTextureDatas.size(); i++)
  1805. {
  1806. if (use_lkg_baked_layer[i] && !self_customizing )
  1807. {
  1808. LLViewerFetchedTexture* baked_img = LLViewerTextureManager::getFetchedTextureFromHost( mBakedTextureDatas[i].mLastTextureIndex, target_host );
  1809. mBakedTextureDatas[i].mIsUsed = TRUE;
  1810. for (U32 k=0; k < mBakedTextureDatas[i].mMeshes.size(); k++)
  1811. {
  1812. mBakedTextureDatas[i].mMeshes[k]->setTexture( baked_img );
  1813. }
  1814. }
  1815. else if (!self_customizing && is_layer_baked[i])
  1816. {
  1817. LLViewerFetchedTexture* baked_img = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ;
  1818. if( baked_img->getID() == mBakedTextureDatas[i].mLastTextureIndex )
  1819. {
  1820. // Even though the file may not be finished loading, we'll consider it loaded and use it (rather than doing compositing).
  1821. useBakedTexture( baked_img->getID() );
  1822. }
  1823. else
  1824. {
  1825. mBakedTextureDatas[i].mIsLoaded = FALSE;
  1826. if ( (baked_img->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) )
  1827. {
  1828. baked_img->setLoadedCallback(onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ));
  1829. }
  1830. baked_img->setLoadedCallback(onBakedTextureLoaded, SWITCH_TO_BAKED_DISCARD, FALSE, FALSE, new LLUUID( mID ) );
  1831. }
  1832. }
  1833. else if (mBakedTextureDatas[i].mTexLayerSet 
  1834.  && !other_culled) 
  1835. {
  1836. mBakedTextureDatas[i].mTexLayerSet->createComposite();
  1837. mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled( TRUE );
  1838. mBakedTextureDatas[i].mIsUsed = FALSE;
  1839. for (U32 k=0; k < mBakedTextureDatas[i].mMeshes.size(); k++)
  1840. {
  1841. mBakedTextureDatas[i].mMeshes[k]->setLayerSet( mBakedTextureDatas[i].mTexLayerSet );
  1842. }
  1843. }
  1844. }
  1845. // set texture and color of hair manually if we are not using a baked image.
  1846. // This can happen while loading hair for yourself, or for clients that did not
  1847. // bake a hair texture. Still needed for yourself after 1.22 is depricated.
  1848. if (!is_layer_baked[BAKED_HAIR] || self_customizing)
  1849. {
  1850. const LLColor4 color = mTexHairColor ? mTexHairColor->getColor() : LLColor4(1,1,1,1);
  1851. LLViewerTexture* hair_img = getImage( TEX_HAIR, 0 );
  1852. for (U32 i = 0; i < mBakedTextureDatas[BAKED_HAIR].mMeshes.size(); i++)
  1853. {
  1854. mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setColor( color.mV[VX], color.mV[VY], color.mV[VZ], color.mV[VW] );
  1855. mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setTexture( hair_img );
  1856. }
  1857. for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
  1858.  baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
  1859.  ++baked_iter)
  1860. {
  1861. const EBakedTextureIndex baked_index = baked_iter->first;
  1862. const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second;
  1863. for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();
  1864.  local_tex_iter != baked_dict->mLocalTextures.end();
  1865.  ++local_tex_iter)
  1866. {
  1867. const ETextureIndex texture_index = *local_tex_iter;
  1868. const BOOL is_baked_ready = (is_layer_baked[baked_index] && mBakedTextureDatas[baked_index].mIsLoaded) || other_culled;
  1869. if (isSelf())
  1870. {
  1871. setBakedReady(texture_index, is_baked_ready);
  1872. }
  1873. }
  1874. }
  1875. removeMissingBakedTextures();
  1876. }
  1877. // virtual
  1878. //-----------------------------------------------------------------------------
  1879. // setLocalTexture()
  1880. //-----------------------------------------------------------------------------
  1881. void LLVOAvatar::setLocalTexture( ETextureIndex type, LLViewerTexture* in_tex, BOOL baked_version_ready, U32 index )
  1882. {
  1883. // invalid for anyone but self
  1884. llassert(0);
  1885. }
  1886. //virtual 
  1887. void LLVOAvatar::setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index)
  1888. {
  1889. // invalid for anyone but self
  1890. llassert(0);
  1891. }
  1892. void LLVOAvatar::addChat(const LLChat& chat)
  1893. {
  1894. std::deque<LLChat>::iterator chat_iter;
  1895. mChats.push_back(chat);
  1896. S32 chat_length = 0;
  1897. for( chat_iter = mChats.begin(); chat_iter != mChats.end(); ++chat_iter)
  1898. {
  1899. chat_length += chat_iter->mText.size();
  1900. }
  1901. // remove any excess chat
  1902. chat_iter = mChats.begin();
  1903. while ((chat_length > MAX_BUBBLE_CHAT_LENGTH || mChats.size() > MAX_BUBBLE_CHAT_UTTERANCES) && chat_iter != mChats.end())
  1904. {
  1905. chat_length -= chat_iter->mText.size();
  1906. mChats.pop_front();
  1907. chat_iter = mChats.begin();
  1908. }
  1909. mChatTimer.reset();
  1910. }
  1911. void LLVOAvatar::clearChat()
  1912. {
  1913. mChats.clear();
  1914. }
  1915. // adds a morph mask to the appropriate baked texture structure
  1916. void LLVOAvatar::addMaskedMorph(EBakedTextureIndex index, LLPolyMorphTarget* morph_target, BOOL invert, std::string layer)
  1917. {
  1918. if (index < BAKED_NUM_INDICES)
  1919. {
  1920. LLMaskedMorph *morph = new LLMaskedMorph(morph_target, invert, layer);
  1921. mBakedTextureDatas[index].mMaskedMorphs.push_front(morph);
  1922. }
  1923. }
  1924. // returns TRUE if morph masks are present and not valid for a given baked texture, FALSE otherwise
  1925. BOOL LLVOAvatar::morphMaskNeedsUpdate(LLVOAvatarDefines::EBakedTextureIndex index)
  1926. {
  1927. if (index >= BAKED_NUM_INDICES)
  1928. {
  1929. return FALSE;
  1930. }
  1931. if (!mBakedTextureDatas[index].mMaskedMorphs.empty())
  1932. {
  1933. if (isSelf())
  1934. {
  1935. LLTexLayerSet *layer_set = mBakedTextureDatas[index].mTexLayerSet;
  1936. if (layer_set)
  1937. {
  1938. return !layer_set->isMorphValid();
  1939. }
  1940. }
  1941. else
  1942. {
  1943. return FALSE;
  1944. }
  1945. }
  1946. return FALSE;
  1947. }
  1948. void LLVOAvatar::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components, LLVOAvatarDefines::EBakedTextureIndex index)
  1949. {
  1950. if (index >= BAKED_NUM_INDICES)
  1951. {
  1952. llwarns << "invalid baked texture index passed to applyMorphMask" << llendl;
  1953. return;
  1954. }
  1955. for (morph_list_t::const_iterator iter = mBakedTextureDatas[index].mMaskedMorphs.begin();
  1956.  iter != mBakedTextureDatas[index].mMaskedMorphs.end(); ++iter)
  1957. {
  1958. const LLMaskedMorph* maskedMorph = (*iter);
  1959. maskedMorph->mMorphTarget->applyMask(tex_data, width, height, num_components, maskedMorph->mInvert);
  1960. }
  1961. }
  1962. //-----------------------------------------------------------------------------
  1963. // releaseComponentTextures()
  1964. // release any component texture UUIDs for which we have a baked texture
  1965. // ! BACKWARDS COMPATIBILITY !
  1966. // This is only called for non-self avatars, it can be taken out once component
  1967. // textures aren't communicated by non-self avatars.
  1968. //-----------------------------------------------------------------------------
  1969. void LLVOAvatar::releaseComponentTextures()
  1970. {
  1971. // ! BACKWARDS COMPATIBILITY !
  1972. // Detect if the baked hair texture actually wasn't sent, and if so set to default
  1973. if (isTextureDefined(TEX_HAIR_BAKED) && getImage(TEX_HAIR_BAKED,0)->getID() == getImage(TEX_SKIRT_BAKED,0)->getID())
  1974. {
  1975. if (getImage(TEX_HAIR_BAKED,0)->getID() != IMG_INVISIBLE)
  1976. {
  1977. // Regression case of messaging system. Expected 21 textures, received 20. last texture is not valid so set to default
  1978. setTETexture(TEX_HAIR_BAKED, IMG_DEFAULT_AVATAR);
  1979. }
  1980. }
  1981. for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
  1982. {
  1983. const LLVOAvatarDictionary::BakedEntry * bakedDicEntry = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
  1984. // skip if this is a skirt and av is not wearing one, or if we don't have a baked texture UUID
  1985. if (!isTextureDefined(bakedDicEntry->mTextureIndex)
  1986. && ( (baked_index != BAKED_SKIRT) || isWearingWearableType(WT_SKIRT) ))
  1987. {
  1988. continue;
  1989. }
  1990. for (U8 texture = 0; texture < bakedDicEntry->mLocalTextures.size(); texture++)
  1991. {
  1992. const U8 te = (ETextureIndex)bakedDicEntry->mLocalTextures[texture];
  1993. setTETexture(te, IMG_DEFAULT_AVATAR);
  1994. }
  1995. }
  1996. }
  1997. //static
  1998. BOOL LLVOAvatar::teToColorParams( ETextureIndex te, U32 *param_name )
  1999. {
  2000. switch( te )
  2001. {
  2002. case TEX_UPPER_SHIRT:
  2003. param_name[0] = 803; //"shirt_red";
  2004. param_name[1] = 804; //"shirt_green";
  2005. param_name[2] = 805; //"shirt_blue";
  2006. break;
  2007. case TEX_LOWER_PANTS:
  2008. param_name[0] = 806; //"pants_red";
  2009. param_name[1] = 807; //"pants_green";
  2010. param_name[2] = 808; //"pants_blue";
  2011. break;
  2012. case TEX_LOWER_SHOES:
  2013. param_name[0] = 812; //"shoes_red";
  2014. param_name[1] = 813; //"shoes_green";
  2015. param_name[2] = 817; //"shoes_blue";
  2016. break;
  2017. case TEX_LOWER_SOCKS:
  2018. param_name[0] = 818; //"socks_red";
  2019. param_name[1] = 819; //"socks_green";
  2020. param_name[2] = 820; //"socks_blue";
  2021. break;
  2022. case TEX_UPPER_JACKET:
  2023. case TEX_LOWER_JACKET:
  2024. param_name[0] = 834; //"jacket_red";
  2025. param_name[1] = 835; //"jacket_green";
  2026. param_name[2] = 836; //"jacket_blue";
  2027. break;
  2028. case TEX_UPPER_GLOVES:
  2029. param_name[0] = 827; //"gloves_red";
  2030. param_name[1] = 829; //"gloves_green";
  2031. param_name[2] = 830; //"gloves_blue";
  2032. break;
  2033. case TEX_UPPER_UNDERSHIRT:
  2034. param_name[0] = 821; //"undershirt_red";
  2035. param_name[1] = 822; //"undershirt_green";
  2036. param_name[2] = 823; //"undershirt_blue";
  2037. break;
  2038. case TEX_LOWER_UNDERPANTS:
  2039. param_name[0] = 824; //"underpants_red";
  2040. param_name[1] = 825; //"underpants_green";
  2041. param_name[2] = 826; //"underpants_blue";
  2042. break;
  2043. case TEX_SKIRT:
  2044. param_name[0] = 921; //"skirt_red";
  2045. param_name[1] = 922; //"skirt_green";
  2046. param_name[2] = 923; //"skirt_blue";
  2047. break;
  2048. default:
  2049. llassert(0);
  2050. return FALSE;
  2051. }
  2052. return TRUE;
  2053. }
  2054. void LLVOAvatar::setClothesColor( ETextureIndex te, const LLColor4& new_color, BOOL upload_bake )
  2055. {
  2056. U32 param_name[3];
  2057. if( teToColorParams( te, param_name ) )
  2058. {
  2059. setVisualParamWeight( param_name[0], new_color.mV[VX], upload_bake );
  2060. setVisualParamWeight( param_name[1], new_color.mV[VY], upload_bake );
  2061. setVisualParamWeight( param_name[2], new_color.mV[VZ], upload_bake );
  2062. }
  2063. }
  2064. LLColor4 LLVOAvatar::getClothesColor( ETextureIndex te )
  2065. {
  2066. LLColor4 color;
  2067. U32 param_name[3];
  2068. if( teToColorParams( te, param_name ) )
  2069. {
  2070. color.mV[VX] = getVisualParamWeight( param_name[0] );
  2071. color.mV[VY] = getVisualParamWeight( param_name[1] );
  2072. color.mV[VZ] = getVisualParamWeight( param_name[2] );
  2073. }
  2074. return color;
  2075. }
  2076. // static
  2077. LLColor4 LLVOAvatar::getDummyColor()
  2078. {
  2079. return DUMMY_COLOR;
  2080. }
  2081. void LLVOAvatar::dumpAvatarTEs( const std::string& context ) const
  2082. {
  2083. /* const char* te_name[] = {
  2084. "TEX_HEAD_BODYPAINT   ",
  2085. "TEX_UPPER_SHIRT      ", */
  2086. llinfos << (isSelf() ? "Self: " : "Other: ") << context << llendl;
  2087. for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
  2088.  iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
  2089.  ++iter)
  2090. {
  2091. const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
  2092. // TODO: handle multiple textures for self
  2093. const LLViewerTexture* te_image = getImage(iter->first,0);
  2094. if( !te_image )
  2095. {
  2096. llinfos << "       " << texture_dict->mName << ": null ptr" << llendl;
  2097. }
  2098. else if( te_image->getID().isNull() )
  2099. {
  2100. llinfos << "       " << texture_dict->mName << ": null UUID" << llendl;
  2101. }
  2102. else if( te_image->getID() == IMG_DEFAULT )
  2103. {
  2104. llinfos << "       " << texture_dict->mName << ": IMG_DEFAULT" << llendl;
  2105. }
  2106. else if( te_image->getID() == IMG_DEFAULT_AVATAR )
  2107. {
  2108. llinfos << "       " << texture_dict->mName << ": IMG_DEFAULT_AVATAR" << llendl;
  2109. }
  2110. else
  2111. {
  2112. llinfos << "       " << texture_dict->mName << ": " << te_image->getID() << llendl;
  2113. }
  2114. }
  2115. }
  2116. // Unlike most wearable functions, this works for both self and other.
  2117. BOOL LLVOAvatar::isWearingWearableType(EWearableType type) const
  2118. {
  2119. if (mIsDummy) return TRUE;
  2120. switch(type)
  2121. {
  2122. case WT_SHAPE:
  2123. case WT_SKIN:
  2124. case WT_HAIR:
  2125. case WT_EYES:
  2126. return TRUE;  // everyone has all bodyparts
  2127. default:
  2128. break; // Do nothing
  2129. }
  2130. /* switch(type)
  2131. case WT_SHIRT:
  2132. indicator_te = TEX_UPPER_SHIRT; */
  2133. for (LLVOAvatarDictionary::Textures::const_iterator tex_iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
  2134.  tex_iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
  2135.  ++tex_iter)
  2136. {
  2137. const LLVOAvatarDictionary::TextureEntry *texture_dict = tex_iter->second;
  2138. if (texture_dict->mWearableType == type)
  2139. {
  2140. // If you're checking another avatar's clothing, you don't have component textures.
  2141. // Thus, you must check to see if the corresponding baked texture is defined.
  2142. // NOTE: this is a poor substitute if you actually want to know about individual pieces of clothing
  2143. // this works for detecting a skirt (most important), but is ineffective at any piece of clothing that
  2144. // gets baked into a texture that always exists (upper or lower).
  2145. if (texture_dict->mIsUsedByBakedTexture)
  2146. {
  2147. const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
  2148. return isTextureDefined(LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index)->mTextureIndex);
  2149. }
  2150. return FALSE;
  2151. }
  2152. }
  2153. return FALSE;
  2154. }
  2155. //-----------------------------------------------------------------------------
  2156. // clampAttachmentPositions()
  2157. //-----------------------------------------------------------------------------
  2158. void LLVOAvatar::clampAttachmentPositions()
  2159. {
  2160. if (isDead())
  2161. {
  2162. return;
  2163. }
  2164. for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
  2165.  iter != mAttachmentPoints.end();
  2166.  ++iter)
  2167. {
  2168. LLViewerJointAttachment* attachment = iter->second;
  2169. if (attachment)
  2170. {
  2171. attachment->clampObjectPosition();
  2172. }
  2173. }
  2174. }
  2175. BOOL LLVOAvatar::hasHUDAttachment() const
  2176. {
  2177. for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); 
  2178.  iter != mAttachmentPoints.end();
  2179.  ++iter)
  2180. {
  2181. LLViewerJointAttachment* attachment = iter->second;
  2182. if (attachment->getIsHUDAttachment() && attachment->getNumObjects() > 0)
  2183. {
  2184. return TRUE;
  2185. }
  2186. }
  2187. return FALSE;
  2188. }
  2189. LLBBox LLVOAvatar::getHUDBBox() const
  2190. {
  2191. LLBBox bbox;
  2192. for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); 
  2193.  iter != mAttachmentPoints.end();
  2194.  ++iter)
  2195. {
  2196. LLViewerJointAttachment* attachment = iter->second;
  2197. if (attachment->getIsHUDAttachment())
  2198. {
  2199. for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
  2200.  attachment_iter != attachment->mAttachedObjects.end();
  2201.  ++attachment_iter)
  2202. {
  2203. const LLViewerObject* attached_object = (*attachment_iter);
  2204. if (attached_object == NULL)
  2205. {
  2206. llwarns << "HUD attached object is NULL!" << llendl;
  2207. continue;
  2208. }
  2209. // initialize bounding box to contain identity orientation and center point for attached object
  2210. bbox.addPointLocal(attached_object->getPosition());
  2211. // add rotated bounding box for attached object
  2212. bbox.addBBoxAgent(attached_object->getBoundingBoxAgent());
  2213. LLViewerObject::const_child_list_t& child_list = attached_object->getChildren();
  2214. for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
  2215.  iter != child_list.end(); 
  2216.  ++iter)
  2217. {
  2218. const LLViewerObject* child_objectp = *iter;
  2219. bbox.addBBoxAgent(child_objectp->getBoundingBoxAgent());
  2220. }
  2221. }
  2222. }
  2223. }
  2224. return bbox;
  2225. }
  2226. void LLVOAvatar::rebuildHUD()
  2227. {
  2228. }
  2229. //-----------------------------------------------------------------------------
  2230. // onFirstTEMessageReceived()
  2231. //-----------------------------------------------------------------------------
  2232. void LLVOAvatar::onFirstTEMessageReceived()
  2233. {
  2234. if( !mFirstTEMessageReceived )
  2235. {
  2236. mFirstTEMessageReceived = TRUE;
  2237. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  2238. {
  2239. const BOOL layer_baked = isTextureDefined(mBakedTextureDatas[i].mTextureIndex);
  2240. // Use any baked textures that we have even if they haven't downloaded yet.
  2241. // (That is, don't do a transition from unbaked to baked.)
  2242. if (layer_baked)
  2243. {
  2244. LLViewerFetchedTexture* image = LLViewerTextureManager::staticCastToFetchedTexture(getImage( mBakedTextureDatas[i].mTextureIndex, 0 ), TRUE) ;
  2245. mBakedTextureDatas[i].mLastTextureIndex = image->getID();
  2246. // If we have more than one texture for the other baked layers, we'll want to call this for them too.
  2247. if ( (image->getID() != IMG_INVISIBLE) && ((i == BAKED_HEAD) || (i == BAKED_UPPER) || (i == BAKED_LOWER)) )
  2248. {
  2249. image->setLoadedCallback( onBakedTextureMasksLoaded, MORPH_MASK_REQUESTED_DISCARD, TRUE, TRUE, new LLTextureMaskData( mID ));
  2250. }
  2251. image->setLoadedCallback( onInitialBakedTextureLoaded, MAX_DISCARD_LEVEL, FALSE, FALSE, new LLUUID( mID ) );
  2252. }
  2253. }
  2254. mMeshTexturesDirty = TRUE;
  2255. gPipeline.markGLRebuild(this);
  2256. }
  2257. }
  2258. //-----------------------------------------------------------------------------
  2259. // processAvatarAppearance()
  2260. //-----------------------------------------------------------------------------
  2261. void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
  2262. {
  2263. if (gSavedSettings.getBOOL("BlockAvatarAppearanceMessages"))
  2264. {
  2265. llwarns << "Blocking AvatarAppearance message" << llendl;
  2266. return;
  2267. }
  2268. LLMemType mt(LLMemType::MTYPE_AVATAR);
  2269. // llinfos << "processAvatarAppearance start " << mID << llendl;
  2270. BOOL is_first_appearance_message = !mFirstAppearanceMessageReceived;
  2271. mFirstAppearanceMessageReceived = TRUE;
  2272. if( isSelf() )
  2273. {
  2274. llwarns << "Received AvatarAppearance for self" << llendl;
  2275. if( mFirstTEMessageReceived )
  2276. {
  2277. // llinfos << "processAvatarAppearance end  " << mID << llendl;
  2278. return;
  2279. }
  2280. }
  2281. if (gNoRender)
  2282. {
  2283. return;
  2284. }
  2285. ESex old_sex = getSex();
  2286. // llinfos << "LLVOAvatar::processAvatarAppearance()" << llendl;
  2287. // dumpAvatarTEs( "PRE  processAvatarAppearance()" );
  2288. unpackTEMessage(mesgsys, _PREHASH_ObjectData);
  2289. // dumpAvatarTEs( "POST processAvatarAppearance()" );
  2290. // prevent the overwriting of valid baked textures with invalid baked textures
  2291. for (U8 baked_index = 0; baked_index < mBakedTextureDatas.size(); baked_index++)
  2292. {
  2293. if (!isTextureDefined(mBakedTextureDatas[baked_index].mTextureIndex) 
  2294. && mBakedTextureDatas[baked_index].mLastTextureIndex != IMG_DEFAULT
  2295. && baked_index != BAKED_SKIRT)
  2296. {
  2297. setTEImage(mBakedTextureDatas[baked_index].mTextureIndex, 
  2298. LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureIndex, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
  2299. }
  2300. }
  2301. if( !is_first_appearance_message )
  2302. {
  2303. onFirstTEMessageReceived();
  2304. }
  2305. setCompositeUpdatesEnabled( FALSE );
  2306. mMeshTexturesDirty = TRUE;
  2307. gPipeline.markGLRebuild(this);
  2308. // ! BACKWARDS COMPATIBILITY !
  2309. // Non-self avatars will no longer have component textures
  2310. if (!isSelf())
  2311. {
  2312. releaseComponentTextures();
  2313. }
  2314. // parse visual params
  2315. S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam);
  2316. if( num_blocks > 1 )
  2317. {
  2318. BOOL params_changed = FALSE;
  2319. BOOL interp_params = FALSE;
  2320. LLVisualParam* param = getFirstVisualParam();
  2321. if (!param)
  2322. {
  2323. llwarns << "No visual params!" << llendl;
  2324. }
  2325. else
  2326. {
  2327. for( S32 i = 0; i < num_blocks; i++ )
  2328. {
  2329. while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) )
  2330. {
  2331. param = getNextVisualParam();
  2332. }
  2333. if( !param )
  2334. {
  2335. llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl;
  2336. return;
  2337. }
  2338. U8 value;
  2339. mesgsys->getU8Fast(_PREHASH_VisualParam, _PREHASH_ParamValue, value, i);
  2340. F32 newWeight = U8_to_F32(value, param->getMinWeight(), param->getMaxWeight());
  2341. if (is_first_appearance_message || (param->getWeight() != newWeight))
  2342. {
  2343. //llinfos << "Received update for param " << param->getDisplayName() << " at value " << newWeight << llendl;
  2344. params_changed = TRUE;
  2345. if(is_first_appearance_message)
  2346. {
  2347. param->setWeight(newWeight, FALSE);
  2348. }
  2349. else
  2350. {
  2351. interp_params = TRUE;
  2352. param->setAnimationTarget(newWeight, FALSE);
  2353. }
  2354. }
  2355. param = getNextVisualParam();
  2356. }
  2357. }
  2358. while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) )
  2359. {
  2360. param = getNextVisualParam();
  2361. }
  2362. if( param )
  2363. {
  2364. llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl;
  2365. return;
  2366. }
  2367. if (params_changed)
  2368. {
  2369. if (interp_params)
  2370. {
  2371. startAppearanceAnimation();
  2372. }
  2373. updateVisualParams();
  2374. ESex new_sex = getSex();
  2375. if( old_sex != new_sex )
  2376. {
  2377. updateSexDependentLayerSets( FALSE );
  2378. }
  2379. }
  2380. }
  2381. else
  2382. {
  2383. llwarns << "AvatarAppearance msg received without any parameters, object: " << getID() << llendl;
  2384. }
  2385. setCompositeUpdatesEnabled( TRUE );
  2386. llassert( getSex() == ((getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE) );
  2387. // If all of the avatars are completely baked, release the global image caches to conserve memory.
  2388. LLVOAvatar::cullAvatarsByPixelArea();
  2389. // llinfos << "processAvatarAppearance end " << mID << llendl;
  2390. }
  2391. // static
  2392. void LLVOAvatar::getAnimLabels( LLDynamicArray<std::string>* labels )
  2393. {
  2394. S32 i;
  2395. for( i = 0; i < gUserAnimStatesCount; i++ )
  2396. {
  2397. labels->put( LLAnimStateLabels::getStateLabel( gUserAnimStates[i].mName ) );
  2398. }
  2399. // Special case to trigger away (AFK) state
  2400. labels->put( "Away From Keyboard" );
  2401. }
  2402. // static 
  2403. void LLVOAvatar::getAnimNames( LLDynamicArray<std::string>* names )
  2404. {
  2405. S32 i;
  2406. for( i = 0; i < gUserAnimStatesCount; i++ )
  2407. {
  2408. names->put( std::string(gUserAnimStates[i].mName) );
  2409. }
  2410. // Special case to trigger away (AFK) state
  2411. names->put( "enter_away_from_keyboard_state" );
  2412. }
  2413. void LLVOAvatar::onBakedTextureMasksLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata )
  2414. {
  2415. if (!userdata) return;
  2416. //llinfos << "onBakedTextureMasksLoaded: " << src_vi->getID() << llendl;
  2417. const LLMemType mt(LLMemType::MTYPE_AVATAR);
  2418. const LLUUID id = src_vi->getID();
  2419.  
  2420. LLTextureMaskData* maskData = (LLTextureMaskData*) userdata;
  2421. LLVOAvatar* self = (LLVOAvatar*) gObjectList.findObject( maskData->mAvatarID );
  2422. // if discard level is 2 less than last discard level we processed, or we hit 0,
  2423. // then generate morph masks
  2424. if(self && success && (discard_level < maskData->mLastDiscardLevel - 2 || discard_level == 0))
  2425. {
  2426. if(aux_src && aux_src->getComponents() == 1)
  2427. {
  2428. if (!aux_src->getData())
  2429. {
  2430. llerrs << "No auxiliary source data for onBakedTextureMasksLoaded" << llendl;
  2431. return;
  2432. }
  2433. U32 gl_name;
  2434. LLImageGL::generateTextures(1, &gl_name );
  2435. stop_glerror();
  2436. gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, gl_name);
  2437. stop_glerror();
  2438. LLImageGL::setManualImage(
  2439. GL_TEXTURE_2D, 0, GL_ALPHA8, 
  2440. aux_src->getWidth(), aux_src->getHeight(),
  2441. GL_ALPHA, GL_UNSIGNED_BYTE, aux_src->getData());
  2442. stop_glerror();
  2443. gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
  2444. /* if( id == head_baked->getID() )
  2445.      if (self->mBakedTextureDatas[BAKED_HEAD].mTexLayerSet)
  2446.      //llinfos << "onBakedTextureMasksLoaded for head " << id << " discard = " << discard_level << llendl;
  2447.  self->mBakedTextureDatas[BAKED_HEAD].mTexLayerSet->applyMorphMask(aux_src->getData(), aux_src->getWidth(), aux_src->getHeight(), 1);
  2448.  maskData->mLastDiscardLevel = discard_level; */
  2449. BOOL found_texture_id = false;
  2450. for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
  2451.  iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
  2452.  ++iter)
  2453. {
  2454. const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
  2455. if (texture_dict->mIsUsedByBakedTexture)
  2456. {
  2457. const ETextureIndex texture_index = iter->first;
  2458. const LLViewerTexture *baked_img = self->getImage(texture_index, 0);
  2459. if (baked_img && id == baked_img->getID())
  2460. {
  2461. const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
  2462. self->applyMorphMask(aux_src->getData(), aux_src->getWidth(), aux_src->getHeight(), 1, baked_index);
  2463. maskData->mLastDiscardLevel = discard_level;
  2464. if (self->mBakedTextureDatas[baked_index].mMaskTexName)
  2465. {
  2466. LLImageGL::deleteTextures(1, &(self->mBakedTextureDatas[baked_index].mMaskTexName));
  2467. }
  2468. self->mBakedTextureDatas[baked_index].mMaskTexName = gl_name;
  2469. found_texture_id = true;
  2470. break;
  2471. }
  2472. }
  2473. }
  2474. if (!found_texture_id)
  2475. {
  2476. llinfos << "onBakedTextureMasksLoaded(): unexpected image id: " << id << llendl;
  2477. }
  2478. self->dirtyMesh();
  2479. }
  2480. else
  2481. {
  2482.             // this can happen when someone uses an old baked texture possibly provided by 
  2483.             // viewer-side baked texture caching
  2484. llwarns << "Masks loaded callback but NO aux source!" << llendl;
  2485. }
  2486. }
  2487. if (final || !success)
  2488. {
  2489. delete maskData;
  2490. }
  2491. }
  2492. // static
  2493. void LLVOAvatar::onInitialBakedTextureLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata )
  2494. {
  2495. LLUUID *avatar_idp = (LLUUID *)userdata;
  2496. LLVOAvatar *selfp = (LLVOAvatar *)gObjectList.findObject(*avatar_idp);
  2497. if (!success && selfp)
  2498. {
  2499. selfp->removeMissingBakedTextures();
  2500. }
  2501. if (final || !success )
  2502. {
  2503. delete avatar_idp;
  2504. }
  2505. }
  2506. void LLVOAvatar::onBakedTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata)
  2507. {
  2508. //llinfos << "onBakedTextureLoaded: " << src_vi->getID() << llendl;
  2509. LLUUID id = src_vi->getID();
  2510. LLUUID *avatar_idp = (LLUUID *)userdata;
  2511. LLVOAvatar *selfp = (LLVOAvatar *)gObjectList.findObject(*avatar_idp);
  2512. if (selfp && !success)
  2513. {
  2514. selfp->removeMissingBakedTextures();
  2515. }
  2516. if( final || !success )
  2517. {
  2518. delete avatar_idp;
  2519. }
  2520. if( selfp && success && final )
  2521. {
  2522. selfp->useBakedTexture( id );
  2523. }
  2524. }
  2525. // Called when baked texture is loaded and also when we start up with a baked texture
  2526. void LLVOAvatar::useBakedTexture( const LLUUID& id )
  2527. {
  2528. /* if(id == head_baked->getID())
  2529.  mHeadBakedLoaded = TRUE;
  2530.  mLastHeadBakedID = id;
  2531.  mHeadMesh0.setTexture( head_baked );
  2532.  mHeadMesh1.setTexture( head_baked ); */
  2533. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  2534. {
  2535. LLViewerTexture* image_baked = getImage( mBakedTextureDatas[i].mTextureIndex, 0 );
  2536. if (id == image_baked->getID())
  2537. {
  2538. mBakedTextureDatas[i].mIsLoaded = true;
  2539. mBakedTextureDatas[i].mLastTextureIndex = id;
  2540. mBakedTextureDatas[i].mIsUsed = true;
  2541. for (U32 k = 0; k < mBakedTextureDatas[i].mMeshes.size(); k++)
  2542. {
  2543. mBakedTextureDatas[i].mMeshes[k]->setTexture( image_baked );
  2544. }
  2545. if (mBakedTextureDatas[i].mTexLayerSet)
  2546. {
  2547. //mBakedTextureDatas[i].mTexLayerSet->destroyComposite();
  2548. }
  2549. const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i);
  2550. for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();
  2551.  local_tex_iter != baked_dict->mLocalTextures.end();
  2552.  ++local_tex_iter)
  2553. {
  2554. if (isSelf()) setBakedReady(*local_tex_iter, TRUE);
  2555. }
  2556. // ! BACKWARDS COMPATIBILITY !
  2557. // Workaround for viewing avatars from old viewers that haven't baked hair textures.
  2558. // This is paired with similar code in updateMeshTextures that sets hair mesh color.
  2559. if (i == BAKED_HAIR)
  2560. {
  2561. for (U32 i = 0; i < mBakedTextureDatas[BAKED_HAIR].mMeshes.size(); i++)
  2562. {
  2563. mBakedTextureDatas[BAKED_HAIR].mMeshes[i]->setColor( 1.f, 1.f, 1.f, 1.f );
  2564. }
  2565. }
  2566. }
  2567. }
  2568. dirtyMesh();
  2569. }
  2570. // static
  2571. void LLVOAvatar::dumpArchetypeXML( void* )
  2572. {
  2573. LLVOAvatar* avatar = gAgent.getAvatarObject();
  2574. LLAPRFile outfile ;
  2575. outfile.open(gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,"new archetype.xml"), LL_APR_WB );
  2576. apr_file_t* file = outfile.getFileHandle() ;
  2577. if (!file)
  2578. {
  2579. return;
  2580. }
  2581. apr_file_printf( file, "<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>n" );
  2582. apr_file_printf( file, "<linden_genepool version="1.0">n" );
  2583. apr_file_printf( file, "nt<archetype name="???">n" );
  2584. // only body parts, not clothing.
  2585. for (S32 type = WT_SHAPE; type <= WT_EYES; type++)
  2586. {
  2587. const std::string& wearable_name = LLWearableDictionary::getTypeName((EWearableType)type);
  2588. apr_file_printf( file, "ntt<!-- wearable: %s -->n", wearable_name.c_str() );
  2589. for (LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam())
  2590. {
  2591. LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param;
  2592. if( (viewer_param->getWearableType() == type) && 
  2593. (viewer_param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE) )
  2594. {
  2595. apr_file_printf(file, "tt<param id="%d" name="%s" value="%.3f"/>n",
  2596. viewer_param->getID(), viewer_param->getName().c_str(), viewer_param->getWeight());
  2597. }
  2598. }
  2599. for (U8 te = 0; te < TEX_NUM_INDICES; te++)
  2600. {
  2601. if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te) == type)
  2602. {
  2603. // MULTIPLE_WEARABLES: extend to multiple wearables?
  2604. LLViewerTexture* te_image = avatar->getImage((ETextureIndex)te, 0);
  2605. if( te_image )
  2606. {
  2607. std::string uuid_str;
  2608. te_image->getID().toString( uuid_str );
  2609. apr_file_printf( file, "tt<texture te="%i" uuid="%s"/>n", te, uuid_str.c_str());
  2610. }
  2611. }
  2612. }
  2613. }
  2614. apr_file_printf( file, "t</archetype>n" );
  2615. apr_file_printf( file, "n</linden_genepool>n" );
  2616. }
  2617. void LLVOAvatar::setVisibilityRank(U32 rank)
  2618. {
  2619. if (mDrawable.isNull() || mDrawable->isDead())
  2620. {
  2621. // do nothing
  2622. return;
  2623. }
  2624. mVisibilityRank = rank;
  2625. }
  2626. // Assumes LLVOAvatar::sInstances has already been sorted.
  2627. S32 LLVOAvatar::getUnbakedPixelAreaRank()
  2628. {
  2629. S32 rank = 1;
  2630. for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
  2631.  iter != LLCharacter::sInstances.end(); ++iter)
  2632. {
  2633. LLVOAvatar* inst = (LLVOAvatar*) *iter;
  2634. if (inst == this)
  2635. {
  2636. return rank;
  2637. }
  2638. else if (!inst->isDead() && !inst->isFullyBaked())
  2639. {
  2640. rank++;
  2641. }
  2642. }
  2643. llassert(0);
  2644. return 0;
  2645. }
  2646. struct CompareScreenAreaGreater
  2647. {
  2648. BOOL operator()(const LLCharacter* const& lhs, const LLCharacter* const& rhs)
  2649. {
  2650. return lhs->getPixelArea() > rhs->getPixelArea();
  2651. }
  2652. };
  2653. // static
  2654. void LLVOAvatar::cullAvatarsByPixelArea()
  2655. {
  2656. std::sort(LLCharacter::sInstances.begin(), LLCharacter::sInstances.end(), CompareScreenAreaGreater());
  2657. // Update the avatars that have changed status
  2658. U32 rank = 0;
  2659. for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
  2660.  iter != LLCharacter::sInstances.end(); ++iter)
  2661. {
  2662. LLVOAvatar* inst = (LLVOAvatar*) *iter;
  2663. BOOL culled;
  2664. if (inst->isSelf() || inst->isFullyBaked())
  2665. {
  2666. culled = FALSE;
  2667. }
  2668. else 
  2669. {
  2670. culled = TRUE;
  2671. }
  2672. if (inst->mCulled != culled)
  2673. {
  2674. inst->mCulled = culled;
  2675. lldebugs << "avatar " << inst->getID() << (culled ? " start culled" : " start not culled" ) << llendl;
  2676. inst->updateMeshTextures();
  2677. }
  2678. if (inst->isSelf())
  2679. {
  2680. inst->setVisibilityRank(0);
  2681. }
  2682. else if (inst->mDrawable.notNull() && inst->mDrawable->isVisible())
  2683. {
  2684. inst->setVisibilityRank(rank++);
  2685. }
  2686. }
  2687. S32 grey_avatars = 0;
  2688. if (LLVOAvatar::areAllNearbyInstancesBaked(grey_avatars))
  2689. {
  2690. LLVOAvatar::deleteCachedImages(false);
  2691. }
  2692. else
  2693. {
  2694. if (gFrameTimeSeconds != sUnbakedUpdateTime) // only update once per frame
  2695. {
  2696. sUnbakedUpdateTime = gFrameTimeSeconds;
  2697. sUnbakedTime += gFrameIntervalSeconds;
  2698. }
  2699. if (grey_avatars > 0)
  2700. {
  2701. if (gFrameTimeSeconds != sGreyUpdateTime) // only update once per frame
  2702. {
  2703. sGreyUpdateTime = gFrameTimeSeconds;
  2704. sGreyTime += gFrameIntervalSeconds;
  2705. }
  2706. }
  2707. }
  2708. }
  2709. void LLVOAvatar::startAppearanceAnimation()
  2710. {
  2711. if(!mAppearanceAnimating)
  2712. {
  2713. mAppearanceAnimating = TRUE;
  2714. mAppearanceMorphTimer.reset();
  2715. mLastAppearanceBlendTime = 0.f;
  2716. }
  2717. }
  2718. // virtual
  2719. void LLVOAvatar::removeMissingBakedTextures()
  2720. {
  2721. }
  2722. //-----------------------------------------------------------------------------
  2723. // LLVOAvatarXmlInfo
  2724. //-----------------------------------------------------------------------------
  2725. LLVOAvatar::LLVOAvatarXmlInfo::LLVOAvatarXmlInfo()
  2726. : mTexSkinColorInfo(0), mTexHairColorInfo(0), mTexEyeColorInfo(0)
  2727. {
  2728. }
  2729. LLVOAvatar::LLVOAvatarXmlInfo::~LLVOAvatarXmlInfo()
  2730. {
  2731. std::for_each(mMeshInfoList.begin(), mMeshInfoList.end(), DeletePointer());
  2732. std::for_each(mSkeletalDistortionInfoList.begin(), mSkeletalDistortionInfoList.end(), DeletePointer());
  2733. std::for_each(mAttachmentInfoList.begin(), mAttachmentInfoList.end(), DeletePointer());
  2734. deleteAndClear(mTexSkinColorInfo);
  2735. deleteAndClear(mTexHairColorInfo);
  2736. deleteAndClear(mTexEyeColorInfo);
  2737. std::for_each(mLayerInfoList.begin(), mLayerInfoList.end(), DeletePointer());
  2738. std::for_each(mDriverInfoList.begin(), mDriverInfoList.end(), DeletePointer());
  2739. std::for_each(mMorphMaskInfoList.begin(), mMorphMaskInfoList.end(), DeletePointer());
  2740. }
  2741. //-----------------------------------------------------------------------------
  2742. // LLVOAvatarBoneInfo::parseXml()
  2743. //-----------------------------------------------------------------------------
  2744. BOOL LLVOAvatarBoneInfo::parseXml(LLXmlTreeNode* node)
  2745. {
  2746. if (node->hasName("bone"))
  2747. {
  2748. mIsJoint = TRUE;
  2749. static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
  2750. if (!node->getFastAttributeString(name_string, mName))
  2751. {
  2752. llwarns << "Bone without name" << llendl;
  2753. return FALSE;
  2754. }
  2755. }
  2756. else if (node->hasName("collision_volume"))
  2757. {
  2758. mIsJoint = FALSE;
  2759. static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
  2760. if (!node->getFastAttributeString(name_string, mName))
  2761. {
  2762. mName = "Collision Volume";
  2763. }
  2764. }
  2765. else
  2766. {
  2767. llwarns << "Invalid node " << node->getName() << llendl;
  2768. return FALSE;
  2769. }
  2770. static LLStdStringHandle pos_string = LLXmlTree::addAttributeString("pos");
  2771. if (!node->getFastAttributeVector3(pos_string, mPos))
  2772. {
  2773. llwarns << "Bone without position" << llendl;
  2774. return FALSE;
  2775. }
  2776. static LLStdStringHandle rot_string = LLXmlTree::addAttributeString("rot");
  2777. if (!node->getFastAttributeVector3(rot_string, mRot))
  2778. {
  2779. llwarns << "Bone without rotation" << llendl;
  2780. return FALSE;
  2781. }
  2782. static LLStdStringHandle scale_string = LLXmlTree::addAttributeString("scale");
  2783. if (!node->getFastAttributeVector3(scale_string, mScale))
  2784. {
  2785. llwarns << "Bone without scale" << llendl;
  2786. return FALSE;
  2787. }
  2788. if (mIsJoint)
  2789. {
  2790. static LLStdStringHandle pivot_string = LLXmlTree::addAttributeString("pivot");
  2791. if (!node->getFastAttributeVector3(pivot_string, mPivot))
  2792. {
  2793. llwarns << "Bone without pivot" << llendl;
  2794. return FALSE;
  2795. }
  2796. }
  2797. // parse children
  2798. LLXmlTreeNode* child;
  2799. for( child = node->getFirstChild(); child; child = node->getNextChild() )
  2800. {
  2801. LLVOAvatarBoneInfo *child_info = new LLVOAvatarBoneInfo;
  2802. if (!child_info->parseXml(child))
  2803. {
  2804. delete child_info;
  2805. return FALSE;
  2806. }
  2807. mChildList.push_back(child_info);
  2808. }
  2809. return TRUE;
  2810. }
  2811. //-----------------------------------------------------------------------------
  2812. // LLVOAvatarSkeletonInfo::parseXml()
  2813. //-----------------------------------------------------------------------------
  2814. BOOL LLVOAvatarSkeletonInfo::parseXml(LLXmlTreeNode* node)
  2815. {
  2816. static LLStdStringHandle num_bones_string = LLXmlTree::addAttributeString("num_bones");
  2817. if (!node->getFastAttributeS32(num_bones_string, mNumBones))
  2818. {
  2819. llwarns << "Couldn't find number of bones." << llendl;
  2820. return FALSE;
  2821. }
  2822. static LLStdStringHandle num_collision_volumes_string = LLXmlTree::addAttributeString("num_collision_volumes");
  2823. node->getFastAttributeS32(num_collision_volumes_string, mNumCollisionVolumes);
  2824. LLXmlTreeNode* child;
  2825. for( child = node->getFirstChild(); child; child = node->getNextChild() )
  2826. {
  2827. LLVOAvatarBoneInfo *info = new LLVOAvatarBoneInfo;
  2828. if (!info->parseXml(child))
  2829. {
  2830. delete info;
  2831. llwarns << "Error parsing bone in skeleton file" << llendl;
  2832. return FALSE;
  2833. }
  2834. mBoneInfoList.push_back(info);
  2835. }
  2836. return TRUE;
  2837. }
  2838. //-----------------------------------------------------------------------------
  2839. // parseXmlSkeletonNode(): parses <skeleton> nodes from XML tree
  2840. //-----------------------------------------------------------------------------
  2841. BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlSkeletonNode(LLXmlTreeNode* root)
  2842. {
  2843. LLXmlTreeNode* node = root->getChildByName( "skeleton" );
  2844. if( !node )
  2845. {
  2846. llwarns << "avatar file: missing <skeleton>" << llendl;
  2847. return FALSE;
  2848. }
  2849. LLXmlTreeNode* child;
  2850. // SKELETON DISTORTIONS
  2851. for (child = node->getChildByName( "param" );
  2852.  child;
  2853.  child = node->getNextNamedChild())
  2854. {
  2855. if (!child->getChildByName("param_skeleton"))
  2856. {
  2857. if (child->getChildByName("param_morph"))
  2858. {
  2859. llwarns << "Can't specify morph param in skeleton definition." << llendl;
  2860. }
  2861. else
  2862. {
  2863. llwarns << "Unknown param type." << llendl;
  2864. }
  2865. continue;
  2866. }
  2867. LLPolySkeletalDistortionInfo *info = new LLPolySkeletalDistortionInfo;
  2868. if (!info->parseXml(child))
  2869. {
  2870. delete info;
  2871. return FALSE;
  2872. }
  2873. mSkeletalDistortionInfoList.push_back(info);
  2874. }
  2875. // ATTACHMENT POINTS
  2876. for (child = node->getChildByName( "attachment_point" );
  2877.  child;
  2878.  child = node->getNextNamedChild())
  2879. {
  2880. LLVOAvatarAttachmentInfo* info = new LLVOAvatarAttachmentInfo();
  2881. static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
  2882. if (!child->getFastAttributeString(name_string, info->mName))
  2883. {
  2884. llwarns << "No name supplied for attachment point." << llendl;
  2885. delete info;
  2886. continue;
  2887. }
  2888. static LLStdStringHandle joint_string = LLXmlTree::addAttributeString("joint");
  2889. if (!child->getFastAttributeString(joint_string, info->mJointName))
  2890. {
  2891. llwarns << "No bone declared in attachment point " << info->mName << llendl;
  2892. delete info;
  2893. continue;
  2894. }
  2895. static LLStdStringHandle position_string = LLXmlTree::addAttributeString("position");
  2896. if (child->getFastAttributeVector3(position_string, info->mPosition))
  2897. {
  2898. info->mHasPosition = TRUE;
  2899. }
  2900. static LLStdStringHandle rotation_string = LLXmlTree::addAttributeString("rotation");
  2901. if (child->getFastAttributeVector3(rotation_string, info->mRotationEuler))
  2902. {
  2903. info->mHasRotation = TRUE;
  2904. }
  2905.  static LLStdStringHandle group_string = LLXmlTree::addAttributeString("group");
  2906. if (child->getFastAttributeS32(group_string, info->mGroup))
  2907. {
  2908. if (info->mGroup == -1)
  2909. info->mGroup = -1111; // -1 = none parsed, < -1 = bad value
  2910. }
  2911. static LLStdStringHandle id_string = LLXmlTree::addAttributeString("id");
  2912. if (!child->getFastAttributeS32(id_string, info->mAttachmentID))
  2913. {
  2914. llwarns << "No id supplied for attachment point " << info->mName << llendl;
  2915. delete info;
  2916. continue;
  2917. }
  2918. static LLStdStringHandle slot_string = LLXmlTree::addAttributeString("pie_slice");
  2919. child->getFastAttributeS32(slot_string, info->mPieMenuSlice);
  2920. static LLStdStringHandle visible_in_first_person_string = LLXmlTree::addAttributeString("visible_in_first_person");
  2921. child->getFastAttributeBOOL(visible_in_first_person_string, info->mVisibleFirstPerson);
  2922. static LLStdStringHandle hud_attachment_string = LLXmlTree::addAttributeString("hud");
  2923. child->getFastAttributeBOOL(hud_attachment_string, info->mIsHUDAttachment);
  2924. mAttachmentInfoList.push_back(info);
  2925. }
  2926. return TRUE;
  2927. }
  2928. //-----------------------------------------------------------------------------
  2929. // parseXmlMeshNodes(): parses <mesh> nodes from XML tree
  2930. //-----------------------------------------------------------------------------
  2931. BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlMeshNodes(LLXmlTreeNode* root)
  2932. {
  2933. for (LLXmlTreeNode* node = root->getChildByName( "mesh" );
  2934.  node;
  2935.  node = root->getNextNamedChild())
  2936. {
  2937. LLVOAvatarMeshInfo *info = new LLVOAvatarMeshInfo;
  2938. // attribute: type
  2939. static LLStdStringHandle type_string = LLXmlTree::addAttributeString("type");
  2940. if( !node->getFastAttributeString( type_string, info->mType ) )
  2941. {
  2942. llwarns << "Avatar file: <mesh> is missing type attribute.  Ignoring element. " << llendl;
  2943. delete info;
  2944. return FALSE;  // Ignore this element
  2945. }
  2946. static LLStdStringHandle lod_string = LLXmlTree::addAttributeString("lod");
  2947. if (!node->getFastAttributeS32( lod_string, info->mLOD ))
  2948. {
  2949. llwarns << "Avatar file: <mesh> is missing lod attribute.  Ignoring element. " << llendl;
  2950. delete info;
  2951. return FALSE;  // Ignore this element
  2952. }
  2953. static LLStdStringHandle file_name_string = LLXmlTree::addAttributeString("file_name");
  2954. if( !node->getFastAttributeString( file_name_string, info->mMeshFileName ) )
  2955. {
  2956. llwarns << "Avatar file: <mesh> is missing file_name attribute.  Ignoring: " << info->mType << llendl;
  2957. delete info;
  2958. return FALSE;  // Ignore this element
  2959. }
  2960. static LLStdStringHandle reference_string = LLXmlTree::addAttributeString("reference");
  2961. node->getFastAttributeString( reference_string, info->mReferenceMeshName );
  2962. // attribute: min_pixel_area
  2963. static LLStdStringHandle min_pixel_area_string = LLXmlTree::addAttributeString("min_pixel_area");
  2964. static LLStdStringHandle min_pixel_width_string = LLXmlTree::addAttributeString("min_pixel_width");
  2965. if (!node->getFastAttributeF32( min_pixel_area_string, info->mMinPixelArea ))
  2966. {
  2967. F32 min_pixel_area = 0.1f;
  2968. if (node->getFastAttributeF32( min_pixel_width_string, min_pixel_area ))
  2969. {
  2970. // this is square root of pixel area (sensible to use linear space in defining lods)
  2971. min_pixel_area = min_pixel_area * min_pixel_area;
  2972. }
  2973. info->mMinPixelArea = min_pixel_area;
  2974. }
  2975. // Parse visual params for this node only if we haven't already
  2976. for (LLXmlTreeNode* child = node->getChildByName( "param" );
  2977.  child;
  2978.  child = node->getNextNamedChild())
  2979. {
  2980. if (!child->getChildByName("param_morph"))
  2981. {
  2982. if (child->getChildByName("param_skeleton"))
  2983. {
  2984. llwarns << "Can't specify skeleton param in a mesh definition." << llendl;
  2985. }
  2986. else
  2987. {
  2988. llwarns << "Unknown param type." << llendl;
  2989. }
  2990. continue;
  2991. }
  2992. LLPolyMorphTargetInfo *morphinfo = new LLPolyMorphTargetInfo();
  2993. if (!morphinfo->parseXml(child))
  2994. {
  2995. delete morphinfo;
  2996. delete info;
  2997. return -1;
  2998. }
  2999. BOOL shared = FALSE;
  3000. static LLStdStringHandle shared_string = LLXmlTree::addAttributeString("shared");
  3001. child->getFastAttributeBOOL(shared_string, shared);
  3002. info->mPolyMorphTargetInfoList.push_back(LLVOAvatarMeshInfo::morph_info_pair_t(morphinfo, shared));
  3003. }
  3004. mMeshInfoList.push_back(info);
  3005. }
  3006. return TRUE;
  3007. }
  3008. //-----------------------------------------------------------------------------
  3009. // parseXmlColorNodes(): parses <global_color> nodes from XML tree
  3010. //-----------------------------------------------------------------------------
  3011. BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlColorNodes(LLXmlTreeNode* root)
  3012. {
  3013. for (LLXmlTreeNode* color_node = root->getChildByName( "global_color" );
  3014.  color_node;
  3015.  color_node = root->getNextNamedChild())
  3016. {
  3017. std::string global_color_name;
  3018. static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
  3019. if (color_node->getFastAttributeString( name_string, global_color_name ) )
  3020. {
  3021. if( global_color_name == "skin_color" )
  3022. {
  3023. if (mTexSkinColorInfo)
  3024. {
  3025. llwarns << "avatar file: multiple instances of skin_color" << llendl;
  3026. return FALSE;
  3027. }
  3028. mTexSkinColorInfo = new LLTexGlobalColorInfo;
  3029. if( !mTexSkinColorInfo->parseXml( color_node ) )
  3030. {
  3031. deleteAndClear(mTexSkinColorInfo);
  3032. llwarns << "avatar file: mTexSkinColor->parseXml() failed" << llendl;
  3033. return FALSE;
  3034. }
  3035. }
  3036. else if( global_color_name == "hair_color" )
  3037. {
  3038. if (mTexHairColorInfo)
  3039. {
  3040. llwarns << "avatar file: multiple instances of hair_color" << llendl;
  3041. return FALSE;
  3042. }
  3043. mTexHairColorInfo = new LLTexGlobalColorInfo;
  3044. if( !mTexHairColorInfo->parseXml( color_node ) )
  3045. {
  3046. deleteAndClear(mTexHairColorInfo);
  3047. llwarns << "avatar file: mTexHairColor->parseXml() failed" << llendl;
  3048. return FALSE;
  3049. }
  3050. }
  3051. else if( global_color_name == "eye_color" )
  3052. {
  3053. if (mTexEyeColorInfo)
  3054. {
  3055. llwarns << "avatar file: multiple instances of eye_color" << llendl;
  3056. return FALSE;
  3057. }
  3058. mTexEyeColorInfo = new LLTexGlobalColorInfo;
  3059. if( !mTexEyeColorInfo->parseXml( color_node ) )
  3060. {
  3061. llwarns << "avatar file: mTexEyeColor->parseXml() failed" << llendl;
  3062. return FALSE;
  3063. }
  3064. }
  3065. }
  3066. }
  3067. return TRUE;
  3068. }
  3069. //-----------------------------------------------------------------------------
  3070. // parseXmlLayerNodes(): parses <layer_set> nodes from XML tree
  3071. //-----------------------------------------------------------------------------
  3072. BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlLayerNodes(LLXmlTreeNode* root)
  3073. {
  3074. for (LLXmlTreeNode* layer_node = root->getChildByName( "layer_set" );
  3075.  layer_node;
  3076.  layer_node = root->getNextNamedChild())
  3077. {
  3078. LLTexLayerSetInfo* layer_info = new LLTexLayerSetInfo();
  3079. if( layer_info->parseXml( layer_node ) )
  3080. {
  3081. mLayerInfoList.push_back(layer_info);
  3082. }
  3083. else
  3084. {
  3085. delete layer_info;
  3086. llwarns << "avatar file: layer_set->parseXml() failed" << llendl;
  3087. return FALSE;
  3088. }
  3089. }
  3090. return TRUE;
  3091. }
  3092. //-----------------------------------------------------------------------------
  3093. // parseXmlDriverNodes(): parses <driver_parameters> nodes from XML tree
  3094. //-----------------------------------------------------------------------------
  3095. BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlDriverNodes(LLXmlTreeNode* root)
  3096. {
  3097. LLXmlTreeNode* driver = root->getChildByName( "driver_parameters" );
  3098. if( driver )
  3099. {
  3100. for (LLXmlTreeNode* grand_child = driver->getChildByName( "param" );
  3101.  grand_child;
  3102.  grand_child = driver->getNextNamedChild())
  3103. {
  3104. if( grand_child->getChildByName( "param_driver" ) )
  3105. {
  3106. LLDriverParamInfo* driver_info = new LLDriverParamInfo();
  3107. if( driver_info->parseXml( grand_child ) )
  3108. {
  3109. mDriverInfoList.push_back(driver_info);
  3110. }
  3111. else
  3112. {
  3113. delete driver_info;
  3114. llwarns << "avatar file: driver_param->parseXml() failed" << llendl;
  3115. return FALSE;
  3116. }
  3117. }
  3118. }
  3119. }
  3120. return TRUE;
  3121. }
  3122. //-----------------------------------------------------------------------------
  3123. // parseXmlDriverNodes(): parses <driver_parameters> nodes from XML tree
  3124. //-----------------------------------------------------------------------------
  3125. BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlMorphNodes(LLXmlTreeNode* root)
  3126. {
  3127. LLXmlTreeNode* masks = root->getChildByName( "morph_masks" );
  3128. if( !masks )
  3129. {
  3130. return FALSE;
  3131. }
  3132. for (LLXmlTreeNode* grand_child = masks->getChildByName( "mask" );
  3133.  grand_child;
  3134.  grand_child = masks->getNextNamedChild())
  3135. {
  3136. LLVOAvatarMorphInfo* info = new LLVOAvatarMorphInfo();
  3137. static LLStdStringHandle name_string = LLXmlTree::addAttributeString("morph_name");
  3138. if (!grand_child->getFastAttributeString(name_string, info->mName))
  3139. {
  3140. llwarns << "No name supplied for morph mask." << llendl;
  3141. delete info;
  3142. continue;
  3143. }
  3144. static LLStdStringHandle region_string = LLXmlTree::addAttributeString("body_region");
  3145. if (!grand_child->getFastAttributeString(region_string, info->mRegion))
  3146. {
  3147. llwarns << "No region supplied for morph mask." << llendl;
  3148. delete info;
  3149. continue;
  3150. }
  3151. static LLStdStringHandle layer_string = LLXmlTree::addAttributeString("layer");
  3152. if (!grand_child->getFastAttributeString(layer_string, info->mLayer))
  3153. {
  3154. llwarns << "No layer supplied for morph mask." << llendl;
  3155. delete info;
  3156. continue;
  3157. }
  3158. // optional parameter. don't throw a warning if not present.
  3159. static LLStdStringHandle invert_string = LLXmlTree::addAttributeString("invert");
  3160. grand_child->getFastAttributeBOOL(invert_string, info->mInvert);
  3161. mMorphMaskInfoList.push_back(info);
  3162. }
  3163. return TRUE;
  3164. }
  3165. //virtual
  3166. void LLVOAvatar::updateRegion(LLViewerRegion *regionp)
  3167. {
  3168. }
  3169. std::string LLVOAvatar::getFullname() const
  3170. {
  3171. std::string name;
  3172. LLNameValue* first = getNVPair("FirstName"); 
  3173. LLNameValue* last  = getNVPair("LastName"); 
  3174. if (first && last)
  3175. {
  3176. name += first->getString();
  3177. name += " ";
  3178. name += last->getString();
  3179. }
  3180. return name;
  3181. }
  3182. LLHost LLVOAvatar::getObjectHost() const
  3183. {
  3184. LLViewerRegion* region = getRegion();
  3185. if (region && !isDead())
  3186. {
  3187. return region->getHost();
  3188. }
  3189. else
  3190. {
  3191. return LLHost::invalid;
  3192. }
  3193. }
  3194. //static
  3195. void LLVOAvatar::updateFreezeCounter(S32 counter)
  3196. {
  3197. if(counter)
  3198. {
  3199. sFreezeCounter = counter;
  3200. }
  3201. else if(sFreezeCounter > 0)
  3202. {
  3203. sFreezeCounter--;
  3204. }
  3205. else
  3206. {
  3207. sFreezeCounter = 0;
  3208. }
  3209. }
  3210. BOOL LLVOAvatar::updateLOD()
  3211. {
  3212. if (isImpostor())
  3213. {
  3214. return TRUE;
  3215. }
  3216. BOOL res = updateJointLODs();
  3217. LLFace* facep = mDrawable->getFace(0);
  3218. if (facep->mVertexBuffer.isNull() ||
  3219. (LLVertexBuffer::sEnableVBOs &&
  3220. ((facep->mVertexBuffer->getUsage() == GL_STATIC_DRAW ? TRUE : FALSE) !=
  3221.  (facep->getPool()->getVertexShaderLevel() > 0 ? TRUE : FALSE))))
  3222. {
  3223. mDirtyMesh = TRUE;
  3224. }
  3225. if (mDirtyMesh || mDrawable->isState(LLDrawable::REBUILD_GEOMETRY))
  3226. { //LOD changed or new mesh created, allocate new vertex buffer if needed
  3227. updateMeshData();
  3228. mDirtyMesh = FALSE;
  3229. mNeedsSkin = TRUE;
  3230. mDrawable->clearState(LLDrawable::REBUILD_GEOMETRY);
  3231. }
  3232. updateVisibility();
  3233. return res;
  3234. }
  3235. U32 LLVOAvatar::getPartitionType() const
  3236. // Avatars merely exist as drawables in the bridge partition
  3237. return LLViewerRegion::PARTITION_BRIDGE;
  3238. }
  3239. //static
  3240. void LLVOAvatar::updateImpostors() 
  3241. {
  3242. for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
  3243.  iter != LLCharacter::sInstances.end(); ++iter)
  3244. {
  3245. LLVOAvatar* avatar = (LLVOAvatar*) *iter;
  3246. if (!avatar->isDead() && avatar->needsImpostorUpdate() && avatar->isVisible() && avatar->isImpostor())
  3247. {
  3248. gPipeline.generateImpostor(avatar);
  3249. }
  3250. }
  3251. }
  3252. BOOL LLVOAvatar::isImpostor() const
  3253. {
  3254. return (sUseImpostors && mUpdatePeriod >= IMPOSTOR_PERIOD) ? TRUE : FALSE;
  3255. }
  3256. BOOL LLVOAvatar::needsImpostorUpdate() const
  3257. {
  3258. return mNeedsImpostorUpdate;
  3259. }
  3260. const LLVector3& LLVOAvatar::getImpostorOffset() const
  3261. {
  3262. return mImpostorOffset;
  3263. }
  3264. const LLVector2& LLVOAvatar::getImpostorDim() const
  3265. {
  3266. return mImpostorDim;
  3267. }
  3268. void LLVOAvatar::setImpostorDim(const LLVector2& dim)
  3269. {
  3270. mImpostorDim = dim;
  3271. }
  3272. void LLVOAvatar::cacheImpostorValues()
  3273. {
  3274. getImpostorValues(mImpostorExtents, mImpostorAngle, mImpostorDistance);
  3275. }
  3276. void LLVOAvatar::getImpostorValues(LLVector3* extents, LLVector3& angle, F32& distance) const
  3277. {
  3278. const LLVector3* ext = mDrawable->getSpatialExtents();
  3279. extents[0] = ext[0];
  3280. extents[1] = ext[1];
  3281. LLVector3 at = LLViewerCamera::getInstance()->getOrigin()-(getRenderPosition()+mImpostorOffset);
  3282. distance = at.normalize();
  3283. F32 da = 1.f - (at*LLViewerCamera::getInstance()->getAtAxis());
  3284. angle.mV[0] = LLViewerCamera::getInstance()->getYaw()*da;
  3285. angle.mV[1] = LLViewerCamera::getInstance()->getPitch()*da;
  3286. angle.mV[2] = da;
  3287. }
  3288. void LLVOAvatar::idleUpdateRenderCost()
  3289. {
  3290. static const U32 ARC_BODY_PART_COST = 20;
  3291. static const U32 ARC_LIMIT = 2048;
  3292. if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME))
  3293. {
  3294. return;
  3295. }
  3296. U32 cost = 0;
  3297. std::set<LLUUID> textures;
  3298. for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
  3299. {
  3300. const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
  3301. ETextureIndex tex_index = baked_dict->mTextureIndex;
  3302. if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(WT_SKIRT)))
  3303. {
  3304. if (isTextureVisible(tex_index))
  3305. {
  3306. cost +=ARC_BODY_PART_COST;
  3307. }
  3308. }
  3309. }
  3310. for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); 
  3311.  iter != mAttachmentPoints.end();
  3312.  ++iter)
  3313. {
  3314. LLViewerJointAttachment* attachment = iter->second;
  3315. for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
  3316.  attachment_iter != attachment->mAttachedObjects.end();
  3317.  ++attachment_iter)
  3318. {
  3319. const LLViewerObject* attached_object = (*attachment_iter);
  3320. if (attached_object && !attached_object->isHUDAttachment())
  3321. {
  3322. const LLDrawable* drawable = attached_object->mDrawable;
  3323. if (drawable)
  3324. {
  3325. const LLVOVolume* volume = drawable->getVOVolume();
  3326. if (volume)
  3327. {
  3328. cost += volume->getRenderCost(textures);
  3329. }
  3330. }
  3331. }
  3332. }
  3333. }
  3334. cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST;
  3335. setDebugText(llformat("%d", cost));
  3336. F32 green = 1.f-llclamp(((F32) cost-(F32)ARC_LIMIT)/(F32)ARC_LIMIT, 0.f, 1.f);
  3337. F32 red = llmin((F32) cost/(F32)ARC_LIMIT, 1.f);
  3338. mText->setColor(LLColor4(red,green,0,1));
  3339. }
  3340. // static
  3341. BOOL LLVOAvatar::isIndexLocalTexture(ETextureIndex index)
  3342. {
  3343. if (index < 0 || index >= TEX_NUM_INDICES) return false;
  3344. return LLVOAvatarDictionary::getInstance()->getTexture(index)->mIsLocalTexture;
  3345. }
  3346. // static
  3347. BOOL LLVOAvatar::isIndexBakedTexture(ETextureIndex index)
  3348. {
  3349. if (index < 0 || index >= TEX_NUM_INDICES) return false;
  3350. return LLVOAvatarDictionary::getInstance()->getTexture(index)->mIsBakedTexture;
  3351. }
  3352. const std::string LLVOAvatar::getBakedStatusForPrintout() const
  3353. {
  3354. std::string line;
  3355. for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
  3356.  iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
  3357.  ++iter)
  3358. {
  3359. const ETextureIndex index = iter->first;
  3360. const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
  3361. if (texture_dict->mIsBakedTexture)
  3362. {
  3363. line += texture_dict->mName;
  3364. if (isTextureDefined(index))
  3365. {
  3366. line += "_baked";
  3367. }
  3368. line += " ";
  3369. }
  3370. }
  3371. return line;
  3372. }
  3373. //virtual
  3374. S32 LLVOAvatar::getTexImageSize() const
  3375. {
  3376. return TEX_IMAGE_SIZE_OTHER;
  3377. }
  3378. //-----------------------------------------------------------------------------
  3379. // Utility functions
  3380. //-----------------------------------------------------------------------------
  3381. F32 calc_bouncy_animation(F32 x)
  3382. {
  3383. return -(cosf(x * F_PI * 2.5f - F_PI_BY_TWO))*(0.4f + x * -0.1f) + x * 1.3f;
  3384. }
  3385. //virtual
  3386. BOOL LLVOAvatar::isTextureDefined(LLVOAvatarDefines::ETextureIndex te, U32 index ) const
  3387. {
  3388. if (isIndexLocalTexture(te)) 
  3389. {
  3390. return FALSE;
  3391. }
  3392. return (getImage(te, index)->getID() != IMG_DEFAULT_AVATAR && 
  3393. getImage(te, index)->getID() != IMG_DEFAULT);
  3394. }