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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llface.h
  3.  * @brief LLFace class definition
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLFACE_H
  33. #define LL_LLFACE_H
  34. #include "llstrider.h"
  35. #include "llrender.h"
  36. #include "v2math.h"
  37. #include "v3math.h"
  38. #include "v4math.h"
  39. #include "m4math.h"
  40. #include "v4coloru.h"
  41. #include "llquaternion.h"
  42. #include "xform.h"
  43. #include "lldarrayptr.h"
  44. #include "llvertexbuffer.h"
  45. #include "llviewertexture.h"
  46. #include "lldrawable.h"
  47. #include "lltextureatlasmanager.h"
  48. class LLFacePool;
  49. class LLVolume;
  50. class LLViewerTexture;
  51. class LLTextureEntry;
  52. class LLVertexProgram;
  53. class LLViewerTexture;
  54. class LLGeometryManager;
  55. class LLTextureAtlasSlot;
  56. const F32 MIN_ALPHA_SIZE = 1024.f;
  57. const F32 MIN_TEX_ANIM_SIZE = 512.f;
  58. class LLFace
  59. {
  60. public:
  61. enum EMasks
  62. {
  63. LIGHT = 0x0001,
  64. GLOBAL = 0x0002,
  65. FULLBRIGHT = 0x0004,
  66. HUD_RENDER = 0x0008,
  67. USE_FACE_COLOR = 0x0010,
  68. TEXTURE_ANIM = 0x0020, 
  69. };
  70. static void initClass();
  71. public:
  72. LLFace(LLDrawable* drawablep, LLViewerObject* objp)   { init(drawablep, objp); }
  73. ~LLFace()  { destroy(); }
  74. const LLMatrix4& getWorldMatrix() const { return mVObjp->getWorldMatrix(mXform); }
  75. const LLMatrix4& getRenderMatrix() const;
  76. U32 getIndicesCount() const { return mIndicesCount; };
  77. S32 getIndicesStart() const { return mIndicesIndex; };
  78. U16 getGeomCount() const { return mGeomCount; } // vertex count for this face
  79. U16 getGeomIndex() const { return mGeomIndex; } // index into draw pool
  80. U16 getGeomStart() const { return mGeomIndex; } // index into draw pool
  81. void setTexture(LLViewerTexture* tex) ;
  82. void            switchTexture(LLViewerTexture* new_texture);
  83. void            dirtyTexture();
  84. LLXformMatrix* getXform() const { return mXform; }
  85. BOOL hasGeometry() const { return mGeomCount > 0; }
  86. LLVector3 getPositionAgent() const;
  87. LLVector2       surfaceToTexture(LLVector2 surface_coord, LLVector3 position, LLVector3 normal);
  88. U32 getState() const { return mState; }
  89. void setState(U32 state) { mState |= state; }
  90. void clearState(U32 state) { mState &= ~state; }
  91. BOOL isState(U32 state) const { return ((mState & state) != 0) ? TRUE : FALSE; }
  92. void setVirtualSize(F32 size) { mVSize = size; }
  93. void setPixelArea(F32 area) { mPixelArea = area; }
  94. F32 getVirtualSize() const { return mVSize; }
  95. F32 getPixelArea() const { return mPixelArea; }
  96. S32             getIndexInTex() const {return mIndexInTex ;}
  97. void            setIndexInTex(S32 index) { mIndexInTex = index ;}
  98. void renderSetColor() const;
  99. S32 renderElements(const U16 *index_array) const;
  100. S32 renderIndexed ();
  101. S32 renderIndexed (U32 mask);
  102. S32 pushVertices(const U16* index_array) const;
  103. void setWorldMatrix(const LLMatrix4& mat);
  104. const LLTextureEntry* getTextureEntry() const { return mVObjp->getTE(mTEOffset); }
  105. LLFacePool* getPool() const { return mDrawPoolp; }
  106. U32 getPoolType() const { return mPoolType; }
  107. LLDrawable* getDrawable() const { return mDrawablep; }
  108. LLViewerObject* getViewerObject() const { return mVObjp; }
  109. S32 getLOD() const { return mVObjp.notNull() ? mVObjp->getLOD() : 0; }
  110. LLVertexBuffer* getVertexBuffer() const { return mVertexBuffer; }
  111. void setPoolType(U32 type) { mPoolType = type; }
  112. S32 getTEOffset() { return mTEOffset; }
  113. LLViewerTexture* getTexture() const;
  114. void setViewerObject(LLViewerObject* object);
  115. void setPool(LLFacePool *pool, LLViewerTexture *texturep);
  116. void setDrawable(LLDrawable *drawable);
  117. void setTEOffset(const S32 te_offset);
  118. void setFaceColor(const LLColor4& color); // override material color
  119. void unsetFaceColor(); // switch back to material color
  120. const LLColor4& getFaceColor() const { return mFaceColor; } 
  121. const LLColor4& getRenderColor() const;
  122. //for volumes
  123. void updateRebuildFlags();
  124. BOOL getGeometryVolume(const LLVolume& volume,
  125. const S32 &f,
  126. const LLMatrix4& mat_vert, const LLMatrix3& mat_normal,
  127. const U16 &index_offset);
  128. // For avatar
  129. U16  getGeometryAvatar(
  130. LLStrider<LLVector3> &vertices,
  131. LLStrider<LLVector3> &normals,
  132.     LLStrider<LLVector2> &texCoords,
  133. LLStrider<F32>  &vertex_weights,
  134. LLStrider<LLVector4> &clothing_weights);
  135. // For volumes, etc.
  136. U16 getGeometry(LLStrider<LLVector3> &vertices,  
  137. LLStrider<LLVector3> &normals,
  138. LLStrider<LLVector2> &texCoords, 
  139. LLStrider<U16>  &indices);
  140. S32 getColors(LLStrider<LLColor4U> &colors);
  141. S32 getIndices(LLStrider<U16> &indices);
  142. void setSize(const S32 numVertices, const S32 num_indices = 0);
  143. BOOL genVolumeBBoxes(const LLVolume &volume, S32 f,
  144.    const LLMatrix4& mat, const LLMatrix3& inv_trans_mat, BOOL global_volume = FALSE);
  145. void init(LLDrawable* drawablep, LLViewerObject* objp);
  146. void destroy();
  147. void update();
  148. void updateCenterAgent(); // Update center when xform has changed.
  149. void renderSelectedUV();
  150. void renderForSelect(U32 data_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0);
  151. void renderSelected(LLViewerTexture *image, const LLColor4 &color);
  152. F32 getKey() const { return mDistance; }
  153. S32 getReferenceIndex()  const { return mReferenceIndex; }
  154. void setReferenceIndex(const S32 index) { mReferenceIndex = index; }
  155. BOOL verify(const U32* indices_array = NULL) const;
  156. void printDebugInfo() const;
  157. void setGeomIndex(U16 idx) { mGeomIndex = idx; }
  158. void setIndicesIndex(S32 idx) { mIndicesIndex = idx; }
  159. void setDrawInfo(LLDrawInfo* draw_info);
  160. F32         getTextureVirtualSize() ;
  161. F32         getImportanceToCamera()const {return mImportanceToCamera ;}
  162. void        setHasMedia(bool has_media)  { mHasMedia = has_media ;}
  163. BOOL        hasMedia() const ;
  164. //for atlas
  165. LLTextureAtlasSlot*   getAtlasInfo() ;
  166. void                  setAtlasInUse(BOOL flag);
  167. void                  setAtlasInfo(LLTextureAtlasSlot* atlasp);
  168. BOOL                  isAtlasInUse()const;
  169. BOOL                  canUseAtlas() const;
  170. const LLVector2*      getTexCoordScale() const ;
  171. const LLVector2*      getTexCoordOffset()const;
  172. const LLTextureAtlas* getAtlas()const ;
  173. void                  removeAtlas() ;
  174. BOOL                  switchTexture() ;
  175. private:
  176. F32         adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius );
  177. BOOL        calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;
  178. public:
  179. static F32  calcImportanceToCamera(F32 to_view_dir, F32 dist);
  180. public:
  181. LLVector3 mCenterLocal;
  182. LLVector3 mCenterAgent;
  183. LLVector3 mExtents[2];
  184. LLVector2 mTexExtents[2];
  185. F32 mDistance;
  186. LLPointer<LLVertexBuffer> mVertexBuffer;
  187. LLPointer<LLVertexBuffer> mLastVertexBuffer;
  188. F32 mLastUpdateTime;
  189. F32 mLastMoveTime;
  190. LLMatrix4* mTextureMatrix;
  191. LLDrawInfo* mDrawInfo;
  192. private:
  193. friend class LLGeometryManager;
  194. friend class LLVolumeGeometryManager;
  195. U32 mState;
  196. LLFacePool* mDrawPoolp;
  197. U32 mPoolType;
  198. LLColor4 mFaceColor; // overrides material color if state |= USE_FACE_COLOR
  199. U16 mGeomCount; // vertex count for this face
  200. U16 mGeomIndex; // index into draw pool
  201. U32 mIndicesCount;
  202. U32 mIndicesIndex; // index into draw pool for indices (yeah, I know!)
  203. S32         mIndexInTex ;
  204. //previous rebuild's geometry info
  205. U16 mLastGeomCount;
  206. U16 mLastGeomIndex;
  207. U32 mLastIndicesCount;
  208. U32 mLastIndicesIndex;
  209. LLXformMatrix* mXform;
  210. LLPointer<LLViewerTexture> mTexture;
  211. LLPointer<LLDrawable> mDrawablep;
  212. LLPointer<LLViewerObject> mVObjp;
  213. S32 mTEOffset;
  214. S32 mReferenceIndex;
  215. F32 mVSize;
  216. F32 mPixelArea;
  217. //importance factor, in the range [0, 1.0].
  218. //1.0: the most important.
  219. //based on the distance from the face to the view point and the angle from the face center to the view direction.
  220. F32         mImportanceToCamera ; 
  221. F32         mBoundingSphereRadius ;
  222. bool        mHasMedia ;
  223. //atlas
  224. LLPointer<LLTextureAtlasSlot> mAtlasInfop ;
  225. BOOL                          mUsingAtlas ;
  226. protected:
  227. static BOOL sSafeRenderSelect;
  228. public:
  229. struct CompareDistanceGreater
  230. {
  231. bool operator()(const LLFace* const& lhs, const LLFace* const& rhs)
  232. {
  233. return lhs->mDistance > rhs->mDistance; // farthest = first
  234. }
  235. };
  236. struct CompareTexture
  237. {
  238. bool operator()(const LLFace* const& lhs, const LLFace* const& rhs)
  239. {
  240. return lhs->getTexture() < rhs->getTexture();
  241. }
  242. };
  243. struct CompareBatchBreaker
  244. {
  245. bool operator()(const LLFace* const& lhs, const LLFace* const& rhs)
  246. {
  247. const LLTextureEntry* lte = lhs->getTextureEntry();
  248. const LLTextureEntry* rte = rhs->getTextureEntry();
  249. if(lhs->getTexture() != rhs->getTexture())
  250. {
  251. return lhs->getTexture() < rhs->getTexture();
  252. }
  253. else if (lte->getBumpShinyFullbright() != rte->getBumpShinyFullbright())
  254. {
  255. return lte->getBumpShinyFullbright() < rte->getBumpShinyFullbright();
  256. }
  257. else 
  258. {
  259. return lte->getGlow() < rte->getGlow();
  260. }
  261. }
  262. };
  263. struct CompareTextureAndGeomCount
  264. {
  265. bool operator()(const LLFace* const& lhs, const LLFace* const& rhs)
  266. {
  267. return lhs->getTexture() == rhs->getTexture() ? 
  268. lhs->getGeomCount() < rhs->getGeomCount() :  //smallest = first
  269. lhs->getTexture() > rhs->getTexture();
  270. }
  271. };
  272. struct CompareTextureAndLOD
  273. {
  274. bool operator()(const LLFace* const& lhs, const LLFace* const& rhs)
  275. {
  276. return lhs->getTexture() == rhs->getTexture() ? 
  277. lhs->getLOD() < rhs->getLOD() :
  278. lhs->getTexture() < rhs->getTexture();
  279. }
  280. };
  281. struct CompareTextureAndTime
  282. {
  283. bool operator()(const LLFace* const& lhs, const LLFace* const& rhs)
  284. {
  285. return lhs->getTexture() == rhs->getTexture() ? 
  286. lhs->mLastUpdateTime < rhs->mLastUpdateTime :
  287. lhs->getTexture() < rhs->getTexture();
  288. }
  289. };
  290. };
  291. #endif // LL_LLFACE_H