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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llviewerobjectlist.h
  3.  * @brief Description of LLViewerObjectList class.
  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_LLVIEWEROBJECTLIST_H
  33. #define LL_LLVIEWEROBJECTLIST_H
  34. #include <map>
  35. #include <set>
  36. // common includes
  37. #include "llstat.h"
  38. #include "lldarrayptr.h"
  39. #include "llmap.h" // *TODO: switch to std::map
  40. #include "llstring.h"
  41. // project includes
  42. #include "llviewerobject.h"
  43. class LLCamera;
  44. class LLNetMap;
  45. class LLDebugBeacon;
  46. const U32 CLOSE_BIN_SIZE = 10;
  47. const U32 NUM_BINS = 16;
  48. // GL name = position in object list + GL_NAME_INDEX_OFFSET so that
  49. // we can have special numbers like zero.
  50. const U32 GL_NAME_LAND = 0;
  51. const U32 GL_NAME_PARCEL_WALL = 1;
  52. const U32 GL_NAME_INDEX_OFFSET = 10;
  53. class LLViewerObjectList
  54. {
  55. public:
  56. LLViewerObjectList();
  57. ~LLViewerObjectList();
  58. void destroy();
  59. // For internal use only.  Does NOT take a local id, takes an index into
  60. // an internal dynamic array.
  61. inline LLViewerObject *getObject(const S32 index);
  62. inline LLViewerObject *findObject(const LLUUID &id);
  63. LLViewerObject *createObjectViewer(const LLPCode pcode, LLViewerRegion *regionp); // Create a viewer-side object
  64. LLViewerObject *createObject(const LLPCode pcode, LLViewerRegion *regionp,
  65.  const LLUUID &uuid, const U32 local_id, const LLHost &sender);
  66. LLViewerObject *replaceObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp); // TomY: hack to switch VO instances on the fly
  67. BOOL killObject(LLViewerObject *objectp);
  68. void killObjects(LLViewerRegion *regionp); // Kill all objects owned by a particular region.
  69. void killAllObjects();
  70. void removeDrawable(LLDrawable* drawablep);
  71. void cleanDeadObjects(const BOOL use_timer = TRUE); // Clean up the dead object list.
  72. // Simulator and viewer side object updates...
  73. void processUpdateCore(LLViewerObject* objectp, void** data, U32 block, const EObjectUpdateType update_type, LLDataPacker* dpp, BOOL justCreated);
  74. void processObjectUpdate(LLMessageSystem *mesgsys, void **user_data, EObjectUpdateType update_type, bool cached=false, bool compressed=false);
  75. void processCompressedObjectUpdate(LLMessageSystem *mesgsys, void **user_data, EObjectUpdateType update_type);
  76. void processCachedObjectUpdate(LLMessageSystem *mesgsys, void **user_data, EObjectUpdateType update_type);
  77. void updateApparentAngles(LLAgent &agent);
  78. void update(LLAgent &agent, LLWorld &world);
  79. void shiftObjects(const LLVector3 &offset);
  80. void renderObjectsForMap(LLNetMap &netmap);
  81. void renderObjectBounds(const LLVector3 &center);
  82. void addDebugBeacon(const LLVector3 &pos_agent, const std::string &string,
  83. const LLColor4 &color=LLColor4(1.f, 0.f, 0.f, 0.5f),
  84. const LLColor4 &text_color=LLColor4(1.f, 1.f, 1.f, 1.f),
  85. S32 line_width = 1);
  86. void renderObjectBeacons();
  87. void resetObjectBeacons();
  88. void dirtyAllObjectInventory();
  89. void updateActive(LLViewerObject *objectp);
  90. void updateAvatarVisibility();
  91. // Selection related stuff
  92. void renderObjectsForSelect(LLCamera &camera, const LLRect& screen_rect, BOOL pick_parcel_wall = FALSE, BOOL render_transparent = TRUE);
  93. void generatePickList(LLCamera &camera);
  94. void renderPickList(const LLRect& screen_rect, BOOL pick_parcel_wall, BOOL render_transparent);
  95. LLViewerObject *getSelectedObject(const U32 object_id);
  96. inline S32 getNumObjects() { return mObjects.count(); }
  97. void addToMap(LLViewerObject *objectp);
  98. void removeFromMap(LLViewerObject *objectp);
  99. void clearDebugText();
  100. ////////////////////////////////////////////
  101. //
  102. // Only accessed by markDead in LLViewerObject
  103. void cleanupReferences(LLViewerObject *objectp);
  104. S32 findReferences(LLDrawable *drawablep) const; // Find references to drawable in all objects, and return value.
  105. S32 getOrphanParentCount() const { return mOrphanParents.count(); }
  106. S32 getOrphanCount() const { return mNumOrphans; }
  107. void orphanize(LLViewerObject *childp, U32 parent_id, U32 ip, U32 port);
  108. void findOrphans(LLViewerObject* objectp, U32 ip, U32 port);
  109. public:
  110. // Class for keeping track of orphaned objects
  111. class OrphanInfo
  112. {
  113. public:
  114. OrphanInfo();
  115. OrphanInfo(const U64 parent_info, const LLUUID child_info);
  116. bool operator==(const OrphanInfo &rhs) const;
  117. bool operator!=(const OrphanInfo &rhs) const;
  118. U64 mParentInfo;
  119. LLUUID mChildInfo;
  120. };
  121. U32 mCurBin; // Current bin we're working on...
  122. // Statistics data (see also LLViewerStats)
  123. S32 mNumNewObjects;
  124. S32 mNumSizeCulled;
  125. S32 mNumVisCulled;
  126. // if we paused in the last frame
  127. // used to discount stats from this frame
  128. BOOL mWasPaused;
  129. static void getUUIDFromLocal(LLUUID &id,
  130. const U32 local_id,
  131. const U32 ip,
  132. const U32 port);
  133. static void setUUIDAndLocal(const LLUUID &id,
  134. const U32 local_id,
  135. const U32 ip,
  136. const U32 port); // Requires knowledge of message system info!
  137. static BOOL removeFromLocalIDTable(const LLViewerObject &object);
  138. // Used ONLY by the orphaned object code.
  139. static U64 getIndex(const U32 local_id, const U32 ip, const U32 port);
  140. S32 mNumUnknownUpdates;
  141. S32 mNumDeadObjectUpdates;
  142. S32 mNumUnknownKills;
  143. S32 mNumDeadObjects;
  144. protected:
  145. LLDynamicArray<U64> mOrphanParents; // LocalID/ip,port of orphaned objects
  146. LLDynamicArray<OrphanInfo> mOrphanChildren; // UUID's of orphaned objects
  147. S32 mNumOrphans;
  148. LLDynamicArrayPtr<LLPointer<LLViewerObject>, 256> mObjects;
  149. std::set<LLPointer<LLViewerObject> > mActiveObjects;
  150. LLDynamicArrayPtr<LLPointer<LLViewerObject> > mMapObjects;
  151. typedef std::map<LLUUID, LLPointer<LLViewerObject> > vo_map;
  152. vo_map mDeadObjects; // Need to keep multiple entries per UUID
  153. std::map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
  154. LLDynamicArray<LLDebugBeacon> mDebugBeacons;
  155. S32 mCurLazyUpdateIndex;
  156. static U32 sSimulatorMachineIndex;
  157. static LLMap<U64, U32> sIPAndPortToIndex;
  158. static std::map<U64, LLUUID> sIndexAndLocalIDToUUID;
  159. std::set<LLViewerObject *> mSelectPickList;
  160. friend class LLViewerObject;
  161. };
  162. class LLDebugBeacon
  163. {
  164. public:
  165. ~LLDebugBeacon()
  166. {
  167. if (mHUDObject.notNull())
  168. {
  169. mHUDObject->markDead();
  170. }
  171. }
  172. LLVector3 mPositionAgent;
  173. std::string mString;
  174. LLColor4 mColor;
  175. LLColor4 mTextColor;
  176. S32 mLineWidth;
  177. LLPointer<LLHUDObject> mHUDObject;
  178. };
  179. // Global object list
  180. extern LLViewerObjectList gObjectList;
  181. // Inlines
  182. /**
  183.  * Note:
  184.  * it will return NULL for offline avatar_id 
  185.  */
  186. inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id)
  187. {
  188. std::map<LLUUID, LLPointer<LLViewerObject> >::iterator iter = mUUIDObjectMap.find(id);
  189. if(iter != mUUIDObjectMap.end())
  190. {
  191. return iter->second;
  192. }
  193. else
  194. {
  195. return NULL;
  196. }
  197. }
  198. inline LLViewerObject *LLViewerObjectList::getObject(const S32 index)
  199. {
  200. LLViewerObject *objectp;
  201. objectp = mObjects[index];
  202. if (objectp->isDead())
  203. {
  204. //llwarns << "Dead object " << objectp->mID << " in getObject" << llendl;
  205. return NULL;
  206. }
  207. return objectp;
  208. }
  209. inline void LLViewerObjectList::addToMap(LLViewerObject *objectp)
  210. {
  211. mMapObjects.put(objectp);
  212. }
  213. inline void LLViewerObjectList::removeFromMap(LLViewerObject *objectp)
  214. {
  215. mMapObjects.removeObj(objectp);
  216. }
  217. #endif // LL_VIEWER_OBJECT_LIST_H