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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltexlayer.cpp
  3.  * @brief A texture layer. Used for avatars.
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-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. #include "llviewerprecompiledheaders.h"
  33. #include "lltexlayer.h"
  34. #include "llagent.h"
  35. #include "llimagej2c.h"
  36. #include "llimagetga.h"
  37. #include "llvfile.h"
  38. #include "llvfs.h"
  39. #include "llviewerstats.h"
  40. #include "llviewerregion.h"
  41. #include "llvoavatar.h"
  42. #include "llvoavatarself.h"
  43. #include "pipeline.h"
  44. #include "llassetuploadresponders.h"
  45. #include "lltexlayerparams.h"
  46. #include "llui.h"
  47. #include "llagentwearables.h"
  48. #include "llwearable.h"
  49. #include "llviewervisualparam.h"
  50. //#include "../tools/imdebug/imdebug.h"
  51. using namespace LLVOAvatarDefines;
  52. //-----------------------------------------------------------------------------
  53. // LLBakedUploadData()
  54. //-----------------------------------------------------------------------------
  55. LLBakedUploadData::LLBakedUploadData(const LLVOAvatarSelf* avatar,
  56.  LLTexLayerSet* layerset,
  57.  const LLUUID& id) : 
  58. mAvatar(avatar),
  59. mTexLayerSet(layerset),
  60. mID(id),
  61. mStartTime(LLFrameTimer::getTotalTime()) // Record starting time
  62. }
  63. //-----------------------------------------------------------------------------
  64. // LLTexLayerSetBuffer
  65. // The composite image that a LLTexLayerSet writes to.  Each LLTexLayerSet has one.
  66. //-----------------------------------------------------------------------------
  67. // static
  68. S32 LLTexLayerSetBuffer::sGLByteCount = 0;
  69. LLTexLayerSetBuffer::LLTexLayerSetBuffer(LLTexLayerSet* const owner, 
  70.  S32 width, S32 height) :
  71. // ORDER_LAST => must render these after the hints are created.
  72. LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, TRUE ), 
  73. mNeedsUpdate( TRUE ),
  74. mNeedsUpload( FALSE ),
  75. mUploadPending( FALSE ), // Not used for any logic here, just to sync sending of updates
  76. mTexLayerSet(owner)
  77. {
  78. LLTexLayerSetBuffer::sGLByteCount += getSize();
  79. }
  80. LLTexLayerSetBuffer::~LLTexLayerSetBuffer()
  81. {
  82. LLTexLayerSetBuffer::sGLByteCount -= getSize();
  83. destroyGLTexture();
  84. for( S32 order = 0; order < ORDER_COUNT; order++ )
  85. {
  86. LLViewerDynamicTexture::sInstances[order].erase(this);  // will fail in all but one case.
  87. }
  88. }
  89. //virtual 
  90. void LLTexLayerSetBuffer::restoreGLTexture() 
  91. {
  92. LLViewerDynamicTexture::restoreGLTexture() ;
  93. }
  94. //virtual 
  95. void LLTexLayerSetBuffer::destroyGLTexture() 
  96. {
  97. LLViewerDynamicTexture::destroyGLTexture() ;
  98. }
  99. // static
  100. void LLTexLayerSetBuffer::dumpTotalByteCount()
  101. {
  102. llinfos << "Composite System GL Buffers: " << (LLTexLayerSetBuffer::sGLByteCount/1024) << "KB" << llendl;
  103. }
  104. void LLTexLayerSetBuffer::requestUpdate()
  105. {
  106. mNeedsUpdate = TRUE;
  107. // If we're in the middle of uploading a baked texture, we don't care about it any more.
  108. // When it's downloaded, ignore it.
  109. mUploadID.setNull();
  110. }
  111. void LLTexLayerSetBuffer::requestUpload()
  112. {
  113. if (!mNeedsUpload)
  114. {
  115. mNeedsUpload = TRUE;
  116. mUploadPending = TRUE;
  117. }
  118. }
  119. void LLTexLayerSetBuffer::cancelUpload()
  120. {
  121. if (mNeedsUpload)
  122. {
  123. mNeedsUpload = FALSE;
  124. }
  125. mUploadPending = FALSE;
  126. }
  127. void LLTexLayerSetBuffer::pushProjection() const
  128. {
  129. glMatrixMode(GL_PROJECTION);
  130. gGL.pushMatrix();
  131. glLoadIdentity();
  132. glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
  133. glMatrixMode(GL_MODELVIEW);
  134. gGL.pushMatrix();
  135. glLoadIdentity();
  136. }
  137. void LLTexLayerSetBuffer::popProjection() const
  138. {
  139. glMatrixMode(GL_PROJECTION);
  140. gGL.popMatrix();
  141. glMatrixMode(GL_MODELVIEW);
  142. gGL.popMatrix();
  143. }
  144. BOOL LLTexLayerSetBuffer::needsRender()
  145. {
  146. const LLVOAvatarSelf* avatar = mTexLayerSet->getAvatar();
  147. BOOL upload_now = mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal() && gAgentQueryManager.hasNoPendingQueries();
  148. BOOL needs_update = (mNeedsUpdate || upload_now) && !avatar->mAppearanceAnimating;
  149. if (needs_update)
  150. {
  151. BOOL invalid_skirt = avatar->getBakedTE(mTexLayerSet) == LLVOAvatarDefines::TEX_SKIRT_BAKED && !avatar->isWearingWearableType(WT_SKIRT);
  152. if (invalid_skirt)
  153. {
  154. // we were trying to create a skirt texture
  155. // but we're no longer wearing a skirt...
  156. needs_update = FALSE;
  157. cancelUpload();
  158. }
  159. else
  160. {
  161. needs_update &= (avatar->isSelf() || (avatar->isVisible() && !avatar->isCulled()));
  162. needs_update &= mTexLayerSet->isLocalTextureDataAvailable();
  163. }
  164. }
  165. return needs_update;
  166. }
  167. void LLTexLayerSetBuffer::preRender(BOOL clear_depth)
  168. {
  169. // Set up an ortho projection
  170. pushProjection();
  171. // keep depth buffer, we don't need to clear it
  172. LLViewerDynamicTexture::preRender(FALSE);
  173. }
  174. void LLTexLayerSetBuffer::postRender(BOOL success)
  175. {
  176. popProjection();
  177. LLViewerDynamicTexture::postRender(success);
  178. }
  179. BOOL LLTexLayerSetBuffer::render()
  180. {
  181. // Default color mask for tex layer render
  182. gGL.setColorMask(true, true);
  183. // do we need to upload, and do we have sufficient data to create an uploadable composite?
  184. // When do we upload the texture if gAgent.mNumPendingQueries is non-zero?
  185. BOOL upload_now = (gAgentQueryManager.hasNoPendingQueries() && mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal());
  186. BOOL success = TRUE;
  187. // Composite the color data
  188. LLGLSUIDefault gls_ui;
  189. success &= mTexLayerSet->render( mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight );
  190. gGL.flush();
  191. if( upload_now )
  192. {
  193. if (!success)
  194. {
  195. llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegion() << llendl;
  196. mUploadPending = FALSE;
  197. }
  198. else
  199. {
  200. if (mTexLayerSet->isVisible())
  201. {
  202. readBackAndUpload();
  203. }
  204. else
  205. {
  206. mUploadPending = FALSE;
  207. mNeedsUpload = FALSE;
  208. mTexLayerSet->getAvatar()->setNewBakedTexture(mTexLayerSet->getBakedTexIndex(),IMG_INVISIBLE);
  209. }
  210. }
  211. }
  212. // reset GL state
  213. gGL.setColorMask(true, true);
  214. gGL.setSceneBlendType(LLRender::BT_ALPHA);
  215. // we have valid texture data now
  216. mGLTexturep->setGLTextureCreated(true);
  217. mNeedsUpdate = FALSE;
  218. return success;
  219. }
  220. bool LLTexLayerSetBuffer::isInitialized(void) const
  221. {
  222. return mGLTexturep.notNull() && mGLTexturep->isGLTextureCreated();
  223. }
  224. BOOL LLTexLayerSetBuffer::updateImmediate()
  225. {
  226. mNeedsUpdate = TRUE;
  227. BOOL result = FALSE;
  228. if (needsRender())
  229. {
  230. preRender(FALSE);
  231. result = render();
  232. postRender(result);
  233. }
  234. return result;
  235. }
  236. void LLTexLayerSetBuffer::readBackAndUpload()
  237. {
  238. // pointers for storing data to upload
  239. U8* baked_color_data = new U8[ mFullWidth * mFullHeight * 4 ];
  240. glReadPixels(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, GL_RGBA, GL_UNSIGNED_BYTE, baked_color_data );
  241. stop_glerror();
  242. llinfos << "Baked " << mTexLayerSet->getBodyRegion() << llendl;
  243. LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_BAKES);
  244. llassert( gAgent.getAvatarObject() == mTexLayerSet->getAvatar() );
  245. // We won't need our caches since we're baked now.  (Techically, we won't 
  246. // really be baked until this image is sent to the server and the Avatar
  247. // Appearance message is received.)
  248. mTexLayerSet->deleteCaches();
  249. LLGLSUIDefault gls_ui;
  250. LLPointer<LLImageRaw> baked_mask_image = new LLImageRaw(mFullWidth, mFullHeight, 1 );
  251. U8* baked_mask_data = baked_mask_image->getData(); 
  252. mTexLayerSet->gatherMorphMaskAlpha(baked_mask_data, mFullWidth, mFullHeight);
  253. // writes into baked_color_data
  254. const char* comment_text = NULL;
  255. S32 baked_image_components = 5; // red green blue [bump] clothing
  256. LLPointer<LLImageRaw> baked_image = new LLImageRaw( mFullWidth, mFullHeight, baked_image_components );
  257. U8* baked_image_data = baked_image->getData();
  258. comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // 5 channels: rgb, heightfield/alpha, mask
  259. S32 i = 0;
  260. for( S32 u = 0; u < mFullWidth; u++ )
  261. {
  262. for( S32 v = 0; v < mFullHeight; v++ )
  263. {
  264. baked_image_data[5*i + 0] = baked_color_data[4*i + 0];
  265. baked_image_data[5*i + 1] = baked_color_data[4*i + 1];
  266. baked_image_data[5*i + 2] = baked_color_data[4*i + 2];
  267. baked_image_data[5*i + 3] = baked_color_data[4*i + 3]; // alpha should be correct for eyelashes.
  268. baked_image_data[5*i + 4] = baked_mask_data[i];
  269. i++;
  270. }
  271. }
  272. LLPointer<LLImageJ2C> compressedImage = new LLImageJ2C;
  273. compressedImage->setRate(0.f);
  274. LLTransactionID tid;
  275. LLAssetID asset_id;
  276. tid.generate();
  277. asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
  278. BOOL res = false;
  279. if( compressedImage->encode(baked_image, comment_text))
  280. {
  281. res = LLVFile::writeFile(compressedImage->getData(), compressedImage->getDataSize(),
  282.  gVFS, asset_id, LLAssetType::AT_TEXTURE);
  283. if (res)
  284. {
  285. LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C;
  286. BOOL valid = FALSE;
  287. S32 file_size;
  288. U8* data = LLVFile::readFile(gVFS, asset_id, LLAssetType::AT_TEXTURE, &file_size);
  289. if (data)
  290. {
  291. valid = integrity_test->validate(data, file_size); // integrity_test will delete 'data'
  292. }
  293. else
  294. {
  295. integrity_test->setLastError("Unable to read entire file");
  296. }
  297. if( valid )
  298. {
  299. // baked_upload_data is owned by the responder and deleted after the request completes
  300. LLBakedUploadData* baked_upload_data =
  301. new LLBakedUploadData(gAgent.getAvatarObject(), this->mTexLayerSet, asset_id);
  302. mUploadID = asset_id;
  303. // upload the image
  304. std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture");
  305. if(!url.empty()
  306. && !LLPipeline::sForceOldBakedUpload) // Toggle the debug setting UploadBakedTexOld to change between the new caps method and old method
  307. {
  308. llinfos << "Baked texture upload via capability of " << mUploadID << " to " << url << llendl;
  309. LLSD body = LLSD::emptyMap();
  310. LLHTTPClient::post(url, body, new LLSendTexLayerResponder(body, mUploadID, LLAssetType::AT_TEXTURE, baked_upload_data));
  311. // Responder will call LLTexLayerSetBuffer::onTextureUploadComplete()
  312. else
  313. {
  314. llinfos << "Baked texture upload via Asset Store." <<  llendl;
  315. // gAssetStorage->storeAssetData(mTransactionID, LLAssetType::AT_IMAGE_JPEG, &uploadCallback, (void *)this, FALSE);
  316. gAssetStorage->storeAssetData(tid,
  317.   LLAssetType::AT_TEXTURE,
  318.   LLTexLayerSetBuffer::onTextureUploadComplete,
  319.   baked_upload_data,
  320.   TRUE, // temp_file
  321.   TRUE, // is_priority
  322.   TRUE); // store_local
  323. }
  324. mNeedsUpload = FALSE;
  325. }
  326. else
  327. {
  328. mUploadPending = FALSE;
  329. llinfos << "unable to create baked upload file: corrupted" << llendl;
  330. LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE, LLVFile::WRITE);
  331. file.remove();
  332. }
  333. }
  334. }
  335. if (!res)
  336. {
  337. mUploadPending = FALSE;
  338. llinfos << "unable to create baked upload file" << llendl;
  339. }
  340. delete [] baked_color_data;
  341. }
  342. // static
  343. void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
  344.   void* userdata,
  345.   S32 result,
  346.   LLExtStat ext_status) // StoreAssetData callback (not fixed)
  347. {
  348. LLBakedUploadData* baked_upload_data = (LLBakedUploadData*)userdata;
  349. LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
  350. if (0 == result &&
  351. avatar &&
  352. !avatar->isDead() &&
  353. baked_upload_data->mAvatar == avatar && // Sanity check: only the user's avatar should be uploading textures.
  354. baked_upload_data->mTexLayerSet->hasComposite()
  355. )
  356. {
  357. LLTexLayerSetBuffer* layerset_buffer = baked_upload_data->mTexLayerSet->getComposite();
  358. if (layerset_buffer->mUploadID.isNull())
  359. {
  360. // The upload got canceled, we should be in the
  361. // process of baking a new texture so request an
  362. // upload with the new data
  363. // BAP: does this really belong in this callback, as
  364. // opposed to where the cancellation takes place?
  365. // suspect this does nothing.
  366. layerset_buffer->requestUpload();
  367. }
  368. else if (baked_upload_data->mID == layerset_buffer->mUploadID)
  369. {
  370. // This is the upload we're currently waiting for.
  371. layerset_buffer->mUploadID.setNull();
  372. layerset_buffer->mUploadPending = FALSE;
  373. if (result >= 0)
  374. {
  375. LLVOAvatarDefines::ETextureIndex baked_te = avatar->getBakedTE(layerset_buffer->mTexLayerSet);
  376. // Update baked texture info with the new UUID
  377. U64 now = LLFrameTimer::getTotalTime(); // Record starting time
  378. llinfos << "Baked texture upload took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl;
  379. avatar->setNewBakedTexture(baked_te, uuid);
  380. }
  381. else
  382. {
  383. // Avatar appearance is changing, ignore the upload results
  384. llinfos << "Baked upload failed. Reason: " << result << llendl;
  385. // *FIX: retry upload after n seconds, asset server could be busy
  386. }
  387. }
  388. else
  389. {
  390. llinfos << "Received baked texture out of date, ignored." << llendl;
  391. }
  392. avatar->dirtyMesh();
  393. }
  394. else
  395. {
  396. // Baked texture failed to upload (in which case since we
  397. // didn't set the new baked texture, it means that they'll try
  398. // and rebake it at some point in the future (after login?)),
  399. // or this response to upload is out of date, in which case a
  400. // current response should be on the way or already processed.
  401. llwarns << "Baked upload failed" << llendl;
  402. }
  403. delete baked_upload_data;
  404. }
  405. //-----------------------------------------------------------------------------
  406. // LLTexLayerSet
  407. // An ordered set of texture layers that get composited into a single texture.
  408. //-----------------------------------------------------------------------------
  409. LLTexLayerSetInfo::LLTexLayerSetInfo() :
  410. mBodyRegion( "" ),
  411. mWidth( 512 ),
  412. mHeight( 512 ),
  413. mClearAlpha( TRUE )
  414. {
  415. }
  416. LLTexLayerSetInfo::~LLTexLayerSetInfo( )
  417. {
  418. std::for_each(mLayerInfoList.begin(), mLayerInfoList.end(), DeletePointer());
  419. }
  420. BOOL LLTexLayerSetInfo::parseXml(LLXmlTreeNode* node)
  421. {
  422. llassert( node->hasName( "layer_set" ) );
  423. if( !node->hasName( "layer_set" ) )
  424. {
  425. return FALSE;
  426. }
  427. // body_region
  428. static LLStdStringHandle body_region_string = LLXmlTree::addAttributeString("body_region");
  429. if( !node->getFastAttributeString( body_region_string, mBodyRegion ) )
  430. {
  431. llwarns << "<layer_set> is missing body_region attribute" << llendl;
  432. return FALSE;
  433. }
  434. // width, height
  435. static LLStdStringHandle width_string = LLXmlTree::addAttributeString("width");
  436. if( !node->getFastAttributeS32( width_string, mWidth ) )
  437. {
  438. return FALSE;
  439. }
  440. static LLStdStringHandle height_string = LLXmlTree::addAttributeString("height");
  441. if( !node->getFastAttributeS32( height_string, mHeight ) )
  442. {
  443. return FALSE;
  444. }
  445. // Optional alpha component to apply after all compositing is complete.
  446. static LLStdStringHandle alpha_tga_file_string = LLXmlTree::addAttributeString("alpha_tga_file");
  447. node->getFastAttributeString( alpha_tga_file_string, mStaticAlphaFileName );
  448. static LLStdStringHandle clear_alpha_string = LLXmlTree::addAttributeString("clear_alpha");
  449. node->getFastAttributeBOOL( clear_alpha_string, mClearAlpha );
  450. // <layer>
  451. for (LLXmlTreeNode* child = node->getChildByName( "layer" );
  452.  child;
  453.  child = node->getNextNamedChild())
  454. {
  455. LLTexLayerInfo* info = new LLTexLayerInfo();
  456. if( !info->parseXml( child ))
  457. {
  458. delete info;
  459. return FALSE;
  460. }
  461. mLayerInfoList.push_back( info );
  462. }
  463. return TRUE;
  464. }
  465. // creates visual params without generating layersets or layers
  466. void LLTexLayerSetInfo::createVisualParams(LLVOAvatar *avatar)
  467. {
  468. //layer_info_list_t mLayerInfoList;
  469. for (layer_info_list_t::iterator layer_iter = mLayerInfoList.begin();
  470.  layer_iter != mLayerInfoList.end();
  471.  layer_iter++)
  472. {
  473. LLTexLayerInfo *layer_info = *layer_iter;
  474. layer_info->createVisualParams(avatar);
  475. }
  476. }
  477. //-----------------------------------------------------------------------------
  478. // LLTexLayerSet
  479. // An ordered set of texture layers that get composited into a single texture.
  480. //-----------------------------------------------------------------------------
  481. BOOL LLTexLayerSet::sHasCaches = FALSE;
  482. LLTexLayerSet::LLTexLayerSet(LLVOAvatarSelf* const avatar) :
  483. mComposite( NULL ),
  484. mAvatar( avatar ),
  485. mUpdatesEnabled( FALSE ),
  486. mIsVisible( TRUE ),
  487. mBakedTexIndex(LLVOAvatarDefines::BAKED_HEAD),
  488. mInfo( NULL )
  489. {
  490. }
  491. LLTexLayerSet::~LLTexLayerSet()
  492. {
  493. deleteCaches();
  494. std::for_each(mLayerList.begin(), mLayerList.end(), DeletePointer());
  495. std::for_each(mMaskLayerList.begin(), mMaskLayerList.end(), DeletePointer());
  496. }
  497. //-----------------------------------------------------------------------------
  498. // setInfo
  499. //-----------------------------------------------------------------------------
  500. BOOL LLTexLayerSet::setInfo(const LLTexLayerSetInfo *info)
  501. {
  502. llassert(mInfo == NULL);
  503. mInfo = info;
  504. //mID = info->mID; // No ID
  505. mLayerList.reserve(info->mLayerInfoList.size());
  506. for (LLTexLayerSetInfo::layer_info_list_t::const_iterator iter = info->mLayerInfoList.begin(); 
  507.  iter != info->mLayerInfoList.end(); 
  508.  iter++)
  509. {
  510. LLTexLayerInterface *layer = NULL;
  511. if ( (*iter)->isUserSettable() )
  512. {
  513. layer = new LLTexLayerTemplate( this );
  514. }
  515. else
  516. {
  517. layer = new LLTexLayer(this);
  518. }
  519. // this is the first time this layer (of either type) is being created - make sure you add the parameters to the avatar
  520. if (!layer->setInfo(*iter, NULL))
  521. {
  522. mInfo = NULL;
  523. return FALSE;
  524. }
  525. if (!layer->isVisibilityMask())
  526. {
  527. mLayerList.push_back( layer );
  528. }
  529. else
  530. {
  531. mMaskLayerList.push_back(layer);
  532. }
  533. }
  534. requestUpdate();
  535. stop_glerror();
  536. return TRUE;
  537. }
  538. #if 0 // obsolete
  539. //-----------------------------------------------------------------------------
  540. // parseData
  541. //-----------------------------------------------------------------------------
  542. BOOL LLTexLayerSet::parseData(LLXmlTreeNode* node)
  543. {
  544. LLTexLayerSetInfo *info = new LLTexLayerSetInfo;
  545. if (!info->parseXml(node))
  546. {
  547. delete info;
  548. return FALSE;
  549. }
  550. if (!setInfo(info))
  551. {
  552. delete info;
  553. return FALSE;
  554. }
  555. return TRUE;
  556. }
  557. #endif
  558. void LLTexLayerSet::deleteCaches()
  559. {
  560. for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
  561. {
  562. LLTexLayerInterface* layer = *iter;
  563. layer->deleteCaches();
  564. }
  565. for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++)
  566. {
  567. LLTexLayerInterface* layer = *iter;
  568. layer->deleteCaches();
  569. }
  570. }
  571. // Returns TRUE if at least one packet of data has been received for each of the textures that this layerset depends on.
  572. BOOL LLTexLayerSet::isLocalTextureDataAvailable() const
  573. {
  574. if (!mAvatar->isSelf()) return FALSE;
  575. return ((LLVOAvatarSelf *)mAvatar)->isLocalTextureDataAvailable(this);
  576. }
  577. // Returns TRUE if all of the data for the textures that this layerset depends on have arrived.
  578. BOOL LLTexLayerSet::isLocalTextureDataFinal() const
  579. {
  580. if (!mAvatar->isSelf()) return FALSE;
  581. return ((LLVOAvatarSelf *)mAvatar)->isLocalTextureDataFinal(this);
  582. }
  583. BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
  584. {
  585. BOOL success = TRUE;
  586. mIsVisible = TRUE;
  587. if (mMaskLayerList.size() > 0)
  588. {
  589. for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++)
  590. {
  591. LLTexLayerInterface* layer = *iter;
  592. if (layer->isInvisibleAlphaMask())
  593. {
  594. mIsVisible = FALSE;
  595. }
  596. }
  597. }
  598. LLGLSUIDefault gls_ui;
  599. LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE);
  600. gGL.setColorMask(true, true);
  601. // clear buffer area to ensure we don't pick up UI elements
  602. {
  603. gGL.flush();
  604. LLGLDisable no_alpha(GL_ALPHA_TEST);
  605. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  606. gGL.color4f( 0.f, 0.f, 0.f, 1.f );
  607. gl_rect_2d_simple( width, height );
  608. gGL.flush();
  609. }
  610. if (mIsVisible)
  611. {
  612. // composite color layers
  613. for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
  614. {
  615. LLTexLayerInterface* layer = *iter;
  616. if (layer->getRenderPass() == LLTexLayer::RP_COLOR)
  617. {
  618. gGL.flush();
  619. success &= layer->render(x, y, width, height);
  620. gGL.flush();
  621. }
  622. }
  623. renderAlphaMaskTextures(x, y, width, height, false);
  624. stop_glerror();
  625. }
  626. else
  627. {
  628. gGL.flush();
  629. gGL.setSceneBlendType(LLRender::BT_REPLACE);
  630. LLGLDisable no_alpha(GL_ALPHA_TEST);
  631. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  632. gGL.color4f( 0.f, 0.f, 0.f, 0.f );
  633. gl_rect_2d_simple( width, height );
  634. gGL.setSceneBlendType(LLRender::BT_ALPHA);
  635. gGL.flush();
  636. }
  637. return success;
  638. }
  639. BOOL LLTexLayerSet::isBodyRegion(const std::string& region) const 
  640. return mInfo->mBodyRegion == region; 
  641. }
  642. const std::string LLTexLayerSet::getBodyRegion() const 
  643. return mInfo->mBodyRegion; 
  644. }
  645. void LLTexLayerSet::requestUpdate()
  646. {
  647. if( mUpdatesEnabled )
  648. {
  649. createComposite();
  650. mComposite->requestUpdate(); 
  651. }
  652. }
  653. void LLTexLayerSet::requestUpload()
  654. {
  655. createComposite();
  656. mComposite->requestUpload();
  657. }
  658. void LLTexLayerSet::cancelUpload()
  659. {
  660. if(mComposite)
  661. {
  662. mComposite->cancelUpload();
  663. }
  664. }
  665. void LLTexLayerSet::createComposite()
  666. {
  667. if( !mComposite )
  668. {
  669. S32 width = mInfo->mWidth;
  670. S32 height = mInfo->mHeight;
  671. // Composite other avatars at reduced resolution
  672. if( !mAvatar->isSelf() )
  673. {
  674. llerrs << "composites should not be created for non-self avatars!" << llendl;
  675. }
  676. mComposite = new LLTexLayerSetBuffer( this, width, height );
  677. }
  678. }
  679. void LLTexLayerSet::destroyComposite()
  680. {
  681. if( mComposite )
  682. {
  683. mComposite = NULL;
  684. }
  685. }
  686. void LLTexLayerSet::setUpdatesEnabled( BOOL b )
  687. {
  688. mUpdatesEnabled = b; 
  689. }
  690. void LLTexLayerSet::updateComposite()
  691. {
  692. createComposite();
  693. mComposite->updateImmediate();
  694. }
  695. LLTexLayerSetBuffer* LLTexLayerSet::getComposite()
  696. {
  697. createComposite();
  698. return mComposite;
  699. }
  700. void LLTexLayerSet::gatherMorphMaskAlpha(U8 *data, S32 width, S32 height)
  701. {
  702. memset(data, 255, width * height);
  703. for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
  704. {
  705. LLTexLayerInterface* layer = *iter;
  706. layer->gatherAlphaMasks(data, mComposite->getOriginX(),mComposite->getOriginY(), width, height);
  707. }
  708. // Set alpha back to that of our alpha masks.
  709. renderAlphaMaskTextures(mComposite->getOriginX(), mComposite->getOriginY(), width, height, true);
  710. }
  711. void LLTexLayerSet::renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear)
  712. {
  713. const LLTexLayerSetInfo *info = getInfo();
  714. gGL.setColorMask(false, true);
  715. gGL.setSceneBlendType(LLRender::BT_REPLACE);
  716. // (Optionally) replace alpha with a single component image from a tga file.
  717. if (!info->mStaticAlphaFileName.empty())
  718. {
  719. LLGLSNoAlphaTest gls_no_alpha_test;
  720. gGL.flush();
  721. {
  722. LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(info->mStaticAlphaFileName, TRUE);
  723. if( tex )
  724. {
  725. LLGLSUIDefault gls_ui;
  726. gGL.getTexUnit(0)->bind(tex);
  727. gGL.getTexUnit(0)->setTextureBlendType( LLTexUnit::TB_REPLACE );
  728. gl_rect_2d_simple_tex( width, height );
  729. }
  730. }
  731. gGL.flush();
  732. }
  733. else if (forceClear || info->mClearAlpha || (mMaskLayerList.size() > 0))
  734. {
  735. // Set the alpha channel to one (clean up after previous blending)
  736. gGL.flush();
  737. LLGLDisable no_alpha(GL_ALPHA_TEST);
  738. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  739. gGL.color4f( 0.f, 0.f, 0.f, 1.f );
  740. gl_rect_2d_simple( width, height );
  741. gGL.flush();
  742. }
  743. // (Optional) Mask out part of the baked texture with alpha masks
  744. // will still have an effect even if mClearAlpha is set or the alpha component was replaced
  745. if (mMaskLayerList.size() > 0)
  746. {
  747. gGL.setSceneBlendType(LLRender::BT_MULT_ALPHA);
  748. gGL.getTexUnit(0)->setTextureBlendType( LLTexUnit::TB_REPLACE );
  749. for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++)
  750. {
  751. LLTexLayerInterface* layer = *iter;
  752. gGL.flush();
  753. layer->blendAlphaTexture(x,y,width, height);
  754. gGL.flush();
  755. }
  756. }
  757. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  758. gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
  759. gGL.setColorMask(true, true);
  760. gGL.setSceneBlendType(LLRender::BT_ALPHA);
  761. }
  762. void LLTexLayerSet::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components)
  763. {
  764. mAvatar->applyMorphMask(tex_data, width, height, num_components, mBakedTexIndex);
  765. }
  766. BOOL LLTexLayerSet::isMorphValid()
  767. {
  768. for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
  769. {
  770. LLTexLayerInterface* layer = *iter;
  771. if (layer && !layer->isMorphValid())
  772. {
  773. return FALSE;
  774. }
  775. }
  776. return TRUE;
  777. }
  778. void LLTexLayerSet::invalidateMorphMasks()
  779. {
  780. for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
  781. {
  782. LLTexLayerInterface* layer = *iter;
  783. if (layer)
  784. {
  785. layer->invalidateMorphMasks();
  786. }
  787. }
  788. }
  789. //-----------------------------------------------------------------------------
  790. // LLTexLayerInfo
  791. //-----------------------------------------------------------------------------
  792. LLTexLayerInfo::LLTexLayerInfo() :
  793. mWriteAllChannels( FALSE ),
  794. mRenderPass(LLTexLayer::RP_COLOR),
  795. mFixedColor( 0.f, 0.f, 0.f, 0.f ),
  796. mLocalTexture( -1 ),
  797. mStaticImageIsMask( FALSE ),
  798. mUseLocalTextureAlphaOnly(FALSE),
  799. mIsVisibilityMask(FALSE)
  800. {
  801. }
  802. LLTexLayerInfo::~LLTexLayerInfo( )
  803. {
  804. std::for_each(mParamColorInfoList.begin(), mParamColorInfoList.end(), DeletePointer());
  805. std::for_each(mParamAlphaInfoList.begin(), mParamAlphaInfoList.end(), DeletePointer());
  806. }
  807. BOOL LLTexLayerInfo::parseXml(LLXmlTreeNode* node)
  808. {
  809. llassert( node->hasName( "layer" ) );
  810. // name attribute
  811. static LLStdStringHandle name_string = LLXmlTree::addAttributeString("name");
  812. if( !node->getFastAttributeString( name_string, mName ) )
  813. {
  814. return FALSE;
  815. }
  816. static LLStdStringHandle write_all_channels_string = LLXmlTree::addAttributeString("write_all_channels");
  817. node->getFastAttributeBOOL( write_all_channels_string, mWriteAllChannels );
  818. std::string render_pass_name;
  819. static LLStdStringHandle render_pass_string = LLXmlTree::addAttributeString("render_pass");
  820. if( node->getFastAttributeString( render_pass_string, render_pass_name ) )
  821. {
  822. if( render_pass_name == "bump" )
  823. {
  824. mRenderPass = LLTexLayer::RP_BUMP;
  825. }
  826. }
  827. // Note: layers can have either a "global_color" attrib, a "fixed_color" attrib, or a <param_color> child.
  828. // global color attribute (optional)
  829. static LLStdStringHandle global_color_string = LLXmlTree::addAttributeString("global_color");
  830. node->getFastAttributeString( global_color_string, mGlobalColor );
  831. // Visibility mask (optional)
  832. BOOL is_visibility;
  833. static LLStdStringHandle visibility_mask_string = LLXmlTree::addAttributeString("visibility_mask");
  834. if (node->getFastAttributeBOOL(visibility_mask_string, is_visibility))
  835. {
  836. mIsVisibilityMask = is_visibility;
  837. }
  838. // color attribute (optional)
  839. LLColor4U color4u;
  840. static LLStdStringHandle fixed_color_string = LLXmlTree::addAttributeString("fixed_color");
  841. if( node->getFastAttributeColor4U( fixed_color_string, color4u ) )
  842. {
  843. mFixedColor.setVec( color4u );
  844. }
  845. // <texture> optional sub-element
  846. for (LLXmlTreeNode* texture_node = node->getChildByName( "texture" );
  847.  texture_node;
  848.  texture_node = node->getNextNamedChild())
  849. {
  850. std::string local_texture_name;
  851. static LLStdStringHandle tga_file_string = LLXmlTree::addAttributeString("tga_file");
  852. static LLStdStringHandle local_texture_string = LLXmlTree::addAttributeString("local_texture");
  853. static LLStdStringHandle file_is_mask_string = LLXmlTree::addAttributeString("file_is_mask");
  854. static LLStdStringHandle local_texture_alpha_only_string = LLXmlTree::addAttributeString("local_texture_alpha_only");
  855. if( texture_node->getFastAttributeString( tga_file_string, mStaticImageFileName ) )
  856. {
  857. texture_node->getFastAttributeBOOL( file_is_mask_string, mStaticImageIsMask );
  858. }
  859. else if (texture_node->getFastAttributeString(local_texture_string, local_texture_name))
  860. {
  861. texture_node->getFastAttributeBOOL( local_texture_alpha_only_string, mUseLocalTextureAlphaOnly );
  862. /* if ("upper_shirt" == local_texture_name)
  863. mLocalTexture = TEX_UPPER_SHIRT; */
  864. mLocalTexture = TEX_NUM_INDICES;
  865. for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
  866.  iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
  867.  iter++)
  868. {
  869. const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
  870. if (local_texture_name == texture_dict->mName)
  871. {
  872. mLocalTexture = iter->first;
  873. break;
  874. }
  875. }
  876. if (mLocalTexture == TEX_NUM_INDICES)
  877. {
  878. llwarns << "<texture> element has invalid local_texure attribute: " << mName << " " << local_texture_name << llendl;
  879. return FALSE;
  880. }
  881. }
  882. else
  883. {
  884. llwarns << "<texture> element is missing a required attribute. " << mName << llendl;
  885. return FALSE;
  886. }
  887. }
  888. for (LLXmlTreeNode* maskNode = node->getChildByName( "morph_mask" );
  889.  maskNode;
  890.  maskNode = node->getNextNamedChild())
  891. {
  892. std::string morph_name;
  893. static LLStdStringHandle morph_name_string = LLXmlTree::addAttributeString("morph_name");
  894. if (maskNode->getFastAttributeString(morph_name_string, morph_name))
  895. {
  896. BOOL invert = FALSE;
  897. static LLStdStringHandle invert_string = LLXmlTree::addAttributeString("invert");
  898. maskNode->getFastAttributeBOOL(invert_string, invert);
  899. mMorphNameList.push_back(std::pair<std::string,BOOL>(morph_name,invert));
  900. }
  901. }
  902. // <param> optional sub-element (color or alpha params)
  903. for (LLXmlTreeNode* child = node->getChildByName( "param" );
  904.  child;
  905.  child = node->getNextNamedChild())
  906. {
  907. if( child->getChildByName( "param_color" ) )
  908. {
  909. // <param><param_color/></param>
  910. LLTexLayerParamColorInfo* info = new LLTexLayerParamColorInfo();
  911. if (!info->parseXml(child))
  912. {
  913. delete info;
  914. return FALSE;
  915. }
  916. mParamColorInfoList.push_back(info);
  917. }
  918. else if( child->getChildByName( "param_alpha" ) )
  919. {
  920. // <param><param_alpha/></param>
  921. LLTexLayerParamAlphaInfo* info = new LLTexLayerParamAlphaInfo( );
  922. if (!info->parseXml(child))
  923. {
  924. delete info;
  925. return FALSE;
  926. }
  927.   mParamAlphaInfoList.push_back(info);
  928. }
  929. }
  930. return TRUE;
  931. }
  932. BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar)
  933. {
  934. BOOL success = TRUE;
  935. for (param_color_info_list_t::iterator color_info_iter = mParamColorInfoList.begin();
  936.  color_info_iter != mParamColorInfoList.end();
  937.  color_info_iter++)
  938. {
  939. LLTexLayerParamColorInfo * color_info = *color_info_iter;
  940. LLTexLayerParamColor* param_color = new LLTexLayerParamColor(avatar);
  941. if (!param_color->setInfo(color_info, TRUE))
  942. {
  943. llwarns << "NULL TexLayer Color Param could not be added to visual param list. Deleting." << llendl;
  944. delete param_color;
  945. success = FALSE;
  946. }
  947. }
  948. for (param_alpha_info_list_t::iterator alpha_info_iter = mParamAlphaInfoList.begin();
  949.  alpha_info_iter != mParamAlphaInfoList.end();
  950.  alpha_info_iter++)
  951. {
  952. LLTexLayerParamAlphaInfo * alpha_info = *alpha_info_iter;
  953. LLTexLayerParamAlpha* param_alpha = new LLTexLayerParamAlpha(avatar);
  954. if (!param_alpha->setInfo(alpha_info, TRUE))
  955. {
  956. llwarns << "NULL TexLayer Alpha Param could not be added to visual param list. Deleting." << llendl;
  957. delete param_alpha;
  958. success = FALSE;
  959. }
  960. }
  961. return success;
  962. }
  963. LLTexLayerInterface::LLTexLayerInterface(LLTexLayerSet* const layer_set):
  964. mTexLayerSet( layer_set ),
  965. mMorphMasksValid( FALSE ),
  966. mStaticImageInvalid( FALSE ),
  967. mInfo(NULL),
  968. mHasMorph(FALSE)
  969. {
  970. }
  971. LLTexLayerInterface::LLTexLayerInterface(const LLTexLayerInterface &layer, LLWearable *wearable):
  972. mTexLayerSet( layer.mTexLayerSet )
  973. {
  974. // don't add visual params for cloned layers
  975. setInfo(layer.getInfo(), wearable);
  976. mHasMorph = layer.mHasMorph;
  977. }
  978. BOOL LLTexLayerInterface::setInfo(const LLTexLayerInfo *info, LLWearable* wearable  ) // This sets mInfo and calls initialization functions
  979. {
  980. //llassert(mInfo == NULL); // nyx says this is probably bogus but needs investigating
  981.         if (mInfo != NULL) // above llassert(), but softened into a warning
  982.         {
  983.                 llwarns << "BAD STUFF!  mInfo != NULL" << llendl;
  984.         }
  985. mInfo = info;
  986. //mID = info->mID; // No ID
  987. mParamColorList.reserve(mInfo->mParamColorInfoList.size());
  988. for (param_color_info_list_t::const_iterator iter = mInfo->mParamColorInfoList.begin(); 
  989.  iter != mInfo->mParamColorInfoList.end(); 
  990.  iter++)
  991. {
  992. LLTexLayerParamColor* param_color;
  993. if (!wearable)
  994. {
  995. param_color = new LLTexLayerParamColor(this);
  996. if (!param_color->setInfo(*iter, TRUE))
  997. {
  998. mInfo = NULL;
  999. return FALSE;
  1000. }
  1001. }
  1002. else
  1003. {
  1004. param_color = (LLTexLayerParamColor*)wearable->getVisualParam((*iter)->getID());
  1005. if (!param_color)
  1006. {
  1007. mInfo = NULL;
  1008. return FALSE;
  1009. }
  1010. }
  1011. mParamColorList.push_back( param_color );
  1012. }
  1013. mParamAlphaList.reserve(mInfo->mParamAlphaInfoList.size());
  1014. for (param_alpha_info_list_t::const_iterator iter = mInfo->mParamAlphaInfoList.begin(); 
  1015.  iter != mInfo->mParamAlphaInfoList.end(); 
  1016.  iter++)
  1017. {
  1018. LLTexLayerParamAlpha* param_alpha;
  1019. if (!wearable)
  1020. {
  1021. param_alpha = new LLTexLayerParamAlpha( this );
  1022. if (!param_alpha->setInfo(*iter, TRUE))
  1023. {
  1024. mInfo = NULL;
  1025. return FALSE;
  1026. }
  1027. }
  1028. else
  1029. {
  1030. param_alpha = (LLTexLayerParamAlpha*) wearable->getVisualParam((*iter)->getID());
  1031. if (!param_alpha)
  1032. {
  1033. mInfo = NULL;
  1034. return FALSE;
  1035. }
  1036. }
  1037. mParamAlphaList.push_back( param_alpha );
  1038. }
  1039. return TRUE;
  1040. }
  1041. /*virtual*/ void LLTexLayerInterface::requestUpdate()
  1042. {
  1043. mTexLayerSet->requestUpdate();
  1044. }
  1045. const std::string& LLTexLayerInterface::getName() const
  1046. {
  1047. return mInfo->mName; 
  1048. }
  1049. LLTexLayerInterface::ERenderPass LLTexLayerInterface::getRenderPass() const
  1050. {
  1051. return mInfo->mRenderPass; 
  1052. }
  1053. const std::string& LLTexLayerInterface::getGlobalColor() const
  1054. {
  1055. return mInfo->mGlobalColor; 
  1056. }
  1057. BOOL LLTexLayerInterface::isVisibilityMask() const
  1058. {
  1059. return mInfo->mIsVisibilityMask;
  1060. }
  1061. void LLTexLayerInterface::invalidateMorphMasks()
  1062. {
  1063. mMorphMasksValid = FALSE;
  1064. }
  1065. LLViewerVisualParam* LLTexLayerInterface::getVisualParamPtr(S32 index)
  1066. {
  1067. LLViewerVisualParam *result = NULL;
  1068. for (param_color_list_t::iterator color_iter = mParamColorList.begin(); color_iter != mParamColorList.end() && !result; ++color_iter)
  1069. {
  1070. if ((*color_iter)->getID() == index)
  1071. {
  1072. result = *color_iter;
  1073. }
  1074. }
  1075. for (param_alpha_list_t::iterator alpha_iter = mParamAlphaList.begin(); alpha_iter != mParamAlphaList.end() && !result; ++alpha_iter)
  1076. {
  1077. if ((*alpha_iter)->getID() == index)
  1078. {
  1079. result = *alpha_iter;
  1080. }
  1081. }
  1082. return result;
  1083. }
  1084. //-----------------------------------------------------------------------------
  1085. // LLTexLayer
  1086. // A single texture layer, consisting of:
  1087. // * color, consisting of either
  1088. // * one or more color parameters (weighted colors)
  1089. // * a reference to a global color
  1090. // * a fixed color with non-zero alpha
  1091. // * opaque white (the default)
  1092. // * (optional) a texture defined by either
  1093. // * a GUID
  1094. // * a texture entry index (TE)
  1095. // * (optional) one or more alpha parameters (weighted alpha textures)
  1096. //-----------------------------------------------------------------------------
  1097. LLTexLayer::LLTexLayer(LLTexLayerSet* const layer_set) :
  1098. LLTexLayerInterface( layer_set ),
  1099. mLocalTextureObject(NULL)
  1100. {
  1101. }
  1102. LLTexLayer::LLTexLayer(const LLTexLayer &layer, LLWearable *wearable) :
  1103. LLTexLayerInterface( layer, wearable ),
  1104. mLocalTextureObject(NULL)
  1105. {
  1106. }
  1107. LLTexLayer::LLTexLayer(const LLTexLayerTemplate &layer_template, LLLocalTextureObject *lto, LLWearable *wearable) :
  1108. LLTexLayerInterface( layer_template, wearable ),
  1109. mLocalTextureObject(lto)
  1110. {
  1111. }
  1112. LLTexLayer::~LLTexLayer()
  1113. {
  1114. // mParamAlphaList and mParamColorList are LLViewerVisualParam's and get
  1115. // deleted with ~LLCharacter()
  1116. //std::for_each(mParamAlphaList.begin(), mParamAlphaList.end(), DeletePointer());
  1117. //std::for_each(mParamColorList.begin(), mParamColorList.end(), DeletePointer());
  1118. for( alpha_cache_t::iterator iter = mAlphaCache.begin();
  1119.  iter != mAlphaCache.end(); iter++ )
  1120. {
  1121. U8* alpha_data = iter->second;
  1122. delete [] alpha_data;
  1123. }
  1124. }
  1125. //-----------------------------------------------------------------------------
  1126. // setInfo
  1127. //-----------------------------------------------------------------------------
  1128. BOOL LLTexLayer::setInfo(const LLTexLayerInfo* info, LLWearable* wearable  )
  1129. {
  1130. return LLTexLayerInterface::setInfo(info, wearable);
  1131. }
  1132. //static 
  1133. void LLTexLayer::calculateTexLayerColor(const param_color_list_t &param_list, LLColor4 &net_color)
  1134. {
  1135. for (param_color_list_t::const_iterator iter = param_list.begin();
  1136.  iter != param_list.end(); iter++)
  1137. {
  1138. const LLTexLayerParamColor* param = *iter;
  1139. LLColor4 param_net = param->getNetColor();
  1140. const LLTexLayerParamColorInfo *info = (LLTexLayerParamColorInfo *)param->getInfo();
  1141. switch(info->getOperation())
  1142. {
  1143. case LLTexLayerParamColor::OP_ADD:
  1144. net_color += param_net;
  1145. break;
  1146. case LLTexLayerParamColor::OP_MULTIPLY:
  1147. net_color = net_color * param_net;
  1148. break;
  1149. case LLTexLayerParamColor::OP_BLEND:
  1150. net_color = lerp(net_color, param_net, param->getWeight());
  1151. break;
  1152. default:
  1153. llassert(0);
  1154. break;
  1155. }
  1156. }
  1157. net_color.clamp();
  1158. }
  1159. /*virtual*/ void LLTexLayer::deleteCaches()
  1160. {
  1161. // Only need to delete caches for alpha params. Color params don't hold extra memory
  1162. for (param_alpha_list_t::iterator iter = mParamAlphaList.begin();
  1163.  iter != mParamAlphaList.end(); iter++ )
  1164. {
  1165. LLTexLayerParamAlpha* param = *iter;
  1166. param->deleteCaches();
  1167. }
  1168. }
  1169. BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)
  1170. {
  1171. LLGLEnable color_mat(GL_COLOR_MATERIAL);
  1172. gPipeline.disableLights();
  1173. LLColor4 net_color;
  1174. BOOL color_specified = findNetColor(&net_color);
  1175. if (mTexLayerSet->getAvatar()->mIsDummy)
  1176. {
  1177. color_specified = true;
  1178. net_color = LLVOAvatar::getDummyColor();
  1179. }
  1180. BOOL success = TRUE;
  1181. // If you can't see the layer, don't render it.
  1182. if( is_approx_zero( net_color.mV[VW] ) )
  1183. {
  1184. return success;
  1185. }
  1186. BOOL alpha_mask_specified = FALSE;
  1187. param_alpha_list_t::const_iterator iter = mParamAlphaList.begin();
  1188. if( iter != mParamAlphaList.end() )
  1189. {
  1190. // If we have alpha masks, but we're skipping all of them, skip the whole layer.
  1191. // However, we can't do this optimization if we have morph masks that need updating.
  1192. /* if (!mHasMorph)
  1193. {
  1194. BOOL skip_layer = TRUE;
  1195. while( iter != mParamAlphaList.end() )
  1196. {
  1197. const LLTexLayerParamAlpha* param = *iter;
  1198. if( !param->getSkip() )
  1199. {
  1200. skip_layer = FALSE;
  1201. break;
  1202. }
  1203. iter++;
  1204. if( skip_layer )
  1205. {
  1206. return success;
  1207. }
  1208. }//*/
  1209. renderMorphMasks(x, y, width, height, net_color);
  1210. alpha_mask_specified = TRUE;
  1211. gGL.flush();
  1212. gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ONE_MINUS_DEST_ALPHA);
  1213. }
  1214. gGL.color4fv( net_color.mV);
  1215. if( getInfo()->mWriteAllChannels )
  1216. {
  1217. gGL.flush();
  1218. gGL.setSceneBlendType(LLRender::BT_REPLACE);
  1219. }
  1220. if( (getInfo()->mLocalTexture != -1) && !getInfo()->mUseLocalTextureAlphaOnly )
  1221. {
  1222. {
  1223. LLViewerTexture* tex = NULL;
  1224. if (mLocalTextureObject && mLocalTextureObject->getImage())
  1225. {
  1226. tex = mLocalTextureObject->getImage();
  1227. if (mLocalTextureObject->getID() == IMG_DEFAULT_AVATAR)
  1228. {
  1229. tex = NULL;
  1230. }
  1231. }
  1232. else
  1233. {
  1234. llinfos << "lto not defined or image not defined: " << getInfo()->getLocalTexture() << " lto: " << mLocalTextureObject << llendl;
  1235. }
  1236. // if( mTexLayerSet->getAvatar()->getLocalTextureGL((ETextureIndex)getInfo()->mLocalTexture, &image_gl ) )
  1237. {
  1238. if( tex )
  1239. {
  1240. LLGLDisable alpha_test(getInfo()->mWriteAllChannels ? GL_ALPHA_TEST : 0);
  1241. LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode();
  1242. gGL.getTexUnit(0)->bind(tex, TRUE);
  1243. gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
  1244. gl_rect_2d_simple_tex( width, height );
  1245. gGL.getTexUnit(0)->setTextureAddressMode(old_mode);
  1246. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  1247. }
  1248. }
  1249. // else
  1250. // {
  1251. // success = FALSE;
  1252. // }
  1253. }
  1254. }
  1255. if( !getInfo()->mStaticImageFileName.empty() )
  1256. {
  1257. {
  1258. LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);
  1259. if( tex )
  1260. {
  1261. gGL.getTexUnit(0)->bind(tex, TRUE);
  1262. gl_rect_2d_simple_tex( width, height );
  1263. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  1264. }
  1265. else
  1266. {
  1267. success = FALSE;
  1268. }
  1269. }
  1270. }
  1271. if(((-1 == getInfo()->mLocalTexture) ||
  1272.  getInfo()->mUseLocalTextureAlphaOnly) &&
  1273. getInfo()->mStaticImageFileName.empty() &&
  1274. color_specified )
  1275. {
  1276. LLGLDisable no_alpha(GL_ALPHA_TEST);
  1277. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  1278. gGL.color4fv( net_color.mV );
  1279. gl_rect_2d_simple( width, height );
  1280. }
  1281. if( alpha_mask_specified || getInfo()->mWriteAllChannels )
  1282. {
  1283. // Restore standard blend func value
  1284. gGL.flush();
  1285. gGL.setSceneBlendType(LLRender::BT_ALPHA);
  1286. stop_glerror();
  1287. }
  1288. if( !success )
  1289. {
  1290. llinfos << "LLTexLayer::render() partial: " << getInfo()->mName << llendl;
  1291. }
  1292. return success;
  1293. }
  1294. U8* LLTexLayer::getAlphaData()
  1295. {
  1296. LLCRC alpha_mask_crc;
  1297. const LLUUID& uuid = getUUID();
  1298. alpha_mask_crc.update((U8*)(&uuid.mData), UUID_BYTES);
  1299. for (param_alpha_list_t::const_iterator iter = mParamAlphaList.begin(); iter != mParamAlphaList.end(); iter++)
  1300. {
  1301. const LLTexLayerParamAlpha* param = *iter;
  1302. // MULTI-WEARABLE: verify visual parameters used here
  1303. F32 param_weight = param->getWeight();
  1304. alpha_mask_crc.update((U8*)&param_weight, sizeof(F32));
  1305. }
  1306. U32 cache_index = alpha_mask_crc.getCRC();
  1307. alpha_cache_t::iterator iter2 = mAlphaCache.find(cache_index);
  1308. return (iter2 == mAlphaCache.end()) ? 0 : iter2->second;
  1309. }
  1310. BOOL LLTexLayer::findNetColor(LLColor4* net_color) const
  1311. {
  1312. // Color is either:
  1313. // * one or more color parameters (weighted colors)  (which may make use of a global color or fixed color)
  1314. // * a reference to a global color
  1315. // * a fixed color with non-zero alpha
  1316. // * opaque white (the default)
  1317. if( !mParamColorList.empty() )
  1318. {
  1319. if( !getGlobalColor().empty() )
  1320. {
  1321. net_color->setVec( mTexLayerSet->getAvatar()->getGlobalColor( getInfo()->mGlobalColor ) );
  1322. }
  1323. else if (getInfo()->mFixedColor.mV[VW])
  1324. {
  1325. net_color->setVec( getInfo()->mFixedColor );
  1326. }
  1327. else
  1328. {
  1329. net_color->setVec( 0.f, 0.f, 0.f, 0.f );
  1330. }
  1331. calculateTexLayerColor(mParamColorList, *net_color);
  1332. return TRUE;
  1333. }
  1334. if( !getGlobalColor().empty() )
  1335. {
  1336. net_color->setVec( mTexLayerSet->getAvatar()->getGlobalColor( getGlobalColor() ) );
  1337. return TRUE;
  1338. }
  1339. if( getInfo()->mFixedColor.mV[VW] )
  1340. {
  1341. net_color->setVec( getInfo()->mFixedColor );
  1342. return TRUE;
  1343. }
  1344. net_color->setToWhite();
  1345. return FALSE; // No need to draw a separate colored polygon
  1346. }
  1347. BOOL LLTexLayer::blendAlphaTexture(S32 x, S32 y, S32 width, S32 height)
  1348. {
  1349. BOOL success = TRUE;
  1350. gGL.flush();
  1351. if( !getInfo()->mStaticImageFileName.empty() )
  1352. {
  1353. LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture( getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask );
  1354. if( tex )
  1355. {
  1356. LLGLSNoAlphaTest gls_no_alpha_test;
  1357. gGL.getTexUnit(0)->bind(tex, TRUE);
  1358. gl_rect_2d_simple_tex( width, height );
  1359. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  1360. }
  1361. else
  1362. {
  1363. success = FALSE;
  1364. }
  1365. }
  1366. else
  1367. {
  1368. if (getInfo()->mLocalTexture >=0 && getInfo()->mLocalTexture < TEX_NUM_INDICES)
  1369. {
  1370. LLViewerTexture* tex = mLocalTextureObject->getImage();
  1371. if (tex)
  1372. {
  1373. LLGLSNoAlphaTest gls_no_alpha_test;
  1374. gGL.getTexUnit(0)->bind(tex);
  1375. gl_rect_2d_simple_tex( width, height );
  1376. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  1377. success = TRUE;
  1378. }
  1379. }
  1380. }
  1381. return success;
  1382. }
  1383. /*virtual*/ void LLTexLayer::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height)
  1384. {
  1385. addAlphaMask(data, originX, originY, width, height);
  1386. }
  1387. BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color)
  1388. {
  1389. BOOL success = TRUE;
  1390. llassert( !mParamAlphaList.empty() );
  1391. gGL.setColorMask(false, true);
  1392. LLTexLayerParamAlpha* first_param = *mParamAlphaList.begin();
  1393. // Note: if the first param is a mulitply, multiply against the current buffer's alpha
  1394. if( !first_param || !first_param->getMultiplyBlend() )
  1395. {
  1396. LLGLDisable no_alpha(GL_ALPHA_TEST);
  1397. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  1398. // Clear the alpha
  1399. gGL.flush();
  1400. gGL.setSceneBlendType(LLRender::BT_REPLACE);
  1401. gGL.color4f( 0.f, 0.f, 0.f, 0.f );
  1402. gl_rect_2d_simple( width, height );
  1403. }
  1404. // Accumulate alphas
  1405. LLGLSNoAlphaTest gls_no_alpha_test;
  1406. gGL.color4f( 1.f, 1.f, 1.f, 1.f );
  1407. for (param_alpha_list_t::iterator iter = mParamAlphaList.begin(); iter != mParamAlphaList.end(); iter++)
  1408. {
  1409. LLTexLayerParamAlpha* param = *iter;
  1410. success &= param->render( x, y, width, height );
  1411. }
  1412. // Approximates a min() function
  1413. gGL.flush();
  1414. gGL.setSceneBlendType(LLRender::BT_MULT_ALPHA);
  1415. // Accumulate the alpha component of the texture
  1416. if( getInfo()->mLocalTexture != -1 )
  1417. {
  1418. LLViewerTexture* tex = mLocalTextureObject->getImage();
  1419. if( tex && (tex->getComponents() == 4) )
  1420. {
  1421. LLGLSNoAlphaTest gls_no_alpha_test;
  1422. LLTexUnit::eTextureAddressMode old_mode = tex->getAddressMode();
  1423. gGL.getTexUnit(0)->bind(tex, TRUE);
  1424. gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_CLAMP);
  1425. gl_rect_2d_simple_tex( width, height );
  1426. gGL.getTexUnit(0)->setTextureAddressMode(old_mode);
  1427. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  1428. }
  1429. }
  1430. if( !getInfo()->mStaticImageFileName.empty() )
  1431. {
  1432. LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);
  1433. if( tex )
  1434. {
  1435. if( (tex->getComponents() == 4) ||
  1436. ( (tex->getComponents() == 1) && getInfo()->mStaticImageIsMask ) )
  1437. {
  1438. LLGLSNoAlphaTest gls_no_alpha_test;
  1439. gGL.getTexUnit(0)->bind(tex, TRUE);
  1440. gl_rect_2d_simple_tex( width, height );
  1441. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  1442. }
  1443. }
  1444. }
  1445. // Draw a rectangle with the layer color to multiply the alpha by that color's alpha.
  1446. // Note: we're still using gGL.blendFunc( GL_DST_ALPHA, GL_ZERO );
  1447. if (layer_color.mV[VW] != 1.f)
  1448. {
  1449. LLGLDisable no_alpha(GL_ALPHA_TEST);
  1450. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  1451. gGL.color4fv(layer_color.mV);
  1452. gl_rect_2d_simple( width, height );
  1453. }
  1454. LLGLSUIDefault gls_ui;
  1455. gGL.setColorMask(true, true);
  1456. if (hasMorph() && success)
  1457. {
  1458. LLCRC alpha_mask_crc;
  1459. const LLUUID& uuid = getUUID();
  1460. alpha_mask_crc.update((U8*)(&uuid.mData), UUID_BYTES);
  1461. for (param_alpha_list_t::const_iterator iter = mParamAlphaList.begin(); iter != mParamAlphaList.end(); iter++)
  1462. {
  1463. const LLTexLayerParamAlpha* param = *iter;
  1464. F32 param_weight = param->getWeight();
  1465. alpha_mask_crc.update((U8*)&param_weight, sizeof(F32));
  1466. }
  1467. U32 cache_index = alpha_mask_crc.getCRC();
  1468. U8* alpha_data = get_if_there(mAlphaCache,cache_index,(U8*)NULL);
  1469. if (!alpha_data)
  1470. {
  1471. // clear out a slot if we have filled our cache
  1472. S32 max_cache_entries = getTexLayerSet()->getAvatar()->isSelf() ? 4 : 1;
  1473. while ((S32)mAlphaCache.size() >= max_cache_entries)
  1474. {
  1475. alpha_cache_t::iterator iter2 = mAlphaCache.begin(); // arbitrarily grab the first entry
  1476. alpha_data = iter2->second;
  1477. delete [] alpha_data;
  1478. mAlphaCache.erase(iter2);
  1479. }
  1480. alpha_data = new U8[width * height];
  1481. mAlphaCache[cache_index] = alpha_data;
  1482. glReadPixels(x, y, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, alpha_data);
  1483. }
  1484. getTexLayerSet()->getAvatar()->dirtyMesh();
  1485. mMorphMasksValid = TRUE;
  1486. getTexLayerSet()->applyMorphMask(alpha_data, width, height, 1);
  1487. }
  1488. return success;
  1489. }
  1490. void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height)
  1491. {
  1492. S32 size = width * height;
  1493. U8* alphaData = getAlphaData();
  1494. if (!alphaData && hasAlphaParams())
  1495. {
  1496. LLColor4 net_color;
  1497. findNetColor( &net_color );
  1498. // TODO: eliminate need for layer morph mask valid flag
  1499. invalidateMorphMasks();
  1500. renderMorphMasks(originX, originY, width, height, net_color);
  1501. alphaData = getAlphaData();
  1502. }
  1503. if (alphaData)
  1504. {
  1505. for( S32 i = 0; i < size; i++ )
  1506. {
  1507. U8 curAlpha = data[i];
  1508. U16 resultAlpha = curAlpha;
  1509. resultAlpha *= (alphaData[i] + 1);
  1510. resultAlpha = resultAlpha >> 8;
  1511. data[i] = (U8)resultAlpha;
  1512. }
  1513. }
  1514. }
  1515. /*virtual*/ BOOL LLTexLayer::isInvisibleAlphaMask()
  1516. {
  1517. if (mLocalTextureObject)
  1518. {
  1519. if (mLocalTextureObject->getID() == IMG_INVISIBLE)
  1520. {
  1521. return TRUE;
  1522. }
  1523. }
  1524. return FALSE;
  1525. }
  1526. // private helper function
  1527. LLUUID LLTexLayer::getUUID()
  1528. {
  1529. LLUUID uuid;
  1530. if( getInfo()->mLocalTexture != -1 )
  1531. {
  1532. LLViewerTexture* tex = mLocalTextureObject->getImage();
  1533. if (tex)
  1534. {
  1535. uuid = mLocalTextureObject->getID();
  1536. }
  1537. }
  1538. if( !getInfo()->mStaticImageFileName.empty() )
  1539. {
  1540. LLViewerTexture* tex = LLTexLayerStaticImageList::getInstance()->getTexture(getInfo()->mStaticImageFileName, getInfo()->mStaticImageIsMask);
  1541. if( tex )
  1542. {
  1543. uuid = tex->getID();
  1544. }
  1545. }
  1546. return uuid;
  1547. }
  1548. //-----------------------------------------------------------------------------
  1549. // LLTexLayerTemplate
  1550. // A single texture layer, consisting of:
  1551. // * color, consisting of either
  1552. // * one or more color parameters (weighted colors)
  1553. // * a reference to a global color
  1554. // * a fixed color with non-zero alpha
  1555. // * opaque white (the default)
  1556. // * (optional) a texture defined by either
  1557. // * a GUID
  1558. // * a texture entry index (TE)
  1559. // * (optional) one or more alpha parameters (weighted alpha textures)
  1560. //-----------------------------------------------------------------------------
  1561. LLTexLayerTemplate::LLTexLayerTemplate(LLTexLayerSet* layer_set) :
  1562. LLTexLayerInterface(layer_set)
  1563. {
  1564. }
  1565. LLTexLayerTemplate::LLTexLayerTemplate(const LLTexLayerTemplate &layer) :
  1566. LLTexLayerInterface(layer)
  1567. {
  1568. }
  1569. LLTexLayerTemplate::~LLTexLayerTemplate()
  1570. {
  1571. }
  1572. //-----------------------------------------------------------------------------
  1573. // setInfo
  1574. //-----------------------------------------------------------------------------
  1575. /*virtual*/ BOOL LLTexLayerTemplate::setInfo(const LLTexLayerInfo* info, LLWearable* wearable  )
  1576. {
  1577. return LLTexLayerInterface::setInfo(info, wearable);
  1578. }
  1579. U32 LLTexLayerTemplate::updateWearableCache()
  1580. {
  1581. mWearableCache.clear();
  1582. S32 te = mInfo->mLocalTexture;
  1583. if (te == -1)
  1584. {
  1585. //this isn't a cloneable layer 
  1586. return 0;
  1587. }
  1588. EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te);
  1589. U32 num_wearables = gAgentWearables.getWearableCount(wearable_type);
  1590. U32 added = 0;
  1591. for (U32 i = 0; i < num_wearables; i++)
  1592. {
  1593. LLWearable*  wearable = gAgentWearables.getWearable(wearable_type, i);
  1594. if (!wearable)
  1595. {
  1596. continue;
  1597. }
  1598. mWearableCache.push_back(wearable);
  1599. added++;
  1600. }
  1601. return added;
  1602. }
  1603. LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)
  1604. {
  1605. if (mWearableCache.size() <= i)
  1606. {
  1607. return NULL;
  1608. }
  1609. LLWearable *wearable = mWearableCache[i];
  1610. LLLocalTextureObject *lto = NULL;
  1611. LLTexLayer *layer = NULL;
  1612. if (wearable)
  1613. {
  1614.  lto = wearable->getLocalTextureObject(mInfo->mLocalTexture);
  1615. }
  1616. if (lto)
  1617. {
  1618. layer = lto->getTexLayer(getName());
  1619. }
  1620. return layer;
  1621. }
  1622. /*virtual*/ BOOL LLTexLayerTemplate::render(S32 x, S32 y, S32 width, S32 height)
  1623. {
  1624. BOOL success = TRUE;
  1625. updateWearableCache();
  1626. for (wearable_cache_t::const_iterator iter = mWearableCache.begin(); iter!= mWearableCache.end(); iter++)
  1627. {
  1628. LLWearable* wearable = NULL;
  1629. LLLocalTextureObject *lto = NULL;
  1630. LLTexLayer *layer = NULL;
  1631. wearable = *iter;
  1632. if (wearable)
  1633. {
  1634. lto = wearable->getLocalTextureObject(mInfo->mLocalTexture);
  1635. }
  1636. if (lto)
  1637. {
  1638. layer = lto->getTexLayer(getName());
  1639. }
  1640. if (layer)
  1641. {
  1642. wearable->writeToAvatar();
  1643. layer->setLTO(lto);
  1644. success &= layer->render(x,y,width,height);
  1645. }
  1646. }
  1647. return success;
  1648. }
  1649. /*virtual*/ BOOL LLTexLayerTemplate::blendAlphaTexture( S32 x, S32 y, S32 width, S32 height) // Multiplies a single alpha texture against the frame buffer
  1650. {
  1651. BOOL success = TRUE;
  1652. U32 num_wearables = updateWearableCache();
  1653. for (U32 i = 0; i < num_wearables; i++)
  1654. {
  1655. LLTexLayer *layer = getLayer(i);
  1656. if (layer)
  1657. {
  1658. success &= layer->blendAlphaTexture(x,y,width,height);
  1659. }
  1660. }
  1661. return success;
  1662. }
  1663. /*virtual*/ void LLTexLayerTemplate::gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height)
  1664. {
  1665. U32 num_wearables = updateWearableCache();
  1666. for (U32 i = 0; i < num_wearables; i++)
  1667. {
  1668. LLTexLayer *layer = getLayer(i);
  1669. if (layer)
  1670. {
  1671. layer->addAlphaMask(data, originX, originY, width, height);
  1672. }
  1673. }
  1674. }
  1675. /*virtual*/ void LLTexLayerTemplate::setHasMorph(BOOL newval)
  1676. mHasMorph = newval;
  1677. U32 num_wearables = updateWearableCache();
  1678. for (U32 i = 0; i < num_wearables; i++)
  1679. {
  1680. LLTexLayer *layer = getLayer(i);
  1681. if (layer)
  1682. {
  1683. layer->setHasMorph(newval);
  1684. }
  1685. }
  1686. }
  1687. /*virtual*/ void LLTexLayerTemplate::deleteCaches()
  1688. {
  1689. U32 num_wearables = updateWearableCache();
  1690. for (U32 i = 0; i < num_wearables; i++)
  1691. {
  1692. LLTexLayer *layer = getLayer(i);
  1693. if (layer)
  1694. {
  1695. layer->deleteCaches();
  1696. }
  1697. }
  1698. }
  1699. /*virtual*/ BOOL LLTexLayerTemplate::isInvisibleAlphaMask()
  1700. {
  1701. U32 num_wearables = updateWearableCache();
  1702. for (U32 i = 0; i < num_wearables; i++)
  1703. {
  1704. LLTexLayer *layer = getLayer(i);
  1705. if (layer)
  1706. {
  1707.  if (layer->isInvisibleAlphaMask())
  1708.  {
  1709.  return TRUE;
  1710.  }
  1711. }
  1712. }
  1713. return FALSE;
  1714. }
  1715. //-----------------------------------------------------------------------------
  1716. // finds a specific layer based on a passed in name
  1717. //-----------------------------------------------------------------------------
  1718. LLTexLayerInterface*  LLTexLayerSet::findLayerByName(const std::string& name)
  1719. {
  1720. for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
  1721. {
  1722. LLTexLayerInterface* layer = *iter;
  1723. if (layer->getName() == name)
  1724. {
  1725. return layer;
  1726. }
  1727. }
  1728. for( layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++ )
  1729. {
  1730. LLTexLayerInterface* layer = *iter;
  1731. if (layer->getName() == name)
  1732. {
  1733. return layer;
  1734. }
  1735. }
  1736. return NULL;
  1737. }
  1738. void LLTexLayerSet::cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable *wearable)
  1739. {
  1740. // initialize all texlayers with this texture type for this LTO
  1741. for( LLTexLayerSet::layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
  1742. {
  1743. LLTexLayerTemplate* layer = (LLTexLayerTemplate*)*iter;
  1744. if (layer->getInfo()->getLocalTexture() == (S32) tex_index)
  1745. {
  1746. lto->addTexLayer(layer, wearable);
  1747. }
  1748. }
  1749. for( LLTexLayerSet::layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++ )
  1750. {
  1751. LLTexLayerTemplate* layer = (LLTexLayerTemplate*)*iter;
  1752. if (layer->getInfo()->getLocalTexture() == (S32) tex_index)
  1753. {
  1754. lto->addTexLayer(layer, wearable);
  1755. }
  1756. }
  1757. }
  1758. //-----------------------------------------------------------------------------
  1759. // LLTexLayerStaticImageList
  1760. //-----------------------------------------------------------------------------
  1761. LLTexLayerStaticImageList::LLTexLayerStaticImageList() :
  1762. mGLBytes(0),
  1763. mTGABytes(0),
  1764. mImageNames(16384)
  1765. {
  1766. }
  1767. LLTexLayerStaticImageList::~LLTexLayerStaticImageList()
  1768. {
  1769. deleteCachedImages();
  1770. }
  1771. void LLTexLayerStaticImageList::dumpByteCount()
  1772. {
  1773. llinfos << "Avatar Static Textures " <<
  1774. "KB GL:" << (mGLBytes / 1024) <<
  1775. "KB TGA:" << (mTGABytes / 1024) << "KB" << llendl;
  1776. }
  1777. void LLTexLayerStaticImageList::deleteCachedImages()
  1778. {
  1779. if( mGLBytes || mTGABytes )
  1780. {
  1781. llinfos << "Clearing Static Textures " <<
  1782. "KB GL:" << (mGLBytes / 1024) <<
  1783. "KB TGA:" << (mTGABytes / 1024) << "KB" << llendl;
  1784. //mStaticImageLists uses LLPointers, clear() will cause deletion
  1785. mStaticImageListTGA.clear();
  1786. mStaticImageList.clear();
  1787. mGLBytes = 0;
  1788. mTGABytes = 0;
  1789. }
  1790. }
  1791. // Note: in general, for a given image image we'll call either getImageTga() or getTexture().
  1792. // We call getImageTga() if the image is used as an alpha gradient.
  1793. // Otherwise, we call getTexture()
  1794. // Returns an LLImageTGA that contains the encoded data from a tga file named file_name.
  1795. // Caches the result to speed identical subsequent requests.
  1796. LLImageTGA* LLTexLayerStaticImageList::getImageTGA(const std::string& file_name)
  1797. {
  1798. const char *namekey = mImageNames.addString(file_name);
  1799. image_tga_map_t::const_iterator iter = mStaticImageListTGA.find(namekey);
  1800. if( iter != mStaticImageListTGA.end() )
  1801. {
  1802. return iter->second;
  1803. }
  1804. else
  1805. {
  1806. std::string path;
  1807. path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,file_name);
  1808. LLPointer<LLImageTGA> image_tga = new LLImageTGA( path );
  1809. if( image_tga->getDataSize() > 0 )
  1810. {
  1811. mStaticImageListTGA[ namekey ] = image_tga;
  1812. mTGABytes += image_tga->getDataSize();
  1813. return image_tga;
  1814. }
  1815. else
  1816. {
  1817. return NULL;
  1818. }
  1819. }
  1820. }
  1821. // Returns a GL Image (without a backing ImageRaw) that contains the decoded data from a tga file named file_name.
  1822. // Caches the result to speed identical subsequent requests.
  1823. LLViewerTexture* LLTexLayerStaticImageList::getTexture(const std::string& file_name, BOOL is_mask)
  1824. {
  1825. LLPointer<LLViewerTexture> tex;
  1826. const char *namekey = mImageNames.addString(file_name);
  1827. texture_map_t::const_iterator iter = mStaticImageList.find(namekey);
  1828. if( iter != mStaticImageList.end() )
  1829. {
  1830. tex = iter->second;
  1831. }
  1832. else
  1833. {
  1834. tex = LLViewerTextureManager::getLocalTexture( FALSE );
  1835. LLPointer<LLImageRaw> image_raw = new LLImageRaw;
  1836. if( loadImageRaw( file_name, image_raw ) )
  1837. {
  1838. if( (image_raw->getComponents() == 1) && is_mask )
  1839. {
  1840. // Note: these are static, unchanging images so it's ok to assume
  1841. // that once an image is a mask it's always a mask.
  1842. tex->setExplicitFormat( GL_ALPHA8, GL_ALPHA );
  1843. }
  1844. tex->createGLTexture(0, image_raw, 0, TRUE, LLViewerTexture::LOCAL);
  1845. gGL.getTexUnit(0)->bind(tex);
  1846. tex->setAddressMode(LLTexUnit::TAM_CLAMP);
  1847. mStaticImageList [ namekey ] = tex;
  1848. mGLBytes += (S32)tex->getWidth() * tex->getHeight() * tex->getComponents();
  1849. }
  1850. else
  1851. {
  1852. tex = NULL;
  1853. }
  1854. }
  1855. return tex;
  1856. }
  1857. // Reads a .tga file, decodes it, and puts the decoded data in image_raw.
  1858. // Returns TRUE if successful.
  1859. BOOL LLTexLayerStaticImageList::loadImageRaw(const std::string& file_name, LLImageRaw* image_raw)
  1860. {
  1861. BOOL success = FALSE;
  1862. std::string path;
  1863. path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,file_name);
  1864. LLPointer<LLImageTGA> image_tga = new LLImageTGA( path );
  1865. if( image_tga->getDataSize() > 0 )
  1866. {
  1867. // Copy data from tga to raw.
  1868. success = image_tga->decode( image_raw );
  1869. }
  1870. return success;
  1871. }