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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lldrawable.h
  3.  * @brief LLDrawable class definition
  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_DRAWABLE_H
  33. #define LL_DRAWABLE_H
  34. #include <vector>
  35. #include <map>
  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 "llmemtype.h"
  44. #include "lldarray.h"
  45. #include "llviewerobject.h"
  46. #include "llrect.h"
  47. #include "llappviewer.h" // for gFrameTimeSeconds
  48. class LLCamera;
  49. class LLDrawPool;
  50. class LLDrawable;
  51. class LLFace;
  52. class LLSpatialGroup;
  53. class LLSpatialBridge;
  54. class LLSpatialPartition;
  55. class LLVOVolume;
  56. class LLViewerTexture;
  57. // Can have multiple silhouettes for each object
  58. const U32 SILHOUETTE_HIGHLIGHT = 0;
  59. // All data for new renderer goes into this class.
  60. class LLDrawable : public LLRefCount
  61. {
  62. public:
  63. static void initClass();
  64. LLDrawable() { init(); }
  65. MEM_TYPE_NEW(LLMemType::MTYPE_DRAWABLE);
  66. void markDead(); // Mark this drawable as dead
  67. BOOL isDead() const { return isState(DEAD); }
  68. BOOL isNew() const { return !isState(BUILT); }
  69. BOOL isLight() const;
  70. BOOL isVisible() const;
  71. BOOL isRecentlyVisible() const;
  72. virtual void setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* results = NULL, BOOL for_select = FALSE);
  73. LLViewerRegion* getRegion()               const { return mVObjp->getRegion(); }
  74. const LLTextureEntry* getTextureEntry(U8 which) const { return mVObjp->getTE(which); }
  75. LLPointer<LLViewerObject>& getVObj()   { return mVObjp; }
  76. const LLViewerObject *getVObj() const   { return mVObjp; }
  77. LLVOVolume* getVOVolume() const; // cast mVObjp tp LLVOVolume if OK
  78. const LLMatrix4&      getWorldMatrix() const { return mXform.getWorldMatrix(); }
  79. const LLMatrix4&   getRenderMatrix() const { return isRoot() ? getWorldMatrix() : getParent()->getWorldMatrix(); }
  80. void   setPosition(LLVector3 v) const { }
  81. const LLVector3&   getPosition() const { return mXform.getPosition(); }
  82. const LLVector3&      getWorldPosition() const { return mXform.getPositionW(); }
  83. const LLVector3   getPositionAgent() const;
  84. const LLVector3d&   getPositionGroup() const { return mPositionGroup; }
  85. const LLVector3&   getScale() const { return mCurrentScale; }
  86. void   setScale(const LLVector3& scale) { mCurrentScale = scale; }
  87. const LLQuaternion&   getWorldRotation() const { return mXform.getWorldRotation(); }
  88. const LLQuaternion&   getRotation() const { return mXform.getRotation(); }
  89. F32           getIntensity() const { return llmin(mXform.getScale().mV[0], 4.f); }
  90. S32   getLOD() const { return mVObjp ? mVObjp->getLOD() : 1; }
  91. F64   getBinRadius() const { return mBinRadius; }
  92. void  getMinMax(LLVector3& min,LLVector3& max) const { mXform.getMinMax(min,max); }
  93. LLXformMatrix* getXform() { return &mXform; }
  94. U32 getState()           const { return mState; }
  95. BOOL isState   (U32 bits) const { return ((mState & bits) != 0); }
  96. void                setState  (U32 bits)       { mState |= bits; }
  97. void                clearState(U32 bits)       { mState &= ~bits; }
  98. BOOL isAvatar() const { return mVObjp.notNull() && mVObjp->isAvatar(); }
  99. BOOL isRoot() const { return !mParent || mParent->isAvatar(); }
  100. BOOL isSpatialRoot() const { return !mParent || mParent->isAvatar(); }
  101. virtual BOOL isSpatialBridge() const { return FALSE; }
  102. virtual LLSpatialPartition* asPartition() { return NULL; }
  103. LLDrawable* getParent() const { return mParent; }
  104. // must set parent through LLViewerObject:: ()
  105. //BOOL                setParent(LLDrawable *parent);
  106. inline LLFace*      getFace(const S32 i) const;
  107. inline S32 getNumFaces()        const;
  108. //void                removeFace(const S32 i); // SJB: Avoid using this, it's slow
  109. LLFace* addFace(LLFacePool *poolp, LLViewerTexture *texturep);
  110. LLFace* addFace(const LLTextureEntry *te, LLViewerTexture *texturep);
  111. void deleteFaces(S32 offset, S32 count);
  112. void                setNumFaces(const S32 numFaces, LLFacePool *poolp, LLViewerTexture *texturep);
  113. void                setNumFacesFast(const S32 numFaces, LLFacePool *poolp, LLViewerTexture *texturep);
  114. void mergeFaces(LLDrawable* src);
  115. void init();
  116. void destroy();
  117. void update();
  118. F32 updateXform(BOOL undamped);
  119. virtual void makeActive();
  120. /*virtual*/ void makeStatic(BOOL warning_enabled = TRUE);
  121. BOOL isActive() const { return isState(ACTIVE); }
  122. BOOL isStatic() const { return !isActive(); }
  123. BOOL isAnimating() const;
  124. virtual BOOL updateMove();
  125. virtual void movePartition();
  126. void updateTexture();
  127. void updateMaterial();
  128. virtual void updateDistance(LLCamera& camera, bool force_update);
  129. BOOL updateGeometry(BOOL priority);
  130. void updateFaceSize(S32 idx);
  131. void updateSpecialHoverCursor(BOOL enabled);
  132. virtual void shiftPos(const LLVector3 &shift_vector);
  133. S32 getGeneration() const { return mGeneration; }
  134. BOOL getLit() const { return isState(UNLIT) ? FALSE : TRUE; }
  135. void setLit(BOOL lit) { lit ? clearState(UNLIT) : setState(UNLIT); }
  136. virtual void cleanupReferences();
  137. void setRadius(const F32 radius);
  138. F32 getRadius() const { return mRadius; }
  139. F32 getVisibilityRadius() const;
  140. void updateUVMinMax(); // Updates the cache of sun space bounding box.
  141. const LLVector3& getBounds(LLVector3& min, LLVector3& max) const;
  142. virtual void updateSpatialExtents();
  143. virtual void updateBinRadius();
  144. const LLVector3* getSpatialExtents() const;
  145. void setSpatialExtents(LLVector3 min, LLVector3 max);
  146. void setPositionGroup(const LLVector3d& pos);
  147. void setPositionGroup(const LLVector3& pos) { setPositionGroup(LLVector3d(pos)); }
  148. void setRenderType(S32 type)  { mRenderType = type; }
  149. BOOL isRenderType(S32 type)  { return mRenderType == type; }
  150. S32  getRenderType() { return mRenderType; }
  151. // Debugging methods
  152. S32 findReferences(LLDrawable *drawablep); // Not const because of @#$! iterators...
  153. void setSpatialGroup(LLSpatialGroup *groupp);
  154. LLSpatialGroup *getSpatialGroup() const { return mSpatialGroupp; }
  155. LLSpatialPartition* getSpatialPartition();
  156. // Statics
  157. static void incrementVisible();
  158. static void cleanupDeadDrawables();
  159. protected:
  160. ~LLDrawable() { destroy(); }
  161. void moveUpdatePipeline(BOOL moved);
  162. void updatePartition();
  163. BOOL updateMoveDamped();
  164. BOOL updateMoveUndamped();
  165. public:
  166. friend class LLPipeline;
  167. friend class LLDrawPool;
  168. friend class LLSpatialBridge;
  169. typedef std::set<LLPointer<LLDrawable> > drawable_set_t;
  170. typedef std::vector<LLPointer<LLDrawable> > drawable_vector_t;
  171. typedef std::list<LLPointer<LLDrawable> > drawable_list_t;
  172. typedef std::queue<LLPointer<LLDrawable> > drawable_queue_t;
  173. struct CompareDistanceGreater
  174. {
  175. bool operator()(const LLDrawable* const& lhs, const LLDrawable* const& rhs)
  176. {
  177. return lhs->mDistanceWRTCamera < rhs->mDistanceWRTCamera; // farthest = last
  178. }
  179. };
  180. struct CompareDistanceGreaterVisibleFirst
  181. {
  182. bool operator()(const LLDrawable* const& lhs, const LLDrawable* const& rhs)
  183. {
  184. if (lhs->isVisible() && !rhs->isVisible())
  185. {
  186. return TRUE; //visible things come first
  187. }
  188. else if (!lhs->isVisible() && rhs->isVisible())
  189. {
  190. return FALSE; //rhs is visible, comes first
  191. }
  192. return lhs->mDistanceWRTCamera < rhs->mDistanceWRTCamera; // farthest = last
  193. }
  194. };
  195. typedef enum e_drawable_flags
  196. {
  197.   IN_REBUILD_Q1 = 0x00000002,
  198.   IN_REBUILD_Q2 = 0x00000004,
  199.   IN_LIGHT_Q = 0x00000008,
  200. EARLY_MOVE = 0x00000010,
  201. MOVE_UNDAMPED = 0x00000020,
  202. ON_MOVE_LIST = 0x00000040,
  203. USE_BACKLIGHT = 0x00000080,
  204. UV = 0x00000100,
  205. UNLIT = 0x00000200,
  206. LIGHT = 0x00000400,
  207. LIGHTING_BUILT = 0x00000800,
  208. REBUILD_VOLUME  = 0x00001000, //volume changed LOD or parameters, or vertex buffer changed
  209. REBUILD_TCOORD = 0x00002000, //texture coordinates changed
  210. REBUILD_COLOR = 0x00004000, //color changed
  211. REBUILD_POSITION= 0x00010000, //vertex positions/normals changed
  212. REBUILD_GEOMETRY= REBUILD_POSITION|REBUILD_TCOORD|REBUILD_COLOR,
  213. REBUILD_MATERIAL= REBUILD_TCOORD|REBUILD_COLOR,
  214. REBUILD_ALL = REBUILD_GEOMETRY|REBUILD_VOLUME,
  215. ON_SHIFT_LIST = 0x00100000,
  216. BLOCKER = 0x00400000,
  217. ACTIVE = 0x00800000,
  218. DEAD = 0x01000000,
  219. INVISIBLE = 0x02000000, // stay invisible until flag is cleared
  220.   NEARBY_LIGHT = 0x04000000, // In gPipeline.mNearbyLightSet
  221. BUILT = 0x08000000,
  222. FORCE_INVISIBLE = 0x10000000, // stay invis until CLEAR_INVISIBLE is set (set of orphaned)
  223. CLEAR_INVISIBLE = 0x20000000, // clear FORCE_INVISIBLE next draw frame
  224. REBUILD_SHADOW =  0x40000000,
  225. HAS_ALPHA = 0x80000000,
  226. } EDrawableFlags;
  227. LLXformMatrix       mXform;
  228. // vis data
  229. LLPointer<LLDrawable> mParent;
  230. F32 mDistanceWRTCamera;
  231. S32 mQuietCount;
  232. static S32 getCurrentFrame() { return sCurVisible; }
  233. static S32 getMinVisFrameRange();
  234. void setSpatialBridge(LLSpatialBridge* bridge) { mSpatialBridge = (LLDrawable*) bridge; }
  235. LLSpatialBridge* getSpatialBridge() { return (LLSpatialBridge*) (LLDrawable*) mSpatialBridge; }
  236. static F32 sCurPixelAngle; //current pixels per radian
  237. private:
  238. typedef std::vector<LLFace*> face_list_t;
  239. U32 mState;
  240. S32 mRenderType;
  241. LLPointer<LLViewerObject> mVObjp;
  242. face_list_t     mFaces;
  243. LLSpatialGroup* mSpatialGroupp;
  244. LLPointer<LLDrawable> mSpatialBridge;
  245. mutable U32 mVisible;
  246. F32 mRadius;
  247. LLVector3 mExtents[2];
  248. LLVector3d mPositionGroup;
  249. F64 mBinRadius;
  250. S32 mGeneration;
  251. LLVector3 mCurrentScale;
  252. static U32 sCurVisible; // Counter for what value of mVisible means currently visible
  253. static U32 sNumZombieDrawables;
  254. static LLDynamicArrayPtr<LLPointer<LLDrawable> > sDeadList;
  255. };
  256. inline LLFace* LLDrawable::getFace(const S32 i) const
  257. {
  258. llassert((U32)i < mFaces.size());
  259. llassert(mFaces[i]);
  260. return mFaces[i];
  261. }
  262. inline S32 LLDrawable::getNumFaces()const
  263. {
  264. return (S32)mFaces.size();
  265. }
  266. #endif