00001
00032 #ifndef LL_LLTEXLAYER_H
00033 #define LL_LLTEXLAYER_H
00034
00035 #include <deque>
00036 #include "llassetstorage.h"
00037 #include "lldynamictexture.h"
00038 #include "llrect.h"
00039 #include "llstring.h"
00040 #include "lluuid.h"
00041 #include "llviewerimage.h"
00042 #include "llviewervisualparam.h"
00043 #include "llvoavatar.h"
00044 #include "llwearable.h"
00045 #include "v4color.h"
00046 #include "llfloater.h"
00047
00048 class LLTexLayerSetInfo;
00049 class LLTexLayerSet;
00050 class LLTexLayerInfo;
00051 class LLTexLayer;
00052 class LLImageGL;
00053 class LLImageTGA;
00054 class LLTexGlobalColorInfo;
00055 class LLTexLayerParamAlphaInfo;
00056 class LLTexLayerParamAlpha;
00057 class LLTexParamColorInfo;
00058 class LLTexParamColor;
00059 class LLPolyMesh;
00060 class LLXmlTreeNode;
00061 class LLImageRaw;
00062 class LLPolyMorphTarget;
00063
00064 class LLTextureCtrl;
00065 class LLVOAvatar;
00066
00067
00068 enum EColorOperation
00069 {
00070 OP_ADD = 0,
00071 OP_MULTIPLY = 1,
00072 OP_BLEND = 2,
00073 OP_COUNT = 3
00074 };
00075
00076
00077
00078
00079
00080 class LLTexLayerParamAlphaInfo : public LLViewerVisualParamInfo
00081 {
00082 friend class LLTexLayerParamAlpha;
00083 public:
00084 LLTexLayerParamAlphaInfo();
00085 ~LLTexLayerParamAlphaInfo() {};
00086
00087 BOOL parseXml(LLXmlTreeNode* node);
00088
00089 protected:
00090 LLString mStaticImageFileName;
00091 BOOL mMultiplyBlend;
00092 BOOL mSkipIfZeroWeight;
00093 F32 mDomain;
00094 };
00095
00096
00097
00098
00099 class LLTexParamColorInfo : public LLViewerVisualParamInfo
00100 {
00101 friend class LLTexParamColor;
00102
00103 public:
00104 LLTexParamColorInfo();
00105 virtual ~LLTexParamColorInfo() {};
00106 BOOL parseXml( LLXmlTreeNode* node );
00107
00108 protected:
00109 enum { MAX_COLOR_VALUES = 20 };
00110 EColorOperation mOperation;
00111 LLColor4 mColors[MAX_COLOR_VALUES];
00112 S32 mNumColors;
00113 };
00114
00115
00116
00117
00118 class LLTexGlobalColorInfo
00119 {
00120 friend class LLTexGlobalColor;
00121 public:
00122 LLTexGlobalColorInfo();
00123 ~LLTexGlobalColorInfo();
00124
00125 BOOL parseXml(LLXmlTreeNode* node);
00126
00127 protected:
00128 typedef std::vector<LLTexParamColorInfo *> color_info_list_t;
00129 color_info_list_t mColorInfoList;
00130 LLString mName;
00131 };
00132
00133
00134
00135
00136
00137 class LLTexLayerSetInfo
00138 {
00139 friend class LLTexLayerSet;
00140 public:
00141 LLTexLayerSetInfo();
00142 ~LLTexLayerSetInfo();
00143
00144 BOOL parseXml(LLXmlTreeNode* node);
00145
00146 protected:
00147 LLString mBodyRegion;
00148 S32 mWidth;
00149 S32 mHeight;
00150 LLString mStaticAlphaFileName;
00151 BOOL mClearAlpha;
00152
00153 typedef std::vector<LLTexLayerInfo*> layer_info_list_t;
00154 layer_info_list_t mLayerInfoList;
00155 };
00156
00157
00158
00159
00160 enum ERenderPass
00161 {
00162 RP_COLOR,
00163 RP_BUMP,
00164 RP_SHINE
00165 };
00166
00167 class LLTexLayerInfo
00168 {
00169 friend class LLTexLayer;
00170 public:
00171 LLTexLayerInfo();
00172 ~LLTexLayerInfo();
00173
00174 BOOL parseXml(LLXmlTreeNode* node);
00175
00176 protected:
00177 LLString mName;
00178
00179 BOOL mWriteAllChannels;
00180 ERenderPass mRenderPass;
00181
00182 LLString mGlobalColor;
00183 LLColor4 mFixedColor;
00184
00185 S32 mLocalTexture;
00186 LLString mStaticImageFileName;
00187 BOOL mStaticImageIsMask;
00188 BOOL mUseLocalTextureAlphaOnly;
00189
00190 typedef std::vector<std::pair<LLString,BOOL> > morph_name_list_t;
00191 morph_name_list_t mMorphNameList;
00192
00193 typedef std::vector<LLTexParamColorInfo*> color_info_list_t;
00194 color_info_list_t mColorInfoList;
00195
00196 typedef std::vector<LLTexLayerParamAlphaInfo*> alpha_info_list_t;
00197 alpha_info_list_t mAlphaInfoList;
00198
00199 };
00200
00201
00202
00203
00204
00205 class LLTexLayerSetBuffer : public LLDynamicTexture
00206 {
00207 public:
00208 LLTexLayerSetBuffer( LLTexLayerSet* owner, S32 width, S32 height, BOOL has_bump );
00209 virtual ~LLTexLayerSetBuffer();
00210
00211 virtual void preRender(BOOL clear_depth);
00212 virtual void postRender(BOOL success);
00213 virtual BOOL render();
00214 BOOL updateImmediate();
00215 virtual void bindTexture();
00216 void bindBumpTexture( U32 stage );
00217 BOOL isInitialized() { return mInitialized; }
00218 BOOL needsRender();
00219 void requestUpdate();
00220 void requestUpload();
00221 void cancelUpload();
00222 BOOL uploadPending() { return mUploadPending; }
00223 BOOL render( S32 x, S32 y, S32 width, S32 height );
00224 void readBackAndUpload(U8* baked_bump_data);
00225 static void onTextureUploadComplete( const LLUUID& uuid,
00226 void* userdata,
00227 S32 result, LLExtStat ext_status);
00228 static void dumpTotalByteCount();
00229
00230 private:
00231 void pushProjection();
00232 void popProjection();
00233
00234 private:
00235 BOOL mNeedsUpdate;
00236 BOOL mNeedsUpload;
00237 BOOL mUploadPending;
00238 LLUUID mUploadID;
00239 LLTexLayerSet* mTexLayerSet;
00240 BOOL mInitialized;
00241 LLGLuint mBumpTexName;
00242
00243 static S32 sGLByteCount;
00244 static S32 sGLBumpByteCount;
00245 };
00246
00247
00248
00249
00250
00251 class LLTexLayerSet
00252 {
00253 public:
00254 LLTexLayerSet( LLVOAvatar* avatar );
00255 ~LLTexLayerSet();
00256
00257
00258 LLTexLayerSetInfo* getInfo() const { return mInfo; }
00259
00260 BOOL setInfo(LLTexLayerSetInfo *info);
00261
00262 BOOL render( S32 x, S32 y, S32 width, S32 height );
00263 BOOL renderBump( S32 x, S32 y, S32 width,S32 height );
00264 BOOL isBodyRegion( const char* region ) { return mInfo->mBodyRegion == region; }
00265 LLTexLayerSetBuffer* getComposite();
00266 void requestUpdate();
00267 void requestUpload();
00268 void cancelUpload();
00269 LLVOAvatar* getAvatar() { return mAvatar; }
00270 void updateComposite();
00271 BOOL isLocalTextureDataAvailable();
00272 BOOL isLocalTextureDataFinal();
00273 void createComposite();
00274 void destroyComposite();
00275 void setUpdatesEnabled( BOOL b );
00276 BOOL getUpdatesEnabled() { return mUpdatesEnabled; }
00277 void deleteCaches();
00278 void gatherAlphaMasks(U8 *data, S32 width, S32 height);
00279 void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components);
00280 const LLString& getBodyRegion() { return mInfo->mBodyRegion; }
00281 BOOL hasComposite() { return (mComposite != NULL); }
00282 void setBump( BOOL b ) { mHasBump = b; }
00283 BOOL hasBump() { return mHasBump; }
00284
00285 public:
00286 static BOOL sHasCaches;
00287
00288 protected:
00289 typedef std::vector<LLTexLayer *> layer_list_t;
00290 layer_list_t mLayerList;
00291 LLTexLayerSetBuffer* mComposite;
00292
00293 LLVOAvatar* mAvatar;
00294 BOOL mUpdatesEnabled;
00295 BOOL mHasBump;
00296
00297 LLTexLayerSetInfo *mInfo;
00298 };
00299
00300
00301
00302
00303
00304 class LLMaskedMorph
00305 {
00306 public:
00307 LLMaskedMorph( LLPolyMorphTarget *morph_target, BOOL invert );
00308
00309 public:
00310 LLPolyMorphTarget *mMorphTarget;
00311 BOOL mInvert;
00312 };
00313
00314
00315
00316
00317
00318 class LLTexLayer
00319 {
00320 public:
00321 LLTexLayer( LLTexLayerSet* layer_set );
00322 ~LLTexLayer();
00323
00324
00325 LLTexLayerInfo* getInfo() const { return mInfo; }
00326
00327 BOOL setInfo(LLTexLayerInfo *info);
00328
00329 BOOL render( S32 x, S32 y, S32 width, S32 height );
00330 void requestUpdate();
00331 LLTexLayerSet* getTexLayerSet() { return mTexLayerSet; }
00332
00333 const std::string& getName() { return mInfo->mName; }
00334
00335 void addMaskedMorph(LLPolyMorphTarget* morph_target, BOOL invert);
00336 void deleteCaches();
00337 U8* getAlphaData();
00338 void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components);
00339
00340 void invalidateMorphMasks();
00341 ERenderPass getRenderPass() { return mInfo->mRenderPass; }
00342 const LLString& getGlobalColor() { return mInfo->mGlobalColor; }
00343 BOOL findNetColor( LLColor4* color );
00344 BOOL renderImageRaw( U8* in_data, S32 in_width, S32 in_height, S32 in_components, S32 width, S32 height, BOOL is_mask );
00345 BOOL renderAlphaMasks( S32 x, S32 y, S32 width, S32 height, LLColor4* colorp );
00346 BOOL hasAlphaParams() { return (!mParamAlphaList.empty());}
00347
00348 protected:
00349 LLTexLayerSet* mTexLayerSet;
00350 LLPointer<LLImageRaw> mStaticImageRaw;
00351
00352
00353 typedef std::vector<LLTexParamColor *> color_list_t;
00354 color_list_t mParamColorList;
00355
00356
00357
00358 typedef std::vector<LLTexLayerParamAlpha *> alpha_list_t;
00359 alpha_list_t mParamAlphaList;
00360
00361
00362 typedef std::deque<LLMaskedMorph> morph_list_t;
00363 morph_list_t mMaskedMorphs;
00364 typedef std::map<U32, U8*> alpha_cache_t;
00365 alpha_cache_t mAlphaCache;
00366 BOOL mMorphMasksValid;
00367 BOOL mStaticImageInvalid;
00368
00369 LLTexLayerInfo *mInfo;
00370 };
00371
00372
00373
00374
00375 class LLTexLayerParamAlpha : public LLViewerVisualParam
00376 {
00377 public:
00378 LLTexLayerParamAlpha( LLTexLayer* layer );
00379 ~LLTexLayerParamAlpha();
00380
00381
00382 LLTexLayerParamAlphaInfo* getInfo() const { return (LLTexLayerParamAlphaInfo*)mInfo; }
00383
00384 BOOL setInfo(LLTexLayerParamAlphaInfo *info);
00385
00386
00388 void apply( ESex avatar_sex ) {}
00389 void setWeight(F32 weight, BOOL set_by_user);
00390 void setAnimationTarget(F32 target_value, BOOL set_by_user);
00391 void animate(F32 delta, BOOL set_by_user);
00392
00393
00394 F32 getTotalDistortion() { return 1.f; }
00395 const LLVector3& getAvgDistortion() { return mAvgDistortionVec; }
00396 F32 getMaxDistortion() { return 3.f; }
00397 LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh) { return LLVector3(1.f, 1.f, 1.f);}
00398 const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return &mAvgDistortionVec;};
00399 const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return NULL;};
00400
00401
00402 BOOL render( S32 x, S32 y, S32 width, S32 height );
00403 BOOL getSkip();
00404 void deleteCaches();
00405 LLTexLayer* getTexLayer() { return mTexLayer; }
00406 BOOL getMultiplyBlend() { return getInfo()->mMultiplyBlend; }
00407
00408 protected:
00409 LLPointer<LLImageGL> mCachedProcessedImageGL;
00410 LLTexLayer* mTexLayer;
00411 LLPointer<LLImageTGA> mStaticImageTGA;
00412 LLPointer<LLImageRaw> mStaticImageRaw;
00413 BOOL mNeedsCreateTexture;
00414 BOOL mStaticImageInvalid;
00415 LLVector3 mAvgDistortionVec;
00416 F32 mCachedEffectiveWeight;
00417
00418 public:
00419
00420 static void dumpCacheByteCount();
00421 static void getCacheByteCount( S32* gl_bytes );
00422
00423 typedef std::list< LLTexLayerParamAlpha* > param_alpha_ptr_list_t;
00424 static param_alpha_ptr_list_t sInstances;
00425 };
00426
00427
00428
00429
00430
00431 class LLTexGlobalColor
00432 {
00433 public:
00434 LLTexGlobalColor( LLVOAvatar* avatar );
00435 ~LLTexGlobalColor();
00436
00437
00438 LLTexGlobalColorInfo* getInfo() const { return mInfo; }
00439
00440 BOOL setInfo(LLTexGlobalColorInfo *info);
00441
00442 void requstUpdate();
00443 LLVOAvatar* getAvatar() { return mAvatar; }
00444 LLColor4 getColor();
00445 const std::string& getName() { return mInfo->mName; }
00446
00447 protected:
00448 typedef std::vector<LLTexParamColor *> param_list_t;
00449 param_list_t mParamList;
00450 LLVOAvatar* mAvatar;
00451
00452 LLTexGlobalColorInfo *mInfo;
00453 };
00454
00455
00456
00457
00458
00459 class LLTexParamColor : public LLViewerVisualParam
00460 {
00461 public:
00462 LLTexParamColor( LLTexGlobalColor* tex_color );
00463 LLTexParamColor( LLTexLayer* layer );
00464 ~LLTexParamColor();
00465
00466
00467 LLTexParamColorInfo* getInfo() const { return (LLTexParamColorInfo*)mInfo; }
00468
00469 BOOL setInfo(LLTexParamColorInfo *info);
00470
00471
00473 void apply( ESex avatar_sex ) {}
00474 void setWeight(F32 weight, BOOL set_by_user);
00475 void setAnimationTarget(F32 target_value, BOOL set_by_user);
00476 void animate(F32 delta, BOOL set_by_user);
00477
00478
00479
00480 F32 getTotalDistortion() { return 1.f; }
00481 const LLVector3& getAvgDistortion() { return mAvgDistortionVec; }
00482 F32 getMaxDistortion() { return 3.f; }
00483 LLVector3 getVertexDistortion(S32 index, LLPolyMesh *poly_mesh) { return LLVector3(1.f, 1.f, 1.f); }
00484 const LLVector3* getFirstDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return &mAvgDistortionVec;};
00485 const LLVector3* getNextDistortion(U32 *index, LLPolyMesh **poly_mesh) { index = 0; poly_mesh = NULL; return NULL;};
00486
00487
00488 LLColor4 getNetColor();
00489 EColorOperation getOperation() const { return getInfo()->mOperation; }
00490
00491
00492 protected:
00493 LLVector3 mAvgDistortionVec;
00494 LLTexGlobalColor* mTexGlobalColor;
00495 LLTexLayer* mTexLayer;
00496 LLVOAvatar* mAvatar;
00497 };
00498
00499
00500
00501
00502
00503 class LLTexStaticImageList
00504 {
00505 public:
00506 LLTexStaticImageList();
00507 ~LLTexStaticImageList();
00508
00509 LLImageRaw* getImageRaw( const LLString& file_name );
00510 LLImageGL* getImageGL( const LLString& file_name, BOOL is_mask );
00511 LLImageTGA* getImageTGA( const LLString& file_name );
00512
00513 void deleteCachedImages();
00514 void dumpByteCount();
00515
00516 private:
00517 BOOL loadImageRaw( const LLString& file_name, LLImageRaw* image_raw );
00518
00519 private:
00520 static LLStringTable sImageNames;
00521
00522 typedef std::map< const char *, LLPointer<LLImageGL> > image_gl_map_t;
00523 typedef std::map< const char *, LLPointer<LLImageTGA> > image_tga_map_t;
00524 image_gl_map_t mStaticImageListGL;
00525 image_tga_map_t mStaticImageListTGA;
00526
00527 public:
00528 S32 mGLBytes;
00529 S32 mTGABytes;
00530 };
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554 class LLGradientPaletteList
00555 {
00556 public:
00557 LLGradientPaletteList() {}
00558 ~LLGradientPaletteList();
00559
00560 void initPalette(F32 domain);
00561 void setHardwarePalette(F32 domain, F32 effective_weight);
00562
00563 private:
00564 typedef std::map<F32, U8*> palette_map_t;
00565 palette_map_t mPaletteMap;
00566 };
00567
00568
00569 class LLBakedUploadData
00570 {
00571 public:
00572 LLBakedUploadData( LLVOAvatar* avatar, LLTexLayerSetBuffer* layerset_buffer );
00573 ~LLBakedUploadData() {}
00574
00575 LLUUID mID;
00576 LLVOAvatar* mAvatar;
00577 LLTexLayerSetBuffer* mLayerSetBuffer;
00578 LLUUID mWearableAssets[WT_COUNT];
00579 };
00580
00581 extern LLTexStaticImageList gTexStaticImageList;
00582
00583
00584 #endif // LL_LLTEXLAYER_H