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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltexlayerparams.cpp
  3.  * @brief SERAPH - ADD IN
  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 "lltexlayerparams.h"
  34. #include "llagent.h"
  35. #include "llimagetga.h"
  36. #include "lltexlayer.h"
  37. #include "llvoavatarself.h"
  38. #include "llwearable.h"
  39. #include "llui.h"
  40. //-----------------------------------------------------------------------------
  41. // LLTexLayerParam
  42. //-----------------------------------------------------------------------------
  43. LLTexLayerParam::LLTexLayerParam(LLTexLayerInterface *layer) :
  44. mTexLayer(layer),
  45. mAvatar(NULL)
  46. {
  47. if (mTexLayer != NULL)
  48. {
  49. mAvatar = mTexLayer->getTexLayerSet()->getAvatar();
  50. }
  51. else
  52. {
  53. llerrs << "LLTexLayerParam constructor passed with NULL reference for layer!" << llendl;
  54. }
  55. }
  56. LLTexLayerParam::LLTexLayerParam(LLVOAvatar *avatar) :
  57. mTexLayer(NULL)
  58. {
  59. mAvatar = avatar;
  60. }
  61. BOOL LLTexLayerParam::setInfo(LLViewerVisualParamInfo *info, BOOL add_to_avatar  )
  62. {
  63. LLViewerVisualParam::setInfo(info);
  64. if (add_to_avatar)
  65. {
  66. mAvatar->addVisualParam( this);
  67. }
  68. return TRUE;
  69. }
  70. //-----------------------------------------------------------------------------
  71. // LLTexLayerParamAlpha
  72. //-----------------------------------------------------------------------------
  73. // static 
  74. LLTexLayerParamAlpha::param_alpha_ptr_list_t LLTexLayerParamAlpha::sInstances;
  75. // static 
  76. void LLTexLayerParamAlpha::dumpCacheByteCount()
  77. {
  78. S32 gl_bytes = 0;
  79. getCacheByteCount( &gl_bytes);
  80. llinfos << "Processed Alpha Texture Cache GL:" << (gl_bytes/1024) << "KB" << llendl;
  81. }
  82. // static 
  83. void LLTexLayerParamAlpha::getCacheByteCount(S32* gl_bytes)
  84. {
  85. *gl_bytes = 0;
  86. for (param_alpha_ptr_list_t::iterator iter = sInstances.begin();
  87.  iter != sInstances.end(); iter++)
  88. {
  89. LLTexLayerParamAlpha* instance = *iter;
  90. LLViewerTexture* tex = instance->mCachedProcessedTexture;
  91. if (tex)
  92. {
  93. S32 bytes = (S32)tex->getWidth() * tex->getHeight() * tex->getComponents();
  94. if (tex->hasGLTexture())
  95. {
  96. *gl_bytes += bytes;
  97. }
  98. }
  99. }
  100. }
  101. LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLTexLayerInterface* layer) :
  102. LLTexLayerParam(layer),
  103. mCachedProcessedTexture(NULL),
  104. mNeedsCreateTexture(FALSE),
  105. mStaticImageInvalid(FALSE),
  106. mAvgDistortionVec(1.f, 1.f, 1.f),
  107. mCachedEffectiveWeight(0.f)
  108. {
  109. sInstances.push_front(this);
  110. }
  111. LLTexLayerParamAlpha::LLTexLayerParamAlpha(LLVOAvatar* avatar) :
  112. LLTexLayerParam(avatar),
  113. mCachedProcessedTexture(NULL),
  114. mNeedsCreateTexture(FALSE),
  115. mStaticImageInvalid(FALSE),
  116. mAvgDistortionVec(1.f, 1.f, 1.f),
  117. mCachedEffectiveWeight(0.f)
  118. {
  119. sInstances.push_front(this);
  120. }
  121. LLTexLayerParamAlpha::~LLTexLayerParamAlpha()
  122. {
  123. deleteCaches();
  124. sInstances.remove(this);
  125. }
  126. /*virtual*/ LLViewerVisualParam* LLTexLayerParamAlpha::cloneParam(LLWearable* wearable) const
  127. {
  128. LLTexLayerParamAlpha *new_param = new LLTexLayerParamAlpha(mTexLayer);
  129. *new_param = *this;
  130. return new_param;
  131. }
  132. void LLTexLayerParamAlpha::deleteCaches()
  133. {
  134. mStaticImageTGA = NULL; // deletes image
  135. mCachedProcessedTexture = NULL;
  136. mStaticImageRaw = NULL;
  137. mNeedsCreateTexture = FALSE;
  138. }
  139. BOOL LLTexLayerParamAlpha::getMultiplyBlend() const
  140. {
  141. return ((LLTexLayerParamAlphaInfo *)getInfo())->mMultiplyBlend; 
  142. }
  143. void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL upload_bake)
  144. {
  145. if (mIsAnimating || mTexLayer == NULL)
  146. {
  147. return;
  148. }
  149. F32 min_weight = getMinWeight();
  150. F32 max_weight = getMaxWeight();
  151. F32 new_weight = llclamp(weight, min_weight, max_weight);
  152. U8 cur_u8 = F32_to_U8(mCurWeight, min_weight, max_weight);
  153. U8 new_u8 = F32_to_U8(new_weight, min_weight, max_weight);
  154. if (cur_u8 != new_u8)
  155. {
  156. mCurWeight = new_weight;
  157. if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param.
  158. {
  159. if (gAgent.cameraCustomizeAvatar())
  160. {
  161. upload_bake = FALSE;
  162. }
  163. mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);
  164. mTexLayer->invalidateMorphMasks();
  165. }
  166. }
  167. }
  168. void LLTexLayerParamAlpha::setAnimationTarget(F32 target_value, BOOL upload_bake)
  169. // do not animate dummy parameters
  170. if (mIsDummy)
  171. {
  172. setWeight(target_value, upload_bake);
  173. return;
  174. }
  175. mTargetWeight = target_value; 
  176. setWeight(target_value, upload_bake); 
  177. mIsAnimating = TRUE;
  178. if (mNext)
  179. {
  180. mNext->setAnimationTarget(target_value, upload_bake);
  181. }
  182. }
  183. void LLTexLayerParamAlpha::animate(F32 delta, BOOL upload_bake)
  184. {
  185. if (mNext)
  186. {
  187. mNext->animate(delta, upload_bake);
  188. }
  189. }
  190. BOOL LLTexLayerParamAlpha::getSkip() const
  191. {
  192. if (!mTexLayer)
  193. {
  194. return TRUE;
  195. }
  196. const LLVOAvatar *avatar = mTexLayer->getTexLayerSet()->getAvatar();
  197. if (((LLTexLayerParamAlphaInfo *)getInfo())->mSkipIfZeroWeight)
  198. {
  199. F32 effective_weight = (avatar->getSex() & getSex()) ? mCurWeight : getDefaultWeight();
  200. if (is_approx_zero(effective_weight)) 
  201. {
  202. return TRUE;
  203. }
  204. }
  205. EWearableType type = (EWearableType)getWearableType();
  206. if ((type != WT_INVALID) && !avatar->isWearingWearableType(type))
  207. {
  208. return TRUE;
  209. }
  210. return FALSE;
  211. }
  212. BOOL LLTexLayerParamAlpha::render(S32 x, S32 y, S32 width, S32 height)
  213. {
  214. BOOL success = TRUE;
  215. if (!mTexLayer)
  216. {
  217. return success;
  218. }
  219. F32 effective_weight = (mTexLayer->getTexLayerSet()->getAvatar()->getSex() & getSex()) ? mCurWeight : getDefaultWeight();
  220. BOOL weight_changed = effective_weight != mCachedEffectiveWeight;
  221. if (getSkip())
  222. {
  223. return success;
  224. }
  225. LLTexLayerParamAlphaInfo *info = (LLTexLayerParamAlphaInfo *)getInfo();
  226. gGL.flush();
  227. if (info->mMultiplyBlend)
  228. {
  229. gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO); // Multiplication: approximates a min() function
  230. }
  231. else
  232. {
  233. gGL.setSceneBlendType(LLRender::BT_ADD);  // Addition: approximates a max() function
  234. }
  235. if (!info->mStaticImageFileName.empty() && !mStaticImageInvalid)
  236. {
  237. if (mStaticImageTGA.isNull())
  238. {
  239. // Don't load the image file until we actually need it the first time.  Like now.
  240. mStaticImageTGA = LLTexLayerStaticImageList::getInstance()->getImageTGA(info->mStaticImageFileName);  
  241. // We now have something in one of our caches
  242. LLTexLayerSet::sHasCaches |= mStaticImageTGA.notNull() ? TRUE : FALSE;
  243. if (mStaticImageTGA.isNull())
  244. {
  245. llwarns << "Unable to load static file: " << info->mStaticImageFileName << llendl;
  246. mStaticImageInvalid = TRUE; // don't try again.
  247. return FALSE;
  248. }
  249. }
  250. const S32 image_tga_width = mStaticImageTGA->getWidth();
  251. const S32 image_tga_height = mStaticImageTGA->getHeight(); 
  252. if (!mCachedProcessedTexture ||
  253. (mCachedProcessedTexture->getWidth() != image_tga_width) ||
  254. (mCachedProcessedTexture->getHeight() != image_tga_height) ||
  255. (weight_changed))
  256. {
  257. // llinfos << "Building Cached Alpha: " << mName << ": (" << mStaticImageRaw->getWidth() << ", " << mStaticImageRaw->getHeight() << ") " << effective_weight << llendl;
  258. mCachedEffectiveWeight = effective_weight;
  259. if (!mCachedProcessedTexture)
  260. {
  261. mCachedProcessedTexture = LLViewerTextureManager::getLocalTexture(image_tga_width, image_tga_height, 1, FALSE);
  262. // We now have something in one of our caches
  263. LLTexLayerSet::sHasCaches |= mCachedProcessedTexture ? TRUE : FALSE;
  264. mCachedProcessedTexture->setExplicitFormat(GL_ALPHA8, GL_ALPHA);
  265. }
  266. // Applies domain and effective weight to data as it is decoded. Also resizes the raw image if needed.
  267. mStaticImageRaw = NULL;
  268. mStaticImageRaw = new LLImageRaw;
  269. mStaticImageTGA->decodeAndProcess(mStaticImageRaw, info->mDomain, effective_weight);
  270. mNeedsCreateTexture = TRUE;
  271. }
  272. if (mCachedProcessedTexture)
  273. {
  274. {
  275. // Create the GL texture, and then hang onto it for future use.
  276. if (mNeedsCreateTexture)
  277. {
  278. mCachedProcessedTexture->createGLTexture(0, mStaticImageRaw);
  279. mNeedsCreateTexture = FALSE;
  280. gGL.getTexUnit(0)->bind(mCachedProcessedTexture);
  281. mCachedProcessedTexture->setAddressMode(LLTexUnit::TAM_CLAMP);
  282. }
  283. LLGLSNoAlphaTest gls_no_alpha_test;
  284. gGL.getTexUnit(0)->bind(mCachedProcessedTexture);
  285. gl_rect_2d_simple_tex(width, height);
  286. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  287. stop_glerror();
  288. }
  289. }
  290. // Don't keep the cache for other people's avatars
  291. // (It's not really a "cache" in that case, but the logic is the same)
  292. if (!mAvatar->isSelf())
  293. {
  294. mCachedProcessedTexture = NULL;
  295. }
  296. }
  297. else
  298. {
  299. LLGLDisable no_alpha(GL_ALPHA_TEST);
  300. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  301. gGL.color4f(0.f, 0.f, 0.f, effective_weight);
  302. gl_rect_2d_simple(width, height);
  303. }
  304. return success;
  305. }
  306. //-----------------------------------------------------------------------------
  307. // LLTexLayerParamAlphaInfo
  308. //-----------------------------------------------------------------------------
  309. LLTexLayerParamAlphaInfo::LLTexLayerParamAlphaInfo() :
  310. mMultiplyBlend(FALSE),
  311. mSkipIfZeroWeight(FALSE),
  312. mDomain(0.f)
  313. {
  314. }
  315. BOOL LLTexLayerParamAlphaInfo::parseXml(LLXmlTreeNode* node)
  316. {
  317. llassert(node->hasName("param") && node->getChildByName("param_alpha"));
  318. if (!LLViewerVisualParamInfo::parseXml(node))
  319. return FALSE;
  320. LLXmlTreeNode* param_alpha_node = node->getChildByName("param_alpha");
  321. if (!param_alpha_node)
  322. {
  323. return FALSE;
  324. }
  325. static LLStdStringHandle tga_file_string = LLXmlTree::addAttributeString("tga_file");
  326. if (param_alpha_node->getFastAttributeString(tga_file_string, mStaticImageFileName))
  327. {
  328. // Don't load the image file until it's actually needed.
  329. }
  330. // else
  331. // {
  332. // llwarns << "<param_alpha> element is missing tga_file attribute." << llendl;
  333. // }
  334. static LLStdStringHandle multiply_blend_string = LLXmlTree::addAttributeString("multiply_blend");
  335. param_alpha_node->getFastAttributeBOOL(multiply_blend_string, mMultiplyBlend);
  336. static LLStdStringHandle skip_if_zero_string = LLXmlTree::addAttributeString("skip_if_zero");
  337. param_alpha_node->getFastAttributeBOOL(skip_if_zero_string, mSkipIfZeroWeight);
  338. static LLStdStringHandle domain_string = LLXmlTree::addAttributeString("domain");
  339. param_alpha_node->getFastAttributeF32(domain_string, mDomain);
  340. return TRUE;
  341. }
  342. LLTexLayerParamColor::LLTexLayerParamColor(LLTexLayerInterface* layer) :
  343. LLTexLayerParam(layer),
  344. mAvgDistortionVec(1.f, 1.f, 1.f)
  345. {
  346. }
  347. LLTexLayerParamColor::LLTexLayerParamColor(LLVOAvatar *avatar) :
  348. LLTexLayerParam(avatar),
  349. mAvgDistortionVec(1.f, 1.f, 1.f)
  350. {
  351. }
  352. LLTexLayerParamColor::~LLTexLayerParamColor()
  353. {
  354. }
  355. /*virtual*/ LLViewerVisualParam* LLTexLayerParamColor::cloneParam(LLWearable* wearable) const
  356. {
  357. LLTexLayerParamColor *new_param = new LLTexLayerParamColor(mTexLayer);
  358. *new_param = *this;
  359. return new_param;
  360. }
  361. LLColor4 LLTexLayerParamColor::getNetColor() const
  362. {
  363. const LLTexLayerParamColorInfo *info = (LLTexLayerParamColorInfo *)getInfo();
  364. llassert(info->mNumColors >= 1);
  365. F32 effective_weight = (mAvatar && (mAvatar->getSex() & getSex())) ? mCurWeight : getDefaultWeight();
  366. S32 index_last = info->mNumColors - 1;
  367. F32 scaled_weight = effective_weight * index_last;
  368. S32 index_start = (S32) scaled_weight;
  369. S32 index_end = index_start + 1;
  370. if (index_start == index_last)
  371. {
  372. return info->mColors[index_last];
  373. }
  374. else
  375. {
  376. F32 weight = scaled_weight - index_start;
  377. const LLColor4 *start = &info->mColors[ index_start ];
  378. const LLColor4 *end   = &info->mColors[ index_end ];
  379. return LLColor4((1.f - weight) * start->mV[VX] + weight * end->mV[VX],
  380. (1.f - weight) * start->mV[VY] + weight * end->mV[VY],
  381. (1.f - weight) * start->mV[VZ] + weight * end->mV[VZ],
  382. (1.f - weight) * start->mV[VW] + weight * end->mV[VW]);
  383. }
  384. }
  385. void LLTexLayerParamColor::setWeight(F32 weight, BOOL upload_bake)
  386. {
  387. if (mIsAnimating)
  388. {
  389. return;
  390. }
  391. const LLTexLayerParamColorInfo *info = (LLTexLayerParamColorInfo *)getInfo();
  392. F32 min_weight = getMinWeight();
  393. F32 max_weight = getMaxWeight();
  394. F32 new_weight = llclamp(weight, min_weight, max_weight);
  395. U8 cur_u8 = F32_to_U8(mCurWeight, min_weight, max_weight);
  396. U8 new_u8 = F32_to_U8(new_weight, min_weight, max_weight);
  397. if (cur_u8 != new_u8)
  398. {
  399. mCurWeight = new_weight;
  400. if (info->mNumColors <= 0)
  401. {
  402. // This will happen when we set the default weight the first time.
  403. return;
  404. }
  405. if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param.
  406. {
  407. onGlobalColorChanged(upload_bake);
  408. if (mTexLayer)
  409. {
  410. mAvatar->invalidateComposite(mTexLayer->getTexLayerSet(), upload_bake);
  411. }
  412. }
  413. // llinfos << "param " << mName << " = " << new_weight << llendl;
  414. }
  415. }
  416. void LLTexLayerParamColor::setAnimationTarget(F32 target_value, BOOL upload_bake)
  417. // set value first then set interpolating flag to ignore further updates
  418. mTargetWeight = target_value; 
  419. setWeight(target_value, upload_bake);
  420. mIsAnimating = TRUE;
  421. if (mNext)
  422. {
  423. mNext->setAnimationTarget(target_value, upload_bake);
  424. }
  425. }
  426. void LLTexLayerParamColor::animate(F32 delta, BOOL upload_bake)
  427. {
  428. if (mNext)
  429. {
  430. mNext->animate(delta, upload_bake);
  431. }
  432. }
  433. //-----------------------------------------------------------------------------
  434. // LLTexLayerParamColorInfo
  435. //-----------------------------------------------------------------------------
  436. LLTexLayerParamColorInfo::LLTexLayerParamColorInfo() :
  437. mOperation(LLTexLayerParamColor::OP_ADD),
  438. mNumColors(0)
  439. {
  440. }
  441. BOOL LLTexLayerParamColorInfo::parseXml(LLXmlTreeNode *node)
  442. {
  443. llassert(node->hasName("param") && node->getChildByName("param_color"));
  444. if (!LLViewerVisualParamInfo::parseXml(node))
  445. return FALSE;
  446. LLXmlTreeNode* param_color_node = node->getChildByName("param_color");
  447. if (!param_color_node)
  448. {
  449. return FALSE;
  450. }
  451. std::string op_string;
  452. static LLStdStringHandle operation_string = LLXmlTree::addAttributeString("operation");
  453. if (param_color_node->getFastAttributeString(operation_string, op_string))
  454. {
  455. LLStringUtil::toLower(op_string);
  456. if (op_string == "add")  mOperation = LLTexLayerParamColor::OP_ADD;
  457. else if (op_string == "multiply") mOperation = LLTexLayerParamColor::OP_MULTIPLY;
  458. else if (op_string == "blend")     mOperation = LLTexLayerParamColor::OP_BLEND;
  459. }
  460. mNumColors = 0;
  461. LLColor4U color4u;
  462. for (LLXmlTreeNode* child = param_color_node->getChildByName("value");
  463.  child;
  464.  child = param_color_node->getNextNamedChild())
  465. {
  466. if ((mNumColors < MAX_COLOR_VALUES))
  467. {
  468. static LLStdStringHandle color_string = LLXmlTree::addAttributeString("color");
  469. if (child->getFastAttributeColor4U(color_string, color4u))
  470. {
  471. mColors[ mNumColors ].setVec(color4u);
  472. mNumColors++;
  473. }
  474. }
  475. }
  476. if (!mNumColors)
  477. {
  478. llwarns << "<param_color> is missing <value> sub-elements" << llendl;
  479. return FALSE;
  480. }
  481. if ((mOperation == LLTexLayerParamColor::OP_BLEND) && (mNumColors != 1))
  482. {
  483. llwarns << "<param_color> with operation"blend" must have exactly one <value>" << llendl;
  484. return FALSE;
  485. }
  486. return TRUE;
  487. }