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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltexlayer.h
  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. #ifndef LL_LLTEXLAYER_H
  33. #define LL_LLTEXLAYER_H
  34. #include <deque>
  35. #include "lldynamictexture.h"
  36. #include "llwearable.h"
  37. #include "llvoavatardefines.h"
  38. class LLVOAvatar;
  39. class LLVOAvatarSelf;
  40. class LLImageTGA;
  41. class LLImageRaw;
  42. class LLXmlTreeNode;
  43. class LLPolyMorphTarget;
  44. class LLTexLayerSet;
  45. class LLTexLayerSetInfo;
  46. class LLTexLayerInfo;
  47. class LLTexLayerSetBuffer;
  48. class LLTexLayerParamColor;
  49. class LLTexLayerParamColorInfo;
  50. class LLTexLayerParamAlpha;
  51. class LLTexLayerParamAlphaInfo;
  52. class LLWearable;
  53. class LLViewerVisualParam;
  54. typedef std::vector<LLTexLayerParamColor *> param_color_list_t;
  55. typedef std::vector<LLTexLayerParamAlpha *> param_alpha_list_t;
  56. typedef std::vector<LLTexLayerParamColorInfo *> param_color_info_list_t;
  57. typedef std::vector<LLTexLayerParamAlphaInfo *> param_alpha_info_list_t;
  58. //-----------------------------------------------------------------------------
  59. // LLTexLayerInterface
  60. // Interface class to generalize functionality shared by LLTexLayer and LLTexLayerTemplate.
  61. class LLTexLayerInterface 
  62. {
  63. public:
  64. enum ERenderPass 
  65. {
  66. RP_COLOR,
  67. RP_BUMP,
  68. RP_SHINE
  69. };
  70. LLTexLayerInterface(LLTexLayerSet* const layer_set);
  71. LLTexLayerInterface(const LLTexLayerInterface &layer, LLWearable *wearable);
  72. virtual ~LLTexLayerInterface() {}
  73. const LLTexLayerInfo*  getInfo() const { return mInfo; }
  74. virtual BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions
  75. virtual BOOL render(S32 x, S32 y, S32 width, S32 height) = 0;
  76. void requestUpdate();
  77. LLTexLayerSet* const getTexLayerSet() const { return mTexLayerSet; }
  78. virtual void deleteCaches() = 0;
  79. void invalidateMorphMasks();
  80. virtual void setHasMorph(BOOL newval) { mHasMorph = newval; }
  81. BOOL hasMorph()  { return mHasMorph; }
  82. BOOL isMorphValid()  { return mMorphMasksValid; }
  83. const std::string& getName() const;
  84. ERenderPass getRenderPass() const;
  85. const std::string& getGlobalColor() const;
  86. virtual BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height) = 0;
  87. virtual void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) = 0;
  88. BOOL hasAlphaParams() const { return !mParamAlphaList.empty(); }
  89. BOOL isVisibilityMask() const;
  90. virtual BOOL isInvisibleAlphaMask() = 0;
  91. LLTexLayerSet* getLayerSet() {return mTexLayerSet;}
  92. LLViewerVisualParam* getVisualParamPtr(S32 index);
  93. protected:
  94. LLTexLayerSet* const mTexLayerSet;
  95. // Layers can have either mParamColorList, mGlobalColor, or mFixedColor.  They are looked for in that order.
  96. param_color_list_t mParamColorList;
  97. //  mGlobalColor name stored in mInfo
  98. //  mFixedColor value stored in mInfo
  99. param_alpha_list_t mParamAlphaList;
  100. BOOL mMorphMasksValid;
  101. BOOL mStaticImageInvalid;
  102. BOOL mHasMorph;
  103. const LLTexLayerInfo *mInfo;
  104. };
  105. //-----------------------------------------------------------------------------
  106. // LLTexLayerTemplate
  107. // Template class 
  108. // Only exists for llvoavatarself
  109. class LLTexLayerTemplate : public LLTexLayerInterface
  110. {
  111. public:
  112. LLTexLayerTemplate(LLTexLayerSet* const layer_set);
  113. LLTexLayerTemplate(const LLTexLayerTemplate &layer);
  114. /*virtual*/ ~LLTexLayerTemplate();
  115. /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height);
  116. /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions
  117. /*virtual*/ BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer
  118. /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height);
  119. /*virtual*/ void setHasMorph(BOOL newval);
  120. /*virtual*/ void deleteCaches();
  121. /*virtual*/ BOOL isInvisibleAlphaMask();
  122. private:
  123. U32  updateWearableCache();
  124. LLTexLayer* getLayer(U32 i);
  125. typedef std::vector<LLWearable*> wearable_cache_t;
  126. wearable_cache_t mWearableCache;
  127. };
  128. //-----------------------------------------------------------------------------
  129. // LLTexLayer
  130. // A single texture layer
  131. // Only exists for llvoavatarself
  132. class LLTexLayer : public LLTexLayerInterface
  133. {
  134. public:
  135. LLTexLayer(LLTexLayerSet* const layer_set);
  136. LLTexLayer(const LLTexLayer &layer, LLWearable *wearable);
  137. LLTexLayer(const LLTexLayerTemplate &layer_template, LLLocalTextureObject *lto, LLWearable *wearable);
  138. /*virtual*/ ~LLTexLayer();
  139. /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions
  140. /*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height);
  141. /*virtual*/ void deleteCaches();
  142. U8* getAlphaData();
  143. BOOL findNetColor(LLColor4* color) const;
  144. /*virtual*/ BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer
  145. /*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height);
  146. BOOL renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color);
  147. void addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height);
  148. /*virtual*/ BOOL isInvisibleAlphaMask();
  149. void setLTO(LLLocalTextureObject *lto) { mLocalTextureObject = lto; }
  150. LLLocalTextureObject*  getLTO() { return mLocalTextureObject; }
  151. static void calculateTexLayerColor(const param_color_list_t &param_list, LLColor4 &net_color);
  152. private:
  153. LLUUID getUUID();
  154. typedef std::map<U32, U8*> alpha_cache_t;
  155. alpha_cache_t mAlphaCache;
  156. LLLocalTextureObject  *mLocalTextureObject;
  157. };
  158. // Make private
  159. class LLTexLayerInfo
  160. {
  161. friend class LLTexLayer;
  162. friend class LLTexLayerTemplate;
  163. friend class LLTexLayerInterface;
  164. public:
  165. LLTexLayerInfo();
  166. ~LLTexLayerInfo();
  167. BOOL parseXml(LLXmlTreeNode* node);
  168. BOOL createVisualParams(LLVOAvatar *avatar);
  169. BOOL isUserSettable() { return mLocalTexture != -1; }
  170. S32  getLocalTexture() const { return mLocalTexture; }
  171. BOOL getOnlyAlpha() const { return mUseLocalTextureAlphaOnly; }
  172. std::string getName() const { return mName; }
  173. private:
  174. std::string mName;
  175. BOOL mWriteAllChannels; // Don't use masking.  Just write RGBA into buffer,
  176. LLTexLayer::ERenderPass mRenderPass;
  177. std::string mGlobalColor;
  178. LLColor4 mFixedColor;
  179. S32 mLocalTexture;
  180. std::string mStaticImageFileName;
  181. BOOL mStaticImageIsMask;
  182. BOOL mUseLocalTextureAlphaOnly; // Ignore RGB channels from the input texture.  Use alpha as a mask
  183. BOOL mIsVisibilityMask;
  184. typedef std::vector< std::pair< std::string,BOOL > > morph_name_list_t;
  185. morph_name_list_t     mMorphNameList;
  186. param_color_info_list_t mParamColorInfoList;
  187. param_alpha_info_list_t mParamAlphaInfoList;
  188. };
  189. //
  190. // LLTexLayer
  191. //-----------------------------------------------------------------------------
  192. //-----------------------------------------------------------------------------
  193. // LLTexLayerSet
  194. // An ordered set of texture layers that get composited into a single texture.
  195. // Only exists for llvoavatarself
  196. class LLTexLayerSet
  197. {
  198. friend class LLTexLayerSetBuffer;
  199. public:
  200. LLTexLayerSet(LLVOAvatarSelf* const avatar);
  201. ~LLTexLayerSet();
  202. const LLTexLayerSetInfo*  getInfo() const { return mInfo; }
  203. BOOL setInfo(const LLTexLayerSetInfo *info); // This sets mInfo and calls initialization functions
  204. BOOL render(S32 x, S32 y, S32 width, S32 height);
  205. void renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear = false);
  206. BOOL isBodyRegion(const std::string& region) const;
  207. LLTexLayerSetBuffer* getComposite();
  208. void requestUpdate();
  209. void requestUpload();
  210. void cancelUpload();
  211. void updateComposite();
  212. BOOL isLocalTextureDataAvailable() const;
  213. BOOL isLocalTextureDataFinal() const;
  214. void createComposite();
  215. void destroyComposite();
  216. void setUpdatesEnabled(BOOL b);
  217. BOOL getUpdatesEnabled() const { return mUpdatesEnabled; }
  218. void deleteCaches();
  219. void gatherMorphMaskAlpha(U8 *data, S32 width, S32 height);
  220. void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components);
  221. BOOL isMorphValid();
  222. void invalidateMorphMasks();
  223. LLTexLayerInterface* findLayerByName(const std::string& name);
  224. void cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable* wearable);
  225. LLVOAvatarSelf*     getAvatar() const { return mAvatar; }
  226. const std::string getBodyRegion() const;
  227. BOOL hasComposite() const { return (mComposite.notNull()); }
  228. LLVOAvatarDefines::EBakedTextureIndex getBakedTexIndex() { return mBakedTexIndex; }
  229. void setBakedTexIndex( LLVOAvatarDefines::EBakedTextureIndex index) { mBakedTexIndex = index; }
  230. BOOL isVisible() const { return mIsVisible; }
  231. public:
  232. static BOOL sHasCaches;
  233. typedef std::vector<LLTexLayerInterface *> layer_list_t;
  234. private:
  235. layer_list_t mLayerList;
  236. layer_list_t mMaskLayerList;
  237. LLPointer<LLTexLayerSetBuffer> mComposite;
  238. LLVOAvatarSelf* const mAvatar; // Backlink only; don't make this an LLPointer.
  239. BOOL mUpdatesEnabled;
  240. BOOL mIsVisible;
  241. LLVOAvatarDefines::EBakedTextureIndex mBakedTexIndex;
  242. const LLTexLayerSetInfo  *mInfo;
  243. };
  244. // Contains shared layer set data
  245. class LLTexLayerSetInfo
  246. {
  247. friend class LLTexLayerSet;
  248. public:
  249. LLTexLayerSetInfo();
  250. ~LLTexLayerSetInfo();
  251. BOOL parseXml(LLXmlTreeNode* node);
  252. void createVisualParams(LLVOAvatar *avatar);
  253. private:
  254. std::string mBodyRegion;
  255. S32 mWidth;
  256. S32 mHeight;
  257. std::string mStaticAlphaFileName;
  258. BOOL mClearAlpha; // Set alpha to 1 for this layerset (if there is no mStaticAlphaFileName)
  259. typedef std::vector<LLTexLayerInfo*> layer_info_list_t;
  260. layer_info_list_t mLayerInfoList;
  261. };
  262. // The composite image that a LLTexLayerSet writes to.  Each LLTexLayerSet has one.
  263. class LLTexLayerSetBuffer : public LLViewerDynamicTexture
  264. {
  265. public:
  266. LLTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height);
  267. virtual ~LLTexLayerSetBuffer();
  268. virtual void preRender(BOOL clear_depth);
  269. virtual void postRender(BOOL success);
  270. virtual BOOL render();
  271. BOOL updateImmediate();
  272. bool isInitialized(void) const;
  273. BOOL needsRender();
  274. void requestUpdate();
  275. void requestUpload();
  276. void cancelUpload();
  277. BOOL uploadPending() { return mUploadPending; }
  278. BOOL render( S32 x, S32 y, S32 width, S32 height );
  279. void readBackAndUpload();
  280. static void onTextureUploadComplete(const LLUUID& uuid,
  281. void* userdata,
  282. S32 result, LLExtStat ext_status);
  283. static void dumpTotalByteCount();
  284. virtual void restoreGLTexture();
  285. virtual void destroyGLTexture();
  286. private:
  287. void pushProjection() const;
  288. void popProjection() const;
  289. private:
  290. LLTexLayerSet* const    mTexLayerSet;
  291. BOOL mNeedsUpdate;
  292. BOOL mNeedsUpload;
  293. BOOL mUploadPending;
  294. LLUUID mUploadID; // Identifys the current upload process (null if none).  Used to avoid overlaps (eg, when the user rapidly makes two changes outside of Face Edit)
  295. static S32 sGLByteCount;
  296. };
  297. //
  298. // LLTexLayerSet
  299. //-----------------------------------------------------------------------------
  300. //-----------------------------------------------------------------------------
  301. // LLTexLayerStaticImageList
  302. //
  303. class LLTexLayerStaticImageList : public LLSingleton<LLTexLayerStaticImageList>
  304. {
  305. public:
  306. LLTexLayerStaticImageList();
  307. ~LLTexLayerStaticImageList();
  308. LLViewerTexture* getTexture(const std::string& file_name, BOOL is_mask);
  309. LLImageTGA* getImageTGA(const std::string& file_name);
  310. void deleteCachedImages();
  311. void dumpByteCount();
  312. private:
  313. BOOL loadImageRaw(const std::string& file_name, LLImageRaw* image_raw);
  314. private:
  315. LLStringTable mImageNames;
  316. typedef std::map< const char*, LLPointer<LLViewerTexture> > texture_map_t;
  317. texture_map_t mStaticImageList;
  318. typedef std::map< const char*, LLPointer<LLImageTGA> > image_tga_map_t;
  319. image_tga_map_t mStaticImageListTGA;
  320. S32 mGLBytes;
  321. S32 mTGABytes;
  322. };
  323. // Used by LLTexLayerSetBuffer for a callback.
  324. // Note to anyone merging branches - this supercedes the previous fix
  325. // for DEV-31590 "Heap corruption and crash after outfit changes",
  326. // here and in lltexlayer.cpp. Equally correct and a bit simpler.
  327. class LLBakedUploadData
  328. {
  329. public:
  330. LLBakedUploadData(const LLVOAvatarSelf* avatar, LLTexLayerSet* layerset, const LLUUID& id);
  331. ~LLBakedUploadData() {}
  332. const LLUUID mID;
  333. const LLVOAvatarSelf* mAvatar;  // just backlink, don't LLPointer 
  334. LLTexLayerSet* mTexLayerSet;
  335.     const U64 mStartTime; // Used to measure time baked texture upload requires
  336. };
  337. #endif  // LL_LLTEXLAYER_H