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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llvoavatar.cpp
  3.  * @brief Implementation of LLVOAvatar class which is a derivation fo LLViewerObject
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #if LL_MSVC
  33. // disable warning about boost::lexical_cast returning uninitialized data
  34. // when it fails to parse the string
  35. #pragma warning (disable:4701)
  36. #endif
  37. #include "llviewerprecompiledheaders.h"
  38. #include "llvoavatarself.h"
  39. #include "llvoavatar.h"
  40. #include "pipeline.h"
  41. #include "llagent.h" //  Get state values from here
  42. #include "llagentwearables.h"
  43. #include "llhudeffecttrail.h"
  44. #include "llhudmanager.h"
  45. #include "llselectmgr.h"
  46. #include "lltoolgrab.h" // for needsRenderBeam
  47. #include "lltoolmgr.h" // for needsRenderBeam
  48. #include "lltoolmorph.h"
  49. #include "lltrans.h"
  50. #include "llviewercamera.h"
  51. #include "llviewermenu.h"
  52. #include "llviewerobjectlist.h"
  53. #include "llviewerstats.h"
  54. #include "llviewerregion.h"
  55. #include "llappearancemgr.h"
  56. #if LL_MSVC
  57. // disable boost::lexical_cast warning
  58. #pragma warning (disable:4702)
  59. #endif
  60. #include <boost/lexical_cast.hpp>
  61. using namespace LLVOAvatarDefines;
  62. /*********************************************************************************
  63.  **                                                                             **
  64.  ** Begin private LLVOAvatarSelf Support classes
  65.  **
  66.  **/
  67. struct LocalTextureData
  68. {
  69. LocalTextureData() : 
  70. mIsBakedReady(FALSE), 
  71. mDiscard(MAX_DISCARD_LEVEL+1), 
  72. mImage(NULL), 
  73. mWearableID(IMG_DEFAULT_AVATAR),
  74. mTexEntry(NULL)
  75. {}
  76. LLPointer<LLViewerFetchedTexture> mImage;
  77. BOOL mIsBakedReady;
  78. S32 mDiscard;
  79. LLUUID mWearableID; // UUID of the wearable that this texture belongs to, not of the image itself
  80. LLTextureEntry *mTexEntry;
  81. };
  82. //-----------------------------------------------------------------------------
  83. // Callback data
  84. //-----------------------------------------------------------------------------
  85. struct LLAvatarTexData
  86. {
  87. LLAvatarTexData(const LLUUID& id, ETextureIndex index) : 
  88. mAvatarID(id), 
  89. mIndex(index) 
  90. {}
  91. LLUUID mAvatarID;
  92. ETextureIndex mIndex;
  93. };
  94. /**
  95.  **
  96.  ** End LLVOAvatarSelf Support classes
  97.  **                                                                             **
  98.  *********************************************************************************/
  99. //-----------------------------------------------------------------------------
  100. // Static Data
  101. //-----------------------------------------------------------------------------
  102. S32 LLVOAvatarSelf::sScratchTexBytes = 0;
  103. LLMap< LLGLenum, LLGLuint*> LLVOAvatarSelf::sScratchTexNames;
  104. LLMap< LLGLenum, F32*> LLVOAvatarSelf::sScratchTexLastBindTime;
  105. /*********************************************************************************
  106.  **                                                                             **
  107.  ** Begin LLVOAvatarSelf Constructor routines
  108.  **
  109.  **/
  110. LLVOAvatarSelf::LLVOAvatarSelf(const LLUUID& id,
  111.    const LLPCode pcode,
  112.    LLViewerRegion* regionp) :
  113. LLVOAvatar(id, pcode, regionp),
  114. mScreenp(NULL),
  115. mLastRegionHandle(0),
  116. mRegionCrossingCount(0)
  117. {
  118. gAgent.setAvatarObject(this);
  119. gAgentWearables.setAvatarObject(this);
  120. lldebugs << "Marking avatar as self " << id << llendl;
  121. }
  122. void LLVOAvatarSelf::initInstance()
  123. {
  124. BOOL status = TRUE;
  125. // creates hud joint(mScreen) among other things
  126. status &= loadAvatarSelf();
  127. // adds attachment points to mScreen among other things
  128. LLVOAvatar::initInstance();
  129. status &= buildMenus();
  130. if (!status)
  131. {
  132. llerrs << "Unable to load user's avatar" << llendl;
  133. return;
  134. }
  135. }
  136. // virtual
  137. void LLVOAvatarSelf::markDead()
  138. {
  139. mBeam = NULL;
  140. LLVOAvatar::markDead();
  141. }
  142. /*virtual*/ BOOL LLVOAvatarSelf::loadAvatar()
  143. {
  144. BOOL success = LLVOAvatar::loadAvatar();
  145. // set all parameters sotred directly in the avatar to have
  146. // the isSelfParam to be TRUE - this is used to prevent
  147. // them from being animated or trigger accidental rebakes
  148. // when we copy params from the wearable to the base avatar.
  149. for (LLViewerVisualParam* param = (LLViewerVisualParam*) getFirstVisualParam(); 
  150.  param;
  151.  param = (LLViewerVisualParam*) getNextVisualParam())
  152. {
  153. if (param->getWearableType() != WT_INVALID)
  154. {
  155. param->setIsDummy(TRUE);
  156. }
  157. }
  158. return success;
  159. }
  160. BOOL LLVOAvatarSelf::loadAvatarSelf()
  161. {
  162. BOOL success = TRUE;
  163. // avatar_skeleton.xml
  164. if (!buildSkeletonSelf(sAvatarSkeletonInfo))
  165. {
  166. llwarns << "avatar file: buildSkeleton() failed" << llendl;
  167. return FALSE;
  168. }
  169. // TODO: make loadLayersets() called only by self.
  170. //success &= loadLayersets();
  171. return success;
  172. }
  173. BOOL LLVOAvatarSelf::buildSkeletonSelf(const LLVOAvatarSkeletonInfo *info)
  174. {
  175. LLMemType mt(LLMemType::MTYPE_AVATAR);
  176. // add special-purpose "screen" joint
  177. mScreenp = new LLViewerJoint("mScreen", NULL);
  178. // for now, put screen at origin, as it is only used during special
  179. // HUD rendering mode
  180. F32 aspect = LLViewerCamera::getInstance()->getAspect();
  181. LLVector3 scale(1.f, aspect, 1.f);
  182. mScreenp->setScale(scale);
  183. mScreenp->setWorldPosition(LLVector3::zero);
  184. return TRUE;
  185. }
  186. BOOL LLVOAvatarSelf::buildMenus()
  187. {
  188. //-------------------------------------------------------------------------
  189. // build the attach and detach menus
  190. //-------------------------------------------------------------------------
  191. gAttachBodyPartPieMenus[0] = NULL;
  192. LLContextMenu::Params params;
  193. params.label(LLTrans::getString("BodyPartsRightArm") + " >");
  194. params.name(params.label);
  195. params.visible(false);
  196. gAttachBodyPartPieMenus[1] = LLUICtrlFactory::create<LLContextMenu> (params);
  197. params.label(LLTrans::getString("BodyPartsHead") + " >");
  198. params.name(params.label);
  199. gAttachBodyPartPieMenus[2] = LLUICtrlFactory::create<LLContextMenu> (params);
  200. params.label(LLTrans::getString("BodyPartsLeftArm") + " >");
  201. params.name(params.label);
  202. gAttachBodyPartPieMenus[3] = LLUICtrlFactory::create<LLContextMenu> (params);
  203. gAttachBodyPartPieMenus[4] = NULL;
  204. params.label(LLTrans::getString("BodyPartsLeftLeg") + " >");
  205. params.name(params.label);
  206. gAttachBodyPartPieMenus[5] = LLUICtrlFactory::create<LLContextMenu> (params);
  207. params.label(LLTrans::getString("BodyPartsTorso") + " >");
  208. params.name(params.label);
  209. gAttachBodyPartPieMenus[6] = LLUICtrlFactory::create<LLContextMenu> (params);
  210. params.label(LLTrans::getString("BodyPartsRightLeg") + " >");
  211. params.name(params.label);
  212. gAttachBodyPartPieMenus[7] = LLUICtrlFactory::create<LLContextMenu> (params);
  213. gDetachBodyPartPieMenus[0] = NULL;
  214. params.label(LLTrans::getString("BodyPartsRightArm") + " >");
  215. params.name(params.label);
  216. gDetachBodyPartPieMenus[1] = LLUICtrlFactory::create<LLContextMenu> (params);
  217. params.label(LLTrans::getString("BodyPartsHead") + " >");
  218. params.name(params.label);
  219. gDetachBodyPartPieMenus[2] = LLUICtrlFactory::create<LLContextMenu> (params);
  220. params.label(LLTrans::getString("BodyPartsLeftArm") + " >");
  221. params.name(params.label);
  222. gDetachBodyPartPieMenus[3] = LLUICtrlFactory::create<LLContextMenu> (params);
  223. gDetachBodyPartPieMenus[4] = NULL;
  224. params.label(LLTrans::getString("BodyPartsLeftLeg") + " >");
  225. params.name(params.label);
  226. gDetachBodyPartPieMenus[5] = LLUICtrlFactory::create<LLContextMenu> (params);
  227. params.label(LLTrans::getString("BodyPartsTorso") + " >");
  228. params.name(params.label);
  229. gDetachBodyPartPieMenus[6] = LLUICtrlFactory::create<LLContextMenu> (params);
  230. params.label(LLTrans::getString("BodyPartsRightLeg") + " >");
  231. params.name(params.label);
  232. gDetachBodyPartPieMenus[7] = LLUICtrlFactory::create<LLContextMenu> (params);
  233. for (S32 i = 0; i < 8; i++)
  234. {
  235. if (gAttachBodyPartPieMenus[i])
  236. {
  237. gAttachPieMenu->appendContextSubMenu( gAttachBodyPartPieMenus[i] );
  238. }
  239. else
  240. {
  241. BOOL attachment_found = FALSE;
  242. for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
  243.  iter != mAttachmentPoints.end();
  244.  ++iter)
  245. {
  246. LLViewerJointAttachment* attachment = iter->second;
  247. if (attachment->getGroup() == i)
  248. {
  249. LLMenuItemCallGL::Params item_params;
  250. std::string sub_piemenu_name = attachment->getName();
  251. if (LLTrans::getString(sub_piemenu_name) != "")
  252. {
  253. item_params.label = LLTrans::getString(sub_piemenu_name);
  254. }
  255. else
  256. {
  257. item_params.label = sub_piemenu_name;
  258. }
  259. item_params.name =(item_params.label );
  260. item_params.on_click.function_name = "Object.AttachToAvatar";
  261. item_params.on_click.parameter = iter->first;
  262. item_params.on_enable.function_name = "Object.EnableWear";
  263. item_params.on_enable.parameter = iter->first;
  264. LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
  265. gAttachPieMenu->addChild(item);
  266. attachment_found = TRUE;
  267. break;
  268. }
  269. }
  270. }
  271. if (gDetachBodyPartPieMenus[i])
  272. {
  273. gDetachPieMenu->appendContextSubMenu( gDetachBodyPartPieMenus[i] );
  274. }
  275. else
  276. {
  277. BOOL attachment_found = FALSE;
  278. for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
  279.  iter != mAttachmentPoints.end();
  280.  ++iter)
  281. {
  282. LLViewerJointAttachment* attachment = iter->second;
  283. if (attachment->getGroup() == i)
  284. {
  285. LLMenuItemCallGL::Params item_params;
  286. std::string sub_piemenu_name = attachment->getName();
  287. if (LLTrans::getString(sub_piemenu_name) != "")
  288. {
  289. item_params.label = LLTrans::getString(sub_piemenu_name);
  290. }
  291. else
  292. {
  293. item_params.label = sub_piemenu_name;
  294. }
  295. item_params.name =(item_params.label );
  296. item_params.on_click.function_name = "Attachment.Detach";
  297. item_params.on_click.parameter = iter->first;
  298. item_params.on_enable.function_name = "Attachment.EnableDetach";
  299. item_params.on_enable.parameter = iter->first;
  300. LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
  301. gDetachPieMenu->addChild(item);
  302. attachment_found = TRUE;
  303. break;
  304. }
  305. }
  306. }
  307. }
  308. // add screen attachments
  309. for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
  310.  iter != mAttachmentPoints.end();
  311.  ++iter)
  312. {
  313. LLViewerJointAttachment* attachment = iter->second;
  314. if (attachment->getGroup() == 8)
  315. {
  316. LLMenuItemCallGL::Params item_params;
  317. std::string sub_piemenu_name = attachment->getName();
  318. if (LLTrans::getString(sub_piemenu_name) != "")
  319. {
  320. item_params.label = LLTrans::getString(sub_piemenu_name);
  321. }
  322. else
  323. {
  324. item_params.label = sub_piemenu_name;
  325. }
  326. item_params.name =(item_params.label );
  327. item_params.on_click.function_name = "Object.AttachToAvatar";
  328. item_params.on_click.parameter = iter->first;
  329. item_params.on_enable.function_name = "Object.EnableWear";
  330. item_params.on_enable.parameter = iter->first;
  331. LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
  332. gAttachScreenPieMenu->addChild(item);
  333. item_params.on_click.function_name = "Attachment.DetachFromPoint";
  334. item_params.on_click.parameter = iter->first;
  335. item_params.on_enable.function_name = "Attachment.PointFilled";
  336. item_params.on_enable.parameter = iter->first;
  337. item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
  338. gDetachScreenPieMenu->addChild(item);
  339. }
  340. }
  341. for (S32 pass = 0; pass < 2; pass++)
  342. {
  343. // *TODO: Skinning - gAttachSubMenu is an awful, awful hack
  344. if (!gAttachSubMenu)
  345. {
  346. break;
  347. }
  348. for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
  349.  iter != mAttachmentPoints.end();
  350.  ++iter)
  351. {
  352. LLViewerJointAttachment* attachment = iter->second;
  353. if (attachment->getIsHUDAttachment() != (pass == 1))
  354. {
  355. continue;
  356. }
  357. LLMenuItemCallGL::Params item_params;
  358. std::string sub_piemenu_name = attachment->getName();
  359. if (LLTrans::getString(sub_piemenu_name) != "")
  360. {
  361. item_params.label = LLTrans::getString(sub_piemenu_name);
  362. }
  363. else
  364. {
  365. item_params.label = sub_piemenu_name;
  366. }
  367. item_params.name =(item_params.label );
  368. item_params.on_click.function_name = "Object.AttachToAvatar";
  369. item_params.on_click.parameter = iter->first;
  370. item_params.on_enable.function_name = "Object.EnableWear";
  371. item_params.on_enable.parameter = iter->first;
  372. //* TODO: Skinning:
  373. //LLSD params;
  374. //params["index"] = iter->first;
  375. //params["label"] = attachment->getName();
  376. //item->addEventHandler("on_enable", LLMenuItemCallGL::MenuCallback().function_name("Attachment.Label").parameter(params));
  377. LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
  378. gAttachSubMenu->addChild(item);
  379. item_params.on_click.function_name = "Attachment.DetachFromPoint";
  380. item_params.on_click.parameter = iter->first;
  381. item_params.on_enable.function_name = "Attachment.PointFilled";
  382. item_params.on_enable.parameter = iter->first;
  383. //* TODO: Skinning: item->addEventHandler("on_enable", LLMenuItemCallGL::MenuCallback().function_name("Attachment.Label").parameter(params));
  384. item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
  385. gDetachSubMenu->addChild(item);
  386. }
  387. if (pass == 0)
  388. {
  389. // put separator between non-hud and hud attachments
  390. gAttachSubMenu->addSeparator();
  391. gDetachSubMenu->addSeparator();
  392. }
  393. }
  394. for (S32 group = 0; group < 8; group++)
  395. {
  396. // skip over groups that don't have sub menus
  397. if (!gAttachBodyPartPieMenus[group] || !gDetachBodyPartPieMenus[group])
  398. {
  399. continue;
  400. }
  401. std::multimap<S32, S32> attachment_pie_menu_map;
  402. // gather up all attachment points assigned to this group, and throw into map sorted by pie slice number
  403. for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
  404.  iter != mAttachmentPoints.end();
  405.  ++iter)
  406. {
  407. LLViewerJointAttachment* attachment = iter->second;
  408. if(attachment->getGroup() == group)
  409. {
  410. // use multimap to provide a partial order off of the pie slice key
  411. S32 pie_index = attachment->getPieSlice();
  412. attachment_pie_menu_map.insert(std::make_pair(pie_index, iter->first));
  413. }
  414. }
  415. // add in requested order to pie menu, inserting separators as necessary
  416. for (std::multimap<S32, S32>::iterator attach_it = attachment_pie_menu_map.begin();
  417.  attach_it != attachment_pie_menu_map.end(); ++attach_it)
  418. {
  419. S32 attach_index = attach_it->second;
  420. LLViewerJointAttachment* attachment = get_if_there(mAttachmentPoints, attach_index, (LLViewerJointAttachment*)NULL);
  421. if (attachment)
  422. {
  423. LLMenuItemCallGL::Params item_params;
  424. item_params.name = attachment->getName();
  425. item_params.label = attachment->getName();
  426. item_params.on_click.function_name = "Object.AttachToAvatar";
  427. item_params.on_click.parameter = attach_index;
  428. item_params.on_enable.function_name = "Object.EnableWear";
  429. item_params.on_enable.parameter = attach_index;
  430. LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
  431. gAttachBodyPartPieMenus[group]->addChild(item);
  432. item_params.on_click.function_name = "Attachment.DetachFromPoint";
  433. item_params.on_click.parameter = attach_index;
  434. item_params.on_enable.function_name = "Attachment.PointFilled";
  435. item_params.on_enable.parameter = attach_index;
  436. item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
  437. gDetachBodyPartPieMenus[group]->addChild(item);
  438. }
  439. }
  440. }
  441. return TRUE;
  442. }
  443. LLVOAvatarSelf::~LLVOAvatarSelf()
  444. {
  445. // gAgents pointer might have been set to a different Avatar Self, don't get rid of it if so.
  446. if (gAgent.getAvatarObject() == this)
  447. {
  448. gAgent.setAvatarObject(NULL);
  449. gAgentWearables.setAvatarObject(NULL);
  450. }
  451. delete mScreenp;
  452. mScreenp = NULL;
  453. }
  454. /**
  455.  **
  456.  ** End LLVOAvatarSelf Constructor routines
  457.  **                                                                             **
  458.  *********************************************************************************/
  459. //virtual
  460. BOOL LLVOAvatarSelf::loadLayersets()
  461. {
  462. BOOL success = TRUE;
  463. for (LLVOAvatarXmlInfo::layer_info_list_t::const_iterator iter = sAvatarXmlInfo->mLayerInfoList.begin();
  464.  iter != sAvatarXmlInfo->mLayerInfoList.end(); 
  465.  ++iter)
  466. {
  467. // Construct a layerset for each one specified in avatar_lad.xml and initialize it as such.
  468. const LLTexLayerSetInfo *info = *iter;
  469. LLTexLayerSet* layer_set = new LLTexLayerSet( this );
  470. if (!layer_set->setInfo(info))
  471. {
  472. stop_glerror();
  473. delete layer_set;
  474. llwarns << "avatar file: layer_set->parseData() failed" << llendl;
  475. return FALSE;
  476. }
  477. // scan baked textures and associate the layerset with the appropriate one
  478. EBakedTextureIndex baked_index = BAKED_NUM_INDICES;
  479. for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
  480.  baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
  481.  ++baked_iter)
  482. {
  483. const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second;
  484. if (layer_set->isBodyRegion(baked_dict->mName))
  485. {
  486. baked_index = baked_iter->first;
  487. // ensure both structures are aware of each other
  488. mBakedTextureDatas[baked_index].mTexLayerSet = layer_set;
  489. layer_set->setBakedTexIndex(baked_index);
  490. break;
  491. }
  492. }
  493. // if no baked texture was found, warn and cleanup
  494. if (baked_index == BAKED_NUM_INDICES)
  495. {
  496. llwarns << "<layer_set> has invalid body_region attribute" << llendl;
  497. delete layer_set;
  498. return FALSE;
  499. }
  500. // scan morph masks and let any affected layers know they have an associated morph
  501. for (LLVOAvatar::morph_list_t::const_iterator morph_iter = mBakedTextureDatas[baked_index].mMaskedMorphs.begin();
  502. morph_iter != mBakedTextureDatas[baked_index].mMaskedMorphs.end();
  503.  ++morph_iter)
  504. {
  505. LLMaskedMorph *morph = *morph_iter;
  506. LLTexLayerInterface* layer = layer_set->findLayerByName(morph->mLayer);
  507. if (layer)
  508. {
  509. layer->setHasMorph(TRUE);
  510. }
  511. else
  512. {
  513. llwarns << "Could not find layer named " << morph->mLayer << " to set morph flag" << llendl;
  514. success = FALSE;
  515. }
  516. }
  517. }
  518. return success;
  519. }
  520. // virtual
  521. BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent)
  522. {
  523. LLMemType mt(LLMemType::MTYPE_AVATAR);
  524. // update screen joint size
  525. if (mScreenp)
  526. {
  527. F32 aspect = LLViewerCamera::getInstance()->getAspect();
  528. LLVector3 scale(1.f, aspect, 1.f);
  529. mScreenp->setScale(scale);
  530. mScreenp->updateWorldMatrixChildren();
  531. resetHUDAttachments();
  532. }
  533. return LLVOAvatar::updateCharacter(agent);
  534. }
  535. // virtual
  536. LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)
  537. {
  538. if (mScreenp)
  539. {
  540. LLJoint* jointp = mScreenp->findJoint(name);
  541. if (jointp) return jointp;
  542. }
  543. return LLVOAvatar::getJoint(name);
  544. }
  545. /*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake )
  546. {
  547. if (!which_param)
  548. {
  549. return FALSE;
  550. }
  551. LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(which_param->getID());
  552. return setParamWeight(param,weight,upload_bake);
  553. }
  554. /*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake )
  555. {
  556. if (!param_name)
  557. {
  558. return FALSE;
  559. }
  560. LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(param_name);
  561. return setParamWeight(param,weight,upload_bake);
  562. }
  563. /*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake )
  564. {
  565. LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(index);
  566. return setParamWeight(param,weight,upload_bake);
  567. }
  568. BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL upload_bake )
  569. {
  570. if (!param)
  571. {
  572. return FALSE;
  573. }
  574. if (param->getCrossWearable())
  575. {
  576. EWearableType type = (EWearableType)param->getWearableType();
  577. U32 size = gAgentWearables.getWearableCount(type);
  578. for (U32 count = 0; count < size; ++count)
  579. {
  580. LLWearable *wearable = gAgentWearables.getWearable(type,count);
  581. if (wearable)
  582. {
  583. wearable->setVisualParamWeight(param->getID(), weight, upload_bake);
  584. }
  585. }
  586. }
  587. return LLCharacter::setVisualParamWeight(param,weight,upload_bake);
  588. }
  589. /*virtual*/ 
  590. void LLVOAvatarSelf::updateVisualParams()
  591. {
  592. for (U32 type = 0; type < WT_COUNT; type++)
  593. {
  594. LLWearable *wearable = gAgentWearables.getTopWearable((EWearableType)type);
  595. if (wearable)
  596. {
  597. wearable->writeToAvatar();
  598. }
  599. }
  600. LLVOAvatar::updateVisualParams();
  601. }
  602. /*virtual*/
  603. void LLVOAvatarSelf::idleUpdateAppearanceAnimation()
  604. {
  605. // Animate all top-level wearable visual parameters
  606. gAgentWearables.animateAllWearableParams(calcMorphAmount(), FALSE);
  607. // apply wearable visual params to avatar
  608. updateVisualParams();
  609. //allow avatar to process updates
  610. LLVOAvatar::idleUpdateAppearanceAnimation();
  611. }
  612. // virtual
  613. void LLVOAvatarSelf::requestStopMotion(LLMotion* motion)
  614. {
  615. // Only agent avatars should handle the stop motion notifications.
  616. // Notify agent that motion has stopped
  617. gAgent.requestStopMotion(motion);
  618. }
  619. // virtual
  620. void LLVOAvatarSelf::stopMotionFromSource(const LLUUID& source_id)
  621. {
  622. for (AnimSourceIterator motion_it = mAnimationSources.find(source_id); motion_it != mAnimationSources.end(); )
  623. {
  624. gAgent.sendAnimationRequest(motion_it->second, ANIM_REQUEST_STOP);
  625. mAnimationSources.erase(motion_it++);
  626. }
  627. LLViewerObject* object = gObjectList.findObject(source_id);
  628. if (object)
  629. {
  630. object->mFlags &= ~FLAGS_ANIM_SOURCE;
  631. }
  632. }
  633. void LLVOAvatarSelf::setLocalTextureTE(U8 te, LLViewerTexture* image, U32 index)
  634. {
  635. if (te >= TEX_NUM_INDICES)
  636. {
  637. llassert(0);
  638. return;
  639. }
  640. if (getTEImage(te)->getID() == image->getID())
  641. {
  642. return;
  643. }
  644. if (isIndexBakedTexture((ETextureIndex)te))
  645. {
  646. llassert(0);
  647. return;
  648. }
  649. setTEImage(te, image);
  650. }
  651. //virtual
  652. void LLVOAvatarSelf::removeMissingBakedTextures()
  653. {
  654. BOOL removed = FALSE;
  655. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  656. {
  657. const S32 te = mBakedTextureDatas[i].mTextureIndex;
  658. LLViewerTexture* tex = getTEImage(te) ;
  659. if (!tex || tex->isMissingAsset())
  660. {
  661. setTEImage(te, LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR));
  662. removed = TRUE;
  663. }
  664. }
  665. if (removed)
  666. {
  667. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  668. {
  669. invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, FALSE);
  670. }
  671. updateMeshTextures();
  672. requestLayerSetUploads();
  673. }
  674. }
  675. //virtual
  676. void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp)
  677. {
  678. if (regionp->getHandle() != mLastRegionHandle)
  679. {
  680. if (mLastRegionHandle != 0)
  681. {
  682. ++mRegionCrossingCount;
  683. F64 delta = (F64)mRegionCrossingTimer.getElapsedTimeF32();
  684. F64 avg = (mRegionCrossingCount == 1) ? 0 : LLViewerStats::getInstance()->getStat(LLViewerStats::ST_CROSSING_AVG);
  685. F64 delta_avg = (delta + avg*(mRegionCrossingCount-1)) / mRegionCrossingCount;
  686. LLViewerStats::getInstance()->setStat(LLViewerStats::ST_CROSSING_AVG, delta_avg);
  687. F64 max = (mRegionCrossingCount == 1) ? 0 : LLViewerStats::getInstance()->getStat(LLViewerStats::ST_CROSSING_MAX);
  688. max = llmax(delta, max);
  689. LLViewerStats::getInstance()->setStat(LLViewerStats::ST_CROSSING_MAX, max);
  690. }
  691. mLastRegionHandle = regionp->getHandle();
  692. }
  693. mRegionCrossingTimer.reset();
  694. }
  695. //--------------------------------------------------------------------
  696. // draw tractor beam when editing objects
  697. //--------------------------------------------------------------------
  698. //virtual
  699. void LLVOAvatarSelf::idleUpdateTractorBeam()
  700. {
  701. // This is only done for yourself (maybe it should be in the agent?)
  702. if (!needsRenderBeam() || !mIsBuilt)
  703. {
  704. mBeam = NULL;
  705. }
  706. else if (!mBeam || mBeam->isDead())
  707. {
  708. // VEFFECT: Tractor Beam
  709. mBeam = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM);
  710. mBeam->setColor(LLColor4U(gAgent.getEffectColor()));
  711. mBeam->setSourceObject(this);
  712. mBeamTimer.reset();
  713. }
  714. if (!mBeam.isNull())
  715. {
  716. LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
  717. if (gAgent.mPointAt.notNull())
  718. {
  719. // get point from pointat effect
  720. mBeam->setPositionGlobal(gAgent.mPointAt->getPointAtPosGlobal());
  721. mBeam->triggerLocal();
  722. }
  723. else if (selection->getFirstRootObject() && 
  724. selection->getSelectType() != SELECT_TYPE_HUD)
  725. {
  726. LLViewerObject* objectp = selection->getFirstRootObject();
  727. mBeam->setTargetObject(objectp);
  728. }
  729. else
  730. {
  731. mBeam->setTargetObject(NULL);
  732. LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
  733. if (tool->isEditing())
  734. {
  735. if (tool->getEditingObject())
  736. {
  737. mBeam->setTargetObject(tool->getEditingObject());
  738. }
  739. else
  740. {
  741. mBeam->setPositionGlobal(tool->getEditingPointGlobal());
  742. }
  743. }
  744. else
  745. {
  746. const LLPickInfo& pick = gViewerWindow->getLastPick();
  747. mBeam->setPositionGlobal(pick.mPosGlobal);
  748. }
  749. }
  750. if (mBeamTimer.getElapsedTimeF32() > 0.25f)
  751. {
  752. mBeam->setColor(LLColor4U(gAgent.getEffectColor()));
  753. mBeam->setNeedsSendToSim(TRUE);
  754. mBeamTimer.reset();
  755. }
  756. }
  757. }
  758. //-----------------------------------------------------------------------------
  759. // restoreMeshData()
  760. //-----------------------------------------------------------------------------
  761. // virtual
  762. void LLVOAvatarSelf::restoreMeshData()
  763. {
  764. LLMemType mt(LLMemType::MTYPE_AVATAR);
  765. //llinfos << "Restoring" << llendl;
  766. mMeshValid = TRUE;
  767. updateJointLODs();
  768. updateAttachmentVisibility(gAgent.getCameraMode());
  769. // force mesh update as LOD might not have changed to trigger this
  770. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE);
  771. }
  772. //-----------------------------------------------------------------------------
  773. // updateAttachmentVisibility()
  774. //-----------------------------------------------------------------------------
  775. void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode)
  776. {
  777. for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); 
  778.  iter != mAttachmentPoints.end();
  779.  ++iter)
  780. {
  781. LLViewerJointAttachment* attachment = iter->second;
  782. if (attachment->getIsHUDAttachment())
  783. {
  784. attachment->setAttachmentVisibility(TRUE);
  785. }
  786. else
  787. {
  788. switch (camera_mode)
  789. {
  790. case CAMERA_MODE_MOUSELOOK:
  791. if (LLVOAvatar::sVisibleInFirstPerson && attachment->getVisibleInFirstPerson())
  792. {
  793. attachment->setAttachmentVisibility(TRUE);
  794. }
  795. else
  796. {
  797. attachment->setAttachmentVisibility(FALSE);
  798. }
  799. break;
  800. default:
  801. attachment->setAttachmentVisibility(TRUE);
  802. break;
  803. }
  804. }
  805. }
  806. }
  807. /*virtual*/ BOOL LLVOAvatarSelf::isWearingWearableType(EWearableType type ) const
  808. {
  809. return gAgentWearables.getWearableCount(type) > 0;
  810. }
  811. //-----------------------------------------------------------------------------
  812. // updatedWearable( EWearableType type )
  813. // forces an update to any baked textures relevant to type.
  814. // will force an upload of the resulting bake if the second parameter is TRUE
  815. //-----------------------------------------------------------------------------
  816. void LLVOAvatarSelf::wearableUpdated( EWearableType type, BOOL upload_result )
  817. {
  818. for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
  819.  baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
  820.  ++baked_iter)
  821. {
  822. const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second;
  823. const LLVOAvatarDefines::EBakedTextureIndex index = baked_iter->first;
  824. // if we're editing our appearance, ensure that we're not using baked textures
  825. // The baked texture for alpha masks is set explicitly when you hit "save"
  826. if (gAgent.cameraCustomizeAvatar())
  827. {
  828. setNewBakedTexture(index,IMG_DEFAULT_AVATAR);
  829. }
  830. if (baked_dict)
  831. {
  832. for (LLVOAvatarDefines::wearables_vec_t::const_iterator type_iter = baked_dict->mWearables.begin();
  833. type_iter != baked_dict->mWearables.end();
  834.  ++type_iter)
  835. {
  836. const EWearableType comp_type = *type_iter;
  837. if (comp_type == type)
  838. {
  839. if (mBakedTextureDatas[index].mTexLayerSet)
  840. {
  841. invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, upload_result);
  842. }
  843. break;
  844. }
  845. }
  846. }
  847. }
  848. }
  849. //-----------------------------------------------------------------------------
  850. // isWearingAttachment()
  851. //-----------------------------------------------------------------------------
  852. BOOL LLVOAvatarSelf::isWearingAttachment(const LLUUID& inv_item_id) const
  853. {
  854. const LLUUID& base_inv_item_id = gInventory.getLinkedItemID(inv_item_id);
  855. for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); 
  856.  iter != mAttachmentPoints.end();
  857.  ++iter)
  858. {
  859. const LLViewerJointAttachment* attachment = iter->second;
  860. if (attachment->getAttachedObject(base_inv_item_id))
  861. {
  862. return TRUE;
  863. }
  864. }
  865. return FALSE;
  866. }
  867. //-----------------------------------------------------------------------------
  868. // getWornAttachment()
  869. //-----------------------------------------------------------------------------
  870. LLViewerObject* LLVOAvatarSelf::getWornAttachment(const LLUUID& inv_item_id)
  871. {
  872. const LLUUID& base_inv_item_id = gInventory.getLinkedItemID(inv_item_id);
  873. for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); 
  874.  iter != mAttachmentPoints.end();
  875.  ++iter)
  876. {
  877. LLViewerJointAttachment* attachment = iter->second;
  878.   if (LLViewerObject *attached_object = attachment->getAttachedObject(base_inv_item_id))
  879. {
  880. return attached_object;
  881. }
  882. }
  883. return NULL;
  884. }
  885. const std::string LLVOAvatarSelf::getAttachedPointName(const LLUUID& inv_item_id) const
  886. {
  887. const LLUUID& base_inv_item_id = gInventory.getLinkedItemID(inv_item_id);
  888. for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); 
  889.  iter != mAttachmentPoints.end(); 
  890.  ++iter)
  891. {
  892. const LLViewerJointAttachment* attachment = iter->second;
  893. if (attachment->getAttachedObject(base_inv_item_id))
  894. {
  895. return attachment->getName();
  896. }
  897. }
  898. return LLStringUtil::null;
  899. }
  900. //virtual
  901. const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *viewer_object)
  902. {
  903. const LLViewerJointAttachment *attachment = LLVOAvatar::attachObject(viewer_object);
  904. if (!attachment)
  905. {
  906. return 0;
  907. }
  908. updateAttachmentVisibility(gAgent.getCameraMode());
  909. // Then make sure the inventory is in sync with the avatar.
  910. // Should just be the last object added
  911. if (attachment->isObjectAttached(viewer_object))
  912. {
  913. const LLUUID& attachment_id = viewer_object->getItemID();
  914. LLAppearanceManager::instance().registerAttachment(attachment_id);
  915. }
  916. return attachment;
  917. }
  918. //virtual
  919. BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)
  920. {
  921. const LLUUID attachment_id = viewer_object->getItemID();
  922. if (LLVOAvatar::detachObject(viewer_object))
  923. {
  924. // the simulator should automatically handle permission revocation
  925. stopMotionFromSource(attachment_id);
  926. LLFollowCamMgr::setCameraActive(viewer_object->getID(), FALSE);
  927. LLViewerObject::const_child_list_t& child_list = viewer_object->getChildren();
  928. for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
  929.  iter != child_list.end(); 
  930.  ++iter)
  931. {
  932. LLViewerObject* child_objectp = *iter;
  933. // the simulator should automatically handle
  934. // permissions revocation
  935. stopMotionFromSource(child_objectp->getID());
  936. LLFollowCamMgr::setCameraActive(child_objectp->getID(), FALSE);
  937. }
  938. // Make sure the inventory is in sync with the avatar.
  939. // Update COF contents, don't trigger appearance update.
  940. if (gAgent.getAvatarObject() == NULL)
  941. {
  942. llinfos << "removeItemLinks skipped, avatar is under destruction" << llendl;
  943. }
  944. else
  945. {
  946. LLAppearanceManager::instance().unregisterAttachment(attachment_id);
  947. }
  948. return TRUE;
  949. }
  950. return FALSE;
  951. }
  952. U32 LLVOAvatarSelf::getNumWearables(LLVOAvatarDefines::ETextureIndex i) const
  953. {
  954. EWearableType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i);
  955. return gAgentWearables.getWearableCount(type);
  956. }
  957. // virtual
  958. void LLVOAvatarSelf::localTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src_raw, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata)
  959. {
  960. //llinfos << "onLocalTextureLoaded: " << src_vi->getID() << llendl;
  961. const LLUUID& src_id = src_vi->getID();
  962. LLAvatarTexData *data = (LLAvatarTexData *)userdata;
  963. ETextureIndex index = data->mIndex;
  964. if (!isIndexLocalTexture(index)) return;
  965. LLLocalTextureObject *local_tex_obj = getLocalTextureObject(index, 0);
  966. // fix for EXT-268. Preventing using of NULL pointer
  967. if(NULL == local_tex_obj)
  968. {
  969. LL_WARNS("TAG") << "There is no Local Texture Object with index: " << index 
  970. << ", final: " << final
  971. << LL_ENDL;
  972. return;
  973. }
  974. if (success)
  975. {
  976. if (!local_tex_obj->getBakedReady() &&
  977. local_tex_obj->getImage() != NULL &&
  978. (local_tex_obj->getID() == src_id) &&
  979. discard_level < local_tex_obj->getDiscard())
  980. {
  981. local_tex_obj->setDiscard(discard_level);
  982. if (!gAgent.cameraCustomizeAvatar())
  983. {
  984. requestLayerSetUpdate(index);
  985. }
  986. else if (gAgent.cameraCustomizeAvatar())
  987. {
  988. LLVisualParamHint::requestHintUpdates();
  989. }
  990. updateMeshTextures();
  991. }
  992. }
  993. else if (final)
  994. {
  995. // Failed: asset is missing
  996. if (!local_tex_obj->getBakedReady() &&
  997. local_tex_obj->getImage() != NULL &&
  998. local_tex_obj->getImage()->getID() == src_id)
  999. {
  1000. local_tex_obj->setDiscard(0);
  1001. requestLayerSetUpdate(index);
  1002. updateMeshTextures();
  1003. }
  1004. }
  1005. }
  1006. // virtual
  1007. BOOL LLVOAvatarSelf::getLocalTextureGL(ETextureIndex type, LLViewerTexture** tex_pp, U32 index) const
  1008. {
  1009. *tex_pp = NULL;
  1010. if (!isIndexLocalTexture(type)) return FALSE;
  1011. if (getLocalTextureID(type, index) == IMG_DEFAULT_AVATAR) return TRUE;
  1012. const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type, index);
  1013. if (!local_tex_obj)
  1014. {
  1015. return FALSE;
  1016. }
  1017. *tex_pp = local_tex_obj->getImage();
  1018. return TRUE;
  1019. }
  1020. LLViewerFetchedTexture* LLVOAvatarSelf::getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, U32 index) const
  1021. {
  1022. if (!isIndexLocalTexture(type))
  1023. {
  1024. return NULL;
  1025. }
  1026. const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type, index);
  1027. if (!local_tex_obj)
  1028. {
  1029. return NULL;
  1030. }
  1031. if (local_tex_obj->getID() == IMG_DEFAULT_AVATAR)
  1032. {
  1033. return LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR);
  1034. }
  1035. return local_tex_obj->getImage();
  1036. }
  1037. const LLUUID& LLVOAvatarSelf::getLocalTextureID(ETextureIndex type, U32 index) const
  1038. {
  1039. if (!isIndexLocalTexture(type)) return IMG_DEFAULT_AVATAR;
  1040. const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type, index);
  1041. if (local_tex_obj && local_tex_obj->getImage() != NULL)
  1042. {
  1043. return local_tex_obj->getImage()->getID();
  1044. }
  1045. return IMG_DEFAULT_AVATAR;
  1046. //-----------------------------------------------------------------------------
  1047. // isLocalTextureDataAvailable()
  1048. // Returns true if at least the lowest quality discard level exists for every texture
  1049. // in the layerset.
  1050. //-----------------------------------------------------------------------------
  1051. BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset) const
  1052. {
  1053. /* if (layerset == mBakedTextureDatas[BAKED_HEAD].mTexLayerSet)
  1054.    return getLocalDiscardLevel(TEX_HEAD_BODYPAINT) >= 0; */
  1055. for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
  1056.  baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
  1057.  ++baked_iter)
  1058. {
  1059. const EBakedTextureIndex baked_index = baked_iter->first;
  1060. if (layerset == mBakedTextureDatas[baked_index].mTexLayerSet)
  1061. {
  1062. BOOL ret = true;
  1063. const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second;
  1064. for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();
  1065.  local_tex_iter != baked_dict->mLocalTextures.end();
  1066.  ++local_tex_iter)
  1067. {
  1068. const ETextureIndex tex_index = *local_tex_iter;
  1069. const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index);
  1070. const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);
  1071. for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)
  1072. {
  1073. ret &= (getLocalDiscardLevel(tex_index, wearable_index) >= 0);
  1074. }
  1075. }
  1076. return ret;
  1077. }
  1078. }
  1079. llassert(0);
  1080. return FALSE;
  1081. }
  1082. //-----------------------------------------------------------------------------
  1083. // virtual
  1084. // isLocalTextureDataFinal()
  1085. // Returns true if the highest quality discard level exists for every texture
  1086. // in the layerset.
  1087. //-----------------------------------------------------------------------------
  1088. BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) const
  1089. {
  1090. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  1091. {
  1092. if (layerset == mBakedTextureDatas[i].mTexLayerSet)
  1093. {
  1094. const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i);
  1095. for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();
  1096.  local_tex_iter != baked_dict->mLocalTextures.end();
  1097.  ++local_tex_iter)
  1098. {
  1099. const ETextureIndex tex_index = *local_tex_iter;
  1100. const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index);
  1101. const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);
  1102. for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)
  1103. {
  1104. if (getLocalDiscardLevel(*local_tex_iter, wearable_index) != 0)
  1105. {
  1106. return FALSE;
  1107. }
  1108. }
  1109. }
  1110. return TRUE;
  1111. }
  1112. }
  1113. llassert(0);
  1114. return FALSE;
  1115. }
  1116. BOOL LLVOAvatarSelf::isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index) const
  1117. {
  1118. LLUUID id;
  1119. BOOL isDefined = TRUE;
  1120. if (isIndexLocalTexture(type))
  1121. {
  1122. const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType(type);
  1123. const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);
  1124. if (index >= wearable_count)
  1125. {
  1126. // invalid index passed in. check all textures of a given type
  1127. for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)
  1128. {
  1129. id = getLocalTextureID(type, wearable_index);
  1130. isDefined &= (id != IMG_DEFAULT_AVATAR && id != IMG_DEFAULT);
  1131. }
  1132. }
  1133. else
  1134. {
  1135. id = getLocalTextureID(type, index);
  1136. isDefined &= (id != IMG_DEFAULT_AVATAR && id != IMG_DEFAULT);
  1137. }
  1138. }
  1139. else
  1140. {
  1141. id = getTEImage(type)->getID();
  1142. isDefined &= (id != IMG_DEFAULT_AVATAR && id != IMG_DEFAULT);
  1143. }
  1144. return isDefined;
  1145. }
  1146. //-----------------------------------------------------------------------------
  1147. // virtual
  1148. // requestLayerSetUploads()
  1149. //-----------------------------------------------------------------------------
  1150. void LLVOAvatarSelf::requestLayerSetUploads()
  1151. {
  1152. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  1153. {
  1154. ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex;
  1155. BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index));
  1156. if (!layer_baked && mBakedTextureDatas[i].mTexLayerSet)
  1157. {
  1158. mBakedTextureDatas[i].mTexLayerSet->requestUpload();
  1159. }
  1160. }
  1161. }
  1162. bool LLVOAvatarSelf::areTexturesCurrent() const
  1163. {
  1164. return !hasPendingBakedUploads() && gAgentWearables.areWearablesLoaded();
  1165. }
  1166. // virtual
  1167. bool LLVOAvatarSelf::hasPendingBakedUploads() const
  1168. {
  1169. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  1170. {
  1171. BOOL upload_pending = (mBakedTextureDatas[i].mTexLayerSet && mBakedTextureDatas[i].mTexLayerSet->getComposite()->uploadPending());
  1172. if (upload_pending)
  1173. {
  1174. return true;
  1175. }
  1176. }
  1177. return false;
  1178. }
  1179. void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_result )
  1180. {
  1181. if( !layerset || !layerset->getUpdatesEnabled() )
  1182. {
  1183. return;
  1184. }
  1185. // llinfos << "LLVOAvatar::invalidComposite() " << layerset->getBodyRegion() << llendl;
  1186. layerset->requestUpdate();
  1187. layerset->invalidateMorphMasks();
  1188. if( upload_result )
  1189. {
  1190. llassert(isSelf());
  1191. ETextureIndex baked_te = getBakedTE( layerset );
  1192. setTEImage( baked_te, LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR) );
  1193. layerset->requestUpload();
  1194. updateMeshTextures();
  1195. }
  1196. }
  1197. void LLVOAvatarSelf::invalidateAll()
  1198. {
  1199. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  1200. {
  1201. invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, TRUE);
  1202. }
  1203. }
  1204. //-----------------------------------------------------------------------------
  1205. // setCompositeUpdatesEnabled()
  1206. //-----------------------------------------------------------------------------
  1207. void LLVOAvatarSelf::setCompositeUpdatesEnabled( BOOL b )
  1208. {
  1209. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  1210. {
  1211. if (mBakedTextureDatas[i].mTexLayerSet )
  1212. {
  1213. mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled( b );
  1214. }
  1215. }
  1216. }
  1217. void LLVOAvatarSelf::setupComposites()
  1218. {
  1219. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  1220. {
  1221. ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex;
  1222. BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index));
  1223. if (mBakedTextureDatas[i].mTexLayerSet)
  1224. {
  1225. mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(!layer_baked);
  1226. }
  1227. }
  1228. }
  1229. void LLVOAvatarSelf::updateComposites()
  1230. {
  1231. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  1232. {
  1233. if (mBakedTextureDatas[i].mTexLayerSet 
  1234. && ((i != BAKED_SKIRT) || isWearingWearableType(WT_SKIRT)))
  1235. {
  1236. mBakedTextureDatas[i].mTexLayerSet->updateComposite();
  1237. }
  1238. }
  1239. }
  1240. // virtual
  1241. S32 LLVOAvatarSelf::getLocalDiscardLevel(ETextureIndex type, U32 wearable_index) const
  1242. {
  1243. if (!isIndexLocalTexture(type)) return FALSE;
  1244. const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type, wearable_index);
  1245. if (local_tex_obj)
  1246. {
  1247. if (type >= 0
  1248. && local_tex_obj->getID() != IMG_DEFAULT_AVATAR
  1249. && !local_tex_obj->getImage()->isMissingAsset())
  1250. {
  1251. return local_tex_obj->getImage()->getDiscardLevel();
  1252. }
  1253. else
  1254. {
  1255. // We don't care about this (no image associated with the layer) treat as fully loaded.
  1256. return 0;
  1257. }
  1258. }
  1259. return 0;
  1260. }
  1261. // virtual
  1262. // Counts the memory footprint of local textures.
  1263. void LLVOAvatarSelf::getLocalTextureByteCount(S32* gl_bytes) const
  1264. {
  1265. *gl_bytes = 0;
  1266. for (S32 type = 0; type < TEX_NUM_INDICES; type++)
  1267. {
  1268. if (!isIndexLocalTexture((ETextureIndex)type)) continue;
  1269. U32 max_tex = getNumWearables((ETextureIndex) type);
  1270. for (U32 num = 0; num < max_tex; num++)
  1271. {
  1272. const LLLocalTextureObject *local_tex_obj = getLocalTextureObject((ETextureIndex) type, num);
  1273. if (local_tex_obj)
  1274. {
  1275. const LLViewerFetchedTexture* image_gl = local_tex_obj->getImage();
  1276. if (image_gl)
  1277. {
  1278. S32 bytes = (S32)image_gl->getWidth() * image_gl->getHeight() * image_gl->getComponents();
  1279. if (image_gl->hasGLTexture())
  1280. {
  1281. *gl_bytes += bytes;
  1282. }
  1283. }
  1284. }
  1285. }
  1286. }
  1287. }
  1288. // virtual 
  1289. void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_tex, BOOL baked_version_ready, U32 index)
  1290. {
  1291. if (!isIndexLocalTexture(type)) return;
  1292. LLViewerFetchedTexture* tex = LLViewerTextureManager::staticCastToFetchedTexture(src_tex, TRUE) ;
  1293. if(!tex)
  1294. {
  1295. return ;
  1296. }
  1297. S32 desired_discard = isSelf() ? 0 : 2;
  1298. LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type,index);
  1299. if (!local_tex_obj)
  1300. {
  1301. if (type >= TEX_NUM_INDICES)
  1302. {
  1303. llerrs << "Tried to set local texture with invalid type: (" << (U32) type << ", " << index << ")" << llendl;
  1304. return;
  1305. }
  1306. EWearableType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType(type);
  1307. if (!gAgentWearables.getWearable(wearable_type,index))
  1308. {
  1309. // no wearable is loaded, cannot set the texture.
  1310. return;
  1311. }
  1312. gAgentWearables.addLocalTextureObject(wearable_type,type,index);
  1313. local_tex_obj = getLocalTextureObject(type,index);
  1314. if (!local_tex_obj)
  1315. {
  1316. llerrs << "Unable to create LocalTextureObject for wearable type & index: (" << (U32) wearable_type << ", " << index << ")" << llendl;
  1317. return;
  1318. }
  1319. LLTexLayerSet *layer_set = getLayerSet(type);
  1320. if (layer_set)
  1321. {
  1322. layer_set->cloneTemplates(local_tex_obj, type, gAgentWearables.getWearable(wearable_type,index));
  1323. }
  1324. }
  1325. if (!baked_version_ready)
  1326. {
  1327. if (tex != local_tex_obj->getImage() || local_tex_obj->getBakedReady())
  1328. {
  1329. local_tex_obj->setDiscard(MAX_DISCARD_LEVEL+1);
  1330. }
  1331. if (tex->getID() != IMG_DEFAULT_AVATAR)
  1332. {
  1333. if (local_tex_obj->getDiscard() > desired_discard)
  1334. {
  1335. S32 tex_discard = tex->getDiscardLevel();
  1336. if (tex_discard >= 0 && tex_discard <= desired_discard)
  1337. {
  1338. local_tex_obj->setDiscard(tex_discard);
  1339. if (isSelf() && !gAgent.cameraCustomizeAvatar())
  1340. {
  1341. requestLayerSetUpdate(type);
  1342. }
  1343. else if (isSelf() && gAgent.cameraCustomizeAvatar())
  1344. {
  1345. LLVisualParamHint::requestHintUpdates();
  1346. }
  1347. }
  1348. else
  1349. {
  1350. tex->setLoadedCallback(onLocalTextureLoaded, desired_discard, TRUE, FALSE, new LLAvatarTexData(getID(), type));
  1351. }
  1352. }
  1353. tex->setMinDiscardLevel(desired_discard);
  1354. }
  1355. }
  1356. local_tex_obj->setImage(tex);
  1357. local_tex_obj->setID(tex->getID());
  1358. setBakedReady(type,baked_version_ready,index);
  1359. }
  1360. //virtual
  1361. void LLVOAvatarSelf::setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index)
  1362. {
  1363. if (!isIndexLocalTexture(type)) return;
  1364. LLLocalTextureObject *local_tex_obj = getLocalTextureObject(type,index);
  1365. if (local_tex_obj)
  1366. {
  1367. local_tex_obj->setBakedReady( baked_version_exists );
  1368. }
  1369. }
  1370. // virtual
  1371. void LLVOAvatarSelf::dumpLocalTextures() const
  1372. {
  1373. llinfos << "Local Textures:" << llendl;
  1374. /* ETextureIndex baked_equiv[] = {
  1375.    TEX_UPPER_BAKED,
  1376.    if (isTextureDefined(baked_equiv[i])) */
  1377. for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
  1378.  iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
  1379.  ++iter)
  1380. {
  1381. const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
  1382. if (!texture_dict->mIsLocalTexture || !texture_dict->mIsUsedByBakedTexture)
  1383. continue;
  1384. const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
  1385. const ETextureIndex baked_equiv = LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index)->mTextureIndex;
  1386. const std::string &name = texture_dict->mName;
  1387. const LLLocalTextureObject *local_tex_obj = getLocalTextureObject(iter->first, 0);
  1388. // index is baked texture - index is not relevant. putting in 0 as placeholder
  1389. if (isTextureDefined(baked_equiv, 0))
  1390. {
  1391. #if LL_RELEASE_FOR_DOWNLOAD
  1392. // End users don't get to trivially see avatar texture IDs, makes textures
  1393. // easier to steal. JC
  1394. llinfos << "LocTex " << name << ": Baked " << llendl;
  1395. #else
  1396. llinfos << "LocTex " << name << ": Baked " << getTEImage(baked_equiv)->getID() << llendl;
  1397. #endif
  1398. }
  1399. else if (local_tex_obj && local_tex_obj->getImage() != NULL)
  1400. {
  1401. if (local_tex_obj->getImage()->getID() == IMG_DEFAULT_AVATAR)
  1402. {
  1403. llinfos << "LocTex " << name << ": None" << llendl;
  1404. }
  1405. else
  1406. {
  1407. const LLViewerFetchedTexture* image = local_tex_obj->getImage();
  1408. llinfos << "LocTex " << name << ": "
  1409. << "Discard " << image->getDiscardLevel() << ", "
  1410. << "(" << image->getWidth() << ", " << image->getHeight() << ") " 
  1411. #if !LL_RELEASE_FOR_DOWNLOAD
  1412. // End users don't get to trivially see avatar texture IDs,
  1413. // makes textures easier to steal
  1414. << image->getID() << " "
  1415. #endif
  1416. << "Priority: " << image->getDecodePriority()
  1417. << llendl;
  1418. }
  1419. }
  1420. else
  1421. {
  1422. llinfos << "LocTex " << name << ": No LLViewerTexture" << llendl;
  1423. }
  1424. }
  1425. }
  1426. //-----------------------------------------------------------------------------
  1427. // static 
  1428. // onLocalTextureLoaded()
  1429. //-----------------------------------------------------------------------------
  1430. void LLVOAvatarSelf::onLocalTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src_raw, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata)
  1431. {
  1432. LLAvatarTexData *data = (LLAvatarTexData *)userdata;
  1433. LLVOAvatarSelf *self = (LLVOAvatarSelf *)gObjectList.findObject(data->mAvatarID);
  1434. if (self)
  1435. {
  1436. // We should only be handling local textures for ourself
  1437. self->localTextureLoaded(success, src_vi, src_raw, aux_src, discard_level, final, userdata);
  1438. }
  1439. // ensure data is cleaned up
  1440. if (final || !success)
  1441. {
  1442. delete data;
  1443. }
  1444. }
  1445. /*virtual*/ void LLVOAvatarSelf::setImage(const U8 te, LLViewerTexture *imagep, const U32 index)
  1446. {
  1447. if (isIndexLocalTexture((ETextureIndex)te))
  1448. {
  1449. setLocalTexture((ETextureIndex)te, imagep, FALSE ,index);
  1450. }
  1451. else 
  1452. {
  1453. setTEImage(te,imagep);
  1454. }
  1455. }
  1456. /*virtual*/ LLViewerTexture* LLVOAvatarSelf::getImage(const U8 te, const U32 index) const
  1457. {
  1458. if (isIndexLocalTexture((ETextureIndex)te))
  1459. {
  1460. return getLocalTextureGL((ETextureIndex)te,index);
  1461. }
  1462. else 
  1463. {
  1464. return getTEImage(te);
  1465. }
  1466. }
  1467. // static
  1468. void LLVOAvatarSelf::dumpTotalLocalTextureByteCount()
  1469. {
  1470. S32 gl_bytes = 0;
  1471. gAgent.getAvatarObject()->getLocalTextureByteCount(&gl_bytes);
  1472. llinfos << "Total Avatar LocTex GL:" << (gl_bytes/1024) << "KB" << llendl;
  1473. }
  1474. BOOL LLVOAvatarSelf::updateIsFullyLoaded()
  1475. {
  1476. BOOL loading = FALSE;
  1477. // do we have a shape?
  1478. if (visualParamWeightsAreDefault())
  1479. {
  1480. loading = TRUE;
  1481. }
  1482. if (!isTextureDefined(TEX_HAIR, 0))
  1483. {
  1484. loading = TRUE;
  1485. }
  1486. if (!mPreviousFullyLoaded)
  1487. {
  1488. if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_LOWER].mTexLayerSet) &&
  1489. (!isTextureDefined(TEX_LOWER_BAKED, 0)))
  1490. {
  1491. loading = TRUE;
  1492. }
  1493. if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_UPPER].mTexLayerSet) &&
  1494. (!isTextureDefined(TEX_UPPER_BAKED, 0)))
  1495. {
  1496. loading = TRUE;
  1497. }
  1498. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  1499. {
  1500. if (i == BAKED_SKIRT && !isWearingWearableType(WT_SKIRT))
  1501. continue;
  1502. BakedTextureData& texture_data = mBakedTextureDatas[i];
  1503. if (!isTextureDefined(texture_data.mTextureIndex, 0))
  1504. continue;
  1505. // Check for the case that texture is defined but not sufficiently loaded to display anything.
  1506. LLViewerTexture* baked_img = getImage( texture_data.mTextureIndex, 0 );
  1507. if (!baked_img || !baked_img->hasGLTexture())
  1508. {
  1509. loading = TRUE;
  1510. }
  1511. }
  1512. }
  1513. return processFullyLoadedChange(loading);
  1514. }
  1515. const LLUUID& LLVOAvatarSelf::grabLocalTexture(ETextureIndex type, U32 index) const
  1516. {
  1517. if (canGrabLocalTexture(type, index))
  1518. {
  1519. return getTEImage( type )->getID();
  1520. }
  1521. return LLUUID::null;
  1522. }
  1523. BOOL LLVOAvatarSelf::canGrabLocalTexture(ETextureIndex type, U32 index) const
  1524. {
  1525. // Check if the texture hasn't been baked yet.
  1526. if (!isTextureDefined(type, index))
  1527. {
  1528. lldebugs << "getTEImage( " << (U32) type << ", " << index << " )->getID() == IMG_DEFAULT_AVATAR" << llendl;
  1529. return FALSE;
  1530. }
  1531. if (gAgent.isGodlike())
  1532. return TRUE;
  1533. // Check permissions of textures that show up in the
  1534. // baked texture.  We don't want people copying people's
  1535. // work via baked textures.
  1536. /* switch(type)
  1537. case TEX_EYES_BAKED:
  1538. textures.push_back(TEX_EYES_IRIS); */
  1539. const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(type);
  1540. if (!texture_dict->mIsUsedByBakedTexture) return FALSE;
  1541. const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
  1542. const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index);
  1543. for (texture_vec_t::const_iterator iter = baked_dict->mLocalTextures.begin();
  1544.  iter != baked_dict->mLocalTextures.end();
  1545.  ++iter)
  1546. {
  1547. const ETextureIndex t_index = (*iter);
  1548. lldebugs << "Checking index " << (U32) t_index << llendl;
  1549. // MULTI-WEARABLE: old method. replace.
  1550. const LLUUID& texture_id = getTEImage( t_index )->getID();
  1551. if (texture_id != IMG_DEFAULT_AVATAR)
  1552. {
  1553. // Search inventory for this texture.
  1554. LLViewerInventoryCategory::cat_array_t cats;
  1555. LLViewerInventoryItem::item_array_t items;
  1556. LLAssetIDMatches asset_id_matches(texture_id);
  1557. gInventory.collectDescendentsIf(LLUUID::null,
  1558. cats,
  1559. items,
  1560. LLInventoryModel::INCLUDE_TRASH,
  1561. asset_id_matches);
  1562. BOOL can_grab = FALSE;
  1563. lldebugs << "item count for asset " << texture_id << ": " << items.count() << llendl;
  1564. if (items.count())
  1565. {
  1566. // search for full permissions version
  1567. for (S32 i = 0; i < items.count(); i++)
  1568. {
  1569. LLInventoryItem* itemp = items[i];
  1570. LLPermissions item_permissions = itemp->getPermissions();
  1571. if ( item_permissions.allowOperationBy(
  1572. PERM_MODIFY, gAgent.getID(), gAgent.getGroupID()) &&
  1573.  item_permissions.allowOperationBy(
  1574. PERM_COPY, gAgent.getID(), gAgent.getGroupID()) &&
  1575.  item_permissions.allowOperationBy(
  1576. PERM_TRANSFER, gAgent.getID(), gAgent.getGroupID()) )
  1577. {
  1578. can_grab = TRUE;
  1579. break;
  1580. }
  1581. }
  1582. }
  1583. if (!can_grab) return FALSE;
  1584. }
  1585. }
  1586. return TRUE;
  1587. }
  1588. void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTexture* imagep,
  1589.    F32 texel_area_ratio, BOOL render_avatar, BOOL covered_by_baked, U32 index )
  1590. {
  1591. if (!isIndexLocalTexture(type)) return;
  1592. if (!covered_by_baked)
  1593. {
  1594. if (getLocalTextureID(type, index) != IMG_DEFAULT_AVATAR && imagep->getDiscardLevel() != 0)
  1595. {
  1596. F32 desired_pixels;
  1597. desired_pixels = llmin(mPixelArea, (F32)getTexImageArea());
  1598. imagep->setBoostLevel(getAvatarBoostLevel());
  1599. imagep->addTextureStats( desired_pixels / texel_area_ratio );
  1600. imagep->forceUpdateBindStats() ;
  1601. if (imagep->getDiscardLevel() < 0)
  1602. {
  1603. mHasGrey = TRUE; // for statistics gathering
  1604. }
  1605. }
  1606. else
  1607. {
  1608. // texture asset is missing
  1609. mHasGrey = TRUE; // for statistics gathering
  1610. }
  1611. }
  1612. }
  1613. LLLocalTextureObject* LLVOAvatarSelf::getLocalTextureObject(LLVOAvatarDefines::ETextureIndex i, U32 wearable_index) const
  1614. {
  1615. EWearableType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i);
  1616. LLWearable* wearable = gAgentWearables.getWearable(type, wearable_index);
  1617. if (wearable)
  1618. {
  1619. return wearable->getLocalTextureObject(i);
  1620. }
  1621. return NULL;
  1622. }
  1623. //-----------------------------------------------------------------------------
  1624. // getBakedTE()
  1625. // Used by the LayerSet.  (Layer sets don't in general know what textures depend on them.)
  1626. //-----------------------------------------------------------------------------
  1627. ETextureIndex LLVOAvatarSelf::getBakedTE( const LLTexLayerSet* layerset ) const
  1628. {
  1629. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  1630. {
  1631. if (layerset == mBakedTextureDatas[i].mTexLayerSet )
  1632. {
  1633. return mBakedTextureDatas[i].mTextureIndex;
  1634. }
  1635. }
  1636. llassert(0);
  1637. return TEX_HEAD_BAKED;
  1638. }
  1639. void LLVOAvatarSelf::setNewBakedTexture(LLVOAvatarDefines::EBakedTextureIndex i, const LLUUID &uuid)
  1640. {
  1641. ETextureIndex index = LLVOAvatarDictionary::bakedToLocalTextureIndex(i);
  1642. setNewBakedTexture(index, uuid);
  1643. }
  1644. //-----------------------------------------------------------------------------
  1645. // setNewBakedTexture()
  1646. // A new baked texture has been successfully uploaded and we can start using it now.
  1647. //-----------------------------------------------------------------------------
  1648. void LLVOAvatarSelf::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid )
  1649. {
  1650. // Baked textures live on other sims.
  1651. LLHost target_host = getObjectHost();
  1652. setTEImage( te, LLViewerTextureManager::getFetchedTextureFromHost( uuid, target_host ) );
  1653. updateMeshTextures();
  1654. dirtyMesh();
  1655. LLVOAvatar::cullAvatarsByPixelArea();
  1656. /* switch(te)
  1657. case TEX_HEAD_BAKED:
  1658. llinfos << "New baked texture: HEAD" << llendl; */
  1659. const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(te);
  1660. if (texture_dict->mIsBakedTexture)
  1661. {
  1662. llinfos << "New baked texture: " << texture_dict->mName << " UUID: " << uuid <<llendl;
  1663. }
  1664. else
  1665. {
  1666. llwarns << "New baked texture: unknown te " << te << llendl;
  1667. }
  1668. // dumpAvatarTEs( "setNewBakedTexture() send" );
  1669. // RN: throttle uploads
  1670. if (!hasPendingBakedUploads())
  1671. {
  1672. gAgent.sendAgentSetAppearance();
  1673. }
  1674. }
  1675. //-----------------------------------------------------------------------------
  1676. // setCachedBakedTexture()
  1677. // A baked texture id was received from a cache query, make it active
  1678. //-----------------------------------------------------------------------------
  1679. void LLVOAvatarSelf::setCachedBakedTexture( ETextureIndex te, const LLUUID& uuid )
  1680. {
  1681. setTETexture( te, uuid );
  1682. /* switch(te)
  1683. case TEX_HEAD_BAKED:
  1684. if( mHeadLayerSet )
  1685. mHeadLayerSet->cancelUpload(); */
  1686. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  1687. {
  1688. if ( mBakedTextureDatas[i].mTextureIndex == te && mBakedTextureDatas[i].mTexLayerSet)
  1689. {
  1690. mBakedTextureDatas[i].mTexLayerSet->cancelUpload();
  1691. }
  1692. }
  1693. }
  1694. // static
  1695. void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**)
  1696. {
  1697. LLUUID texture_id;
  1698. msg->getUUID("TextureData", "TextureID", texture_id);
  1699. LLVOAvatarSelf* self = gAgent.getAvatarObject();
  1700. if (!self) return;
  1701. // If this is a texture corresponding to one of our baked entries, 
  1702. // just rebake that layer set.
  1703. BOOL found = FALSE;
  1704. /* ETextureIndex baked_texture_indices[BAKED_NUM_INDICES] =
  1705. TEX_HEAD_BAKED,
  1706. TEX_UPPER_BAKED, */
  1707. for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
  1708.  iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
  1709.  ++iter)
  1710. {
  1711. const ETextureIndex index = iter->first;
  1712. const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
  1713. if (texture_dict->mIsBakedTexture)
  1714. {
  1715. if (texture_id == self->getTEImage(index)->getID())
  1716. {
  1717. LLTexLayerSet* layer_set = self->getLayerSet(index);
  1718. if (layer_set)
  1719. {
  1720. llinfos << "TAT: rebake - matched entry " << (S32)index << llendl;
  1721. self->invalidateComposite(layer_set, TRUE);
  1722. found = TRUE;
  1723. LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_REBAKES);
  1724. }
  1725. }
  1726. }
  1727. }
  1728. // If texture not found, rebake all entries.
  1729. if (!found)
  1730. {
  1731. self->forceBakeAllTextures();
  1732. }
  1733. else
  1734. {
  1735. // Not sure if this is necessary, but forceBakeAllTextures() does it.
  1736. self->updateMeshTextures();
  1737. }
  1738. }
  1739. void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug)
  1740. {
  1741. llinfos << "TAT: forced full rebake. " << llendl;
  1742. for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
  1743. {
  1744. ETextureIndex baked_index = mBakedTextureDatas[i].mTextureIndex;
  1745. LLTexLayerSet* layer_set = getLayerSet(baked_index);
  1746. if (layer_set)
  1747. {
  1748. if (slam_for_debug)
  1749. {
  1750. layer_set->setUpdatesEnabled(TRUE);
  1751. layer_set->cancelUpload();
  1752. }
  1753. invalidateComposite(layer_set, TRUE);
  1754. LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_REBAKES);
  1755. }
  1756. else
  1757. {
  1758. llwarns << "TAT: NO LAYER SET FOR " << (S32)baked_index << llendl;
  1759. }
  1760. }
  1761. // Don't know if this is needed
  1762. updateMeshTextures();
  1763. }
  1764. //-----------------------------------------------------------------------------
  1765. // requestLayerSetUpdate()
  1766. //-----------------------------------------------------------------------------
  1767. void LLVOAvatarSelf::requestLayerSetUpdate(ETextureIndex index )
  1768. {
  1769. /* switch(index)
  1770. case LOCTEX_UPPER_BODYPAINT:  
  1771. case LOCTEX_UPPER_SHIRT:
  1772. if( mUpperBodyLayerSet )
  1773. mUpperBodyLayerSet->requestUpdate(); */
  1774. const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(index);
  1775. if (!texture_dict->mIsLocalTexture || !texture_dict->mIsUsedByBakedTexture)
  1776. return;
  1777. const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
  1778. if (mBakedTextureDatas[baked_index].mTexLayerSet)
  1779. {
  1780. mBakedTextureDatas[baked_index].mTexLayerSet->requestUpdate();
  1781. }
  1782. }
  1783. LLTexLayerSet* LLVOAvatarSelf::getLayerSet(ETextureIndex index) const
  1784. {
  1785. /* switch(index)
  1786. case TEX_HEAD_BAKED:
  1787. case TEX_HEAD_BODYPAINT:
  1788. return mHeadLayerSet; */
  1789. const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(index);
  1790. if (texture_dict->mIsUsedByBakedTexture)
  1791. {
  1792. const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
  1793. return mBakedTextureDatas[baked_index].mTexLayerSet;
  1794. }
  1795. return NULL;
  1796. }
  1797. // static
  1798. void LLVOAvatarSelf::onCustomizeStart()
  1799. {
  1800. // We're no longer doing any baking or invalidating on entering 
  1801. // appearance editing mode. Leaving function in place in case 
  1802. // further changes require us to do something at this point - Nyx
  1803. }
  1804. // static
  1805. void LLVOAvatarSelf::onCustomizeEnd()
  1806. {
  1807. LLVOAvatarSelf *avatarp = gAgent.getAvatarObject();
  1808. if (avatarp)
  1809. {
  1810. avatarp->invalidateAll();
  1811. }
  1812. }
  1813. // HACK: this will null out the avatar's local texture IDs before the TE message is sent
  1814. //       to ensure local texture IDs are not sent to other clients in the area.
  1815. //       this is a short-term solution. The long term solution will be to not set the texture
  1816. //       IDs in the avatar object, and keep them only in the wearable.
  1817. //       This will involve further refactoring that is too risky for the initial release of 2.0.
  1818. bool LLVOAvatarSelf::sendAppearanceMessage(LLMessageSystem *mesgsys) const
  1819. {
  1820. LLUUID texture_id[TEX_NUM_INDICES];
  1821. // pack away current TEs to make sure we don't send them out
  1822. for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
  1823.  iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
  1824.  ++iter)
  1825. {
  1826. const ETextureIndex index = iter->first;
  1827. const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
  1828. if (!texture_dict->mIsBakedTexture)
  1829. {
  1830. LLTextureEntry* entry = getTE((U8) index);
  1831. texture_id[index] = entry->getID();
  1832. entry->setID(IMG_DEFAULT_AVATAR);
  1833. }
  1834. }
  1835. bool success = packTEMessage(mesgsys);
  1836. // unpack TEs to make sure we don't re-trigger a bake
  1837. for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
  1838.  iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
  1839.  ++iter)
  1840. {
  1841. const ETextureIndex index = iter->first;
  1842. const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
  1843. if (!texture_dict->mIsBakedTexture)
  1844. {
  1845. LLTextureEntry* entry = getTE((U8) index);
  1846. entry->setID(texture_id[index]);
  1847. }
  1848. }
  1849. return success;
  1850. }
  1851. //------------------------------------------------------------------------
  1852. // needsRenderBeam()
  1853. //------------------------------------------------------------------------
  1854. BOOL LLVOAvatarSelf::needsRenderBeam()
  1855. {
  1856. if (gNoRender)
  1857. {
  1858. return FALSE;
  1859. }
  1860. LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
  1861. BOOL is_touching_or_grabbing = (tool == LLToolGrab::getInstance() && LLToolGrab::getInstance()->isEditing());
  1862. if (LLToolGrab::getInstance()->getEditingObject() && 
  1863. LLToolGrab::getInstance()->getEditingObject()->isAttachment())
  1864. {
  1865. // don't render selection beam on hud objects
  1866. is_touching_or_grabbing = FALSE;
  1867. }
  1868. return is_touching_or_grabbing || (mState & AGENT_STATE_EDITING && LLSelectMgr::getInstance()->shouldShowSelection());
  1869. }
  1870. // static
  1871. void LLVOAvatarSelf::deleteScratchTextures()
  1872. {
  1873. if(gAuditTexture)
  1874. {
  1875. S32 total_tex_size = sScratchTexBytes ;
  1876. S32 tex_size = SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT ;
  1877. if( sScratchTexNames.checkData( GL_LUMINANCE ) )
  1878. {
  1879. LLImageGL::decTextureCounter(tex_size, 1, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
  1880. total_tex_size -= tex_size ;
  1881. }
  1882. if( sScratchTexNames.checkData( GL_ALPHA ) )
  1883. {
  1884. LLImageGL::decTextureCounter(tex_size, 1, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
  1885. total_tex_size -= tex_size ;
  1886. }
  1887. if( sScratchTexNames.checkData( GL_COLOR_INDEX ) )
  1888. {
  1889. LLImageGL::decTextureCounter(tex_size, 1, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
  1890. total_tex_size -= tex_size ;
  1891. }
  1892. if( sScratchTexNames.checkData( GL_LUMINANCE_ALPHA ) )
  1893. {
  1894. LLImageGL::decTextureCounter(tex_size, 2, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
  1895. total_tex_size -= 2 * tex_size ;
  1896. }
  1897. if( sScratchTexNames.checkData( GL_RGB ) )
  1898. {
  1899. LLImageGL::decTextureCounter(tex_size, 3, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
  1900. total_tex_size -= 3 * tex_size ;
  1901. }
  1902. if( sScratchTexNames.checkData( GL_RGBA ) )
  1903. {
  1904. LLImageGL::decTextureCounter(tex_size, 4, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
  1905. total_tex_size -= 4 * tex_size ;
  1906. }
  1907. //others
  1908. while(total_tex_size > 0)
  1909. {
  1910. LLImageGL::decTextureCounter(tex_size, 4, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
  1911. total_tex_size -= 4 * tex_size ;
  1912. }
  1913. }
  1914. for( LLGLuint* namep = sScratchTexNames.getFirstData(); 
  1915.  namep; 
  1916.  namep = sScratchTexNames.getNextData() )
  1917. {
  1918. LLImageGL::deleteTextures(1, (U32 *)namep );
  1919. stop_glerror();
  1920. }
  1921. if( sScratchTexBytes )
  1922. {
  1923. lldebugs << "Clearing Scratch Textures " << (sScratchTexBytes/1024) << "KB" << llendl;
  1924. sScratchTexNames.deleteAllData();
  1925. sScratchTexLastBindTime.deleteAllData();
  1926. LLImageGL::sGlobalTextureMemoryInBytes -= sScratchTexBytes;
  1927. sScratchTexBytes = 0;
  1928. }
  1929. }
  1930. BOOL LLVOAvatarSelf::bindScratchTexture( LLGLenum format )
  1931. {
  1932. U32 texture_bytes = 0;
  1933. S32 components = 0; 
  1934. GLuint gl_name = getScratchTexName( format, components, &texture_bytes );
  1935. if( gl_name )
  1936. {
  1937. gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, gl_name);
  1938. stop_glerror();
  1939. F32* last_bind_time = sScratchTexLastBindTime.getIfThere( format );
  1940. if( last_bind_time )
  1941. {
  1942. if( *last_bind_time != LLImageGL::sLastFrameTime )
  1943. {
  1944. *last_bind_time = LLImageGL::sLastFrameTime;
  1945. LLImageGL::updateBoundTexMem(texture_bytes, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
  1946. }
  1947. }
  1948. else
  1949. {
  1950. LLImageGL::updateBoundTexMem(texture_bytes, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
  1951. sScratchTexLastBindTime.addData( format, new F32(LLImageGL::sLastFrameTime) );
  1952. }
  1953. return TRUE;
  1954. }
  1955. return FALSE;
  1956. }
  1957. LLGLuint LLVOAvatarSelf::getScratchTexName( LLGLenum format, S32& components, U32* texture_bytes )
  1958. {
  1959. GLenum internal_format;
  1960. switch( format )
  1961. {
  1962. case GL_LUMINANCE: components = 1; internal_format = GL_LUMINANCE8; break;
  1963. case GL_ALPHA: components = 1; internal_format = GL_ALPHA8; break;
  1964. case GL_COLOR_INDEX: components = 1; internal_format = GL_COLOR_INDEX8_EXT; break;
  1965. case GL_LUMINANCE_ALPHA: components = 2; internal_format = GL_LUMINANCE8_ALPHA8; break;
  1966. case GL_RGB: components = 3; internal_format = GL_RGB8; break;
  1967. case GL_RGBA: components = 4; internal_format = GL_RGBA8; break;
  1968. default: llassert(0); components = 4; internal_format = GL_RGBA8; break;
  1969. }
  1970. *texture_bytes = components * SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT;
  1971. if( sScratchTexNames.checkData( format ) )
  1972. {
  1973. return *( sScratchTexNames.getData( format ) );
  1974. }
  1975. LLGLSUIDefault gls_ui;
  1976. U32 name = 0;
  1977. LLImageGL::generateTextures(1, &name );
  1978. stop_glerror();
  1979. gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, name);
  1980. stop_glerror();
  1981. LLImageGL::setManualImage(
  1982. GL_TEXTURE_2D, 0, internal_format, 
  1983. SCRATCH_TEX_WIDTH, SCRATCH_TEX_HEIGHT,
  1984. format, GL_UNSIGNED_BYTE, NULL );
  1985. stop_glerror();
  1986. gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR);
  1987. gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
  1988. stop_glerror();
  1989. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  1990. stop_glerror();
  1991. sScratchTexNames.addData( format, new LLGLuint( name ) );
  1992. sScratchTexBytes += *texture_bytes;
  1993. LLImageGL::sGlobalTextureMemoryInBytes += *texture_bytes;
  1994. if(gAuditTexture)
  1995. {
  1996. LLImageGL::incTextureCounter(SCRATCH_TEX_WIDTH * SCRATCH_TEX_HEIGHT, components, LLViewerTexture::AVATAR_SCRATCH_TEX) ;
  1997. }
  1998. return name;
  1999. }
  2000. // static 
  2001. void LLVOAvatarSelf::dumpScratchTextureByteCount()
  2002. {
  2003. llinfos << "Scratch Texture GL: " << (sScratchTexBytes/1024) << "KB" << llendl;
  2004. }