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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llviewerregion.h
  3.  * @brief Description of the LLViewerRegion 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_LLVIEWERREGION_H
  33. #define LL_LLVIEWERREGION_H
  34. // A ViewerRegion is a class that contains a bunch of objects and surfaces
  35. // that are in to a particular region.
  36. #include <string>
  37. #include "lldarray.h"
  38. #include "llwind.h"
  39. #include "llcloud.h"
  40. #include "llstat.h"
  41. #include "v3dmath.h"
  42. #include "llhost.h"
  43. #include "llstring.h"
  44. #include "llregionflags.h"
  45. #include "lluuid.h"
  46. #include "lldatapacker.h"
  47. #include "llvocache.h"
  48. #include "llweb.h"
  49. #include "llcapabilityprovider.h"
  50. #include "llcapabilitylistener.h"
  51. #include "m4math.h" // LLMatrix4
  52. // Surface id's
  53. #define LAND  1
  54. #define WATER 2
  55. const U32 MAX_OBJECT_CACHE_ENTRIES = 10000;
  56. class LLEventPoll;
  57. class LLVLComposition;
  58. class LLViewerObject;
  59. class LLMessageSystem;
  60. class LLNetMap;
  61. class LLViewerParcelOverlay;
  62. class LLSurface;
  63. class LLVOCache;
  64. class LLVOCacheEntry;
  65. class LLSpatialPartition;
  66. class LLEventPump;
  67. class LLViewerRegion: public LLCapabilityProvider // implements this interface
  68. {
  69. public:
  70. //MUST MATCH THE ORDER OF DECLARATION IN CONSTRUCTOR
  71. typedef enum 
  72. {
  73. PARTITION_HUD=0,
  74. PARTITION_TERRAIN,
  75. PARTITION_WATER,
  76. PARTITION_TREE,
  77. PARTITION_PARTICLE,
  78. PARTITION_CLOUD,
  79. PARTITION_GRASS,
  80. PARTITION_VOLUME,
  81. PARTITION_BRIDGE,
  82. PARTITION_HUD_PARTICLE,
  83. PARTITION_NONE,
  84. NUM_PARTITIONS
  85. } eObjectPartitions;
  86. LLViewerRegion(const U64 &handle,
  87.    const LLHost &host,
  88.    const U32 surface_grid_width,
  89.    const U32 patch_grid_width,
  90.    const F32 region_width_meters);
  91. ~LLViewerRegion();
  92. // Call this after you have the region name and handle.
  93. void loadCache();
  94. void saveCache();
  95. void sendMessage(); // Send the current message to this region's simulator
  96. void sendReliableMessage(); // Send the current message to this region's simulator
  97. void setOriginGlobal(const LLVector3d &origin);
  98. //void setAgentOffset(const LLVector3d &offset);
  99. void updateRenderMatrix();
  100. void setAllowDamage(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_DAMAGE); }
  101. void setAllowLandmark(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_LANDMARK); }
  102. void setAllowSetHome(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_SET_HOME); }
  103. void setResetHomeOnTeleport(BOOL b) { setFlags(b, REGION_FLAGS_RESET_HOME_ON_TELEPORT); }
  104. void setSunFixed(BOOL b) { setFlags(b, REGION_FLAGS_SUN_FIXED); }
  105. void setBlockFly(BOOL b) { setFlags(b, REGION_FLAGS_BLOCK_FLY); }
  106. void setAllowDirectTeleport(BOOL b) { setFlags(b, REGION_FLAGS_ALLOW_DIRECT_TELEPORT); }
  107. inline BOOL getAllowDamage() const;
  108. inline BOOL getAllowLandmark() const;
  109. inline BOOL getAllowSetHome() const;
  110. inline BOOL getResetHomeOnTeleport() const;
  111. inline BOOL getSunFixed() const;
  112. inline BOOL getBlockFly() const;
  113. inline BOOL getAllowDirectTeleport() const;
  114. inline BOOL isPrelude() const;
  115. inline BOOL getAllowTerraform()  const;
  116. inline BOOL getRestrictPushObject() const;
  117. inline BOOL getReleaseNotesRequested() const;
  118. bool isAlive(); // can become false if circuit disconnects
  119. void setWaterHeight(F32 water_level);
  120. F32 getWaterHeight() const;
  121. BOOL isVoiceEnabled() const;
  122. void setBillableFactor(F32 billable_factor) { mBillableFactor = billable_factor; }
  123. F32 getBillableFactor()  const  { return mBillableFactor; }
  124. // Maximum number of primitives allowed, regardless of object
  125. // bonus factor.
  126. U32 getMaxTasks() const { return mMaxTasks; }
  127. void setMaxTasks(U32 max_tasks) { mMaxTasks = max_tasks; }
  128. // Draw lines in the dirt showing ownership. Return number of 
  129. // vertices drawn.
  130. S32 renderPropertyLines();
  131. // Call this whenever you change the height data in the region.
  132. // (Automatically called by LLSurfacePatch's update routine)
  133. void dirtyHeights();
  134. LLViewerParcelOverlay *getParcelOverlay() const
  135. { return mParcelOverlay; }
  136. void setRegionFlags(U32 flags);
  137. U32 getRegionFlags() const { return mRegionFlags; }
  138. void setTimeDilation(F32 time_dilation);
  139. F32  getTimeDilation() const { return mTimeDilation; }
  140. // Origin height is at zero.
  141. const LLVector3d &getOriginGlobal() const { return mOriginGlobal; }
  142. LLVector3 getOriginAgent() const;
  143. // Center is at the height of the water table.
  144. const LLVector3d &getCenterGlobal() const { return mCenterGlobal; }
  145. LLVector3 getCenterAgent() const;
  146. void setRegionNameAndZone(const std::string& name_and_zone);
  147. const std::string& getName() const { return mName; }
  148. const std::string& getZoning() const { return mZoning; }
  149. void setOwner(const LLUUID& owner_id) { mOwnerID = owner_id; }
  150. const LLUUID& getOwner() const { return mOwnerID; }
  151. // Is the current agent on the estate manager list for this region?
  152. void setIsEstateManager(BOOL b) { mIsEstateManager = b; }
  153. BOOL isEstateManager() const { return mIsEstateManager; }
  154. BOOL canManageEstate() const;
  155. void setSimAccess(U8 sim_access) { mSimAccess = sim_access; }
  156. U8 getSimAccess() const { return mSimAccess; }
  157. const std::string getSimAccessString() const;
  158. // Homestead-related getters; there are no setters as nobody should be
  159. // setting them other than the individual message handler which is a member
  160. S32 getSimClassID()                    const { return mClassID; }
  161. S32 getSimCPURatio()                   const { return mCPURatio; }
  162. const std::string& getSimColoName()    const { return mColoName; }
  163. const std::string& getSimProductSKU()  const { return mProductSKU; }
  164. const std::string& getSimProductName() const { return mProductName; }
  165. // Returns "Sandbox", "Expensive", etc.
  166. static std::string regionFlagsToString(U32 flags);
  167. // Returns translated version of "Mature", "PG", "Adult", etc.
  168. static std::string accessToString(U8 sim_access);
  169. // Returns "M", "PG", "A" etc.
  170. static std::string accessToShortString(U8 sim_access);
  171. // helper function which just makes sure all interested parties
  172. // can process the message.
  173. static void processRegionInfo(LLMessageSystem* msg, void**);
  174. void setCacheID(const LLUUID& id) { mCacheID = id; }
  175. F32 getWidth() const { return mWidth; }
  176. BOOL idleUpdate(F32 max_update_time);
  177. // Like idleUpdate, but forces everything to complete regardless of
  178. // how long it takes.
  179. void forceUpdate();
  180. void connectNeighbor(LLViewerRegion *neighborp, U32 direction);
  181. void updateNetStats();
  182. U32 getPacketsLost() const;
  183. void setHttpResponderPtrNULL() {mHttpResponderPtr = NULL ;}
  184. const LLHTTPClient::ResponderPtr getHttpResponderPtr() const {return mHttpResponderPtr ;}
  185. // Get/set named capability URLs for this region.
  186. void setSeedCapability(const std::string& url);
  187. void setCapability(const std::string& name, const std::string& url);
  188. // implements LLCapabilityProvider
  189.     virtual std::string getCapability(const std::string& name) const;
  190. static bool isSpecialCapabilityName(const std::string &name);
  191. void logActiveCapabilities() const;
  192.     /// Capability-request exception
  193.     typedef LLCapabilityListener::ArgError ArgError;
  194.     /// Get LLEventPump on which we listen for capability requests
  195.     /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities)
  196.     LLEventPump& getCapAPI() { return mCapabilityListener.getCapAPI(); }
  197.     /// implements LLCapabilityProvider
  198. virtual LLHost getHost() const { return mHost; }
  199. const U64  &getHandle() const  { return mHandle; }
  200. LLSurface &getLand() const { return *mLandp; }
  201. // set and get the region id
  202. const LLUUID& getRegionID() const { return mRegionID; }
  203. void setRegionID(const LLUUID& region_id) { mRegionID = region_id; }
  204. BOOL pointInRegionGlobal(const LLVector3d &point_global) const;
  205. LLVector3 getPosRegionFromGlobal(const LLVector3d &point_global) const;
  206. LLVector3 getPosRegionFromAgent(const LLVector3 &agent_pos) const;
  207. LLVector3 getPosAgentFromRegion(const LLVector3 &region_pos) const;
  208. LLVector3d getPosGlobalFromRegion(const LLVector3 &offset) const;
  209. LLVLComposition *getComposition() const { return mCompositionp; }
  210. F32 getCompositionXY(const S32 x, const S32 y) const;
  211. BOOL isOwnedSelf(const LLVector3& pos);
  212. // Owned by a group you belong to?  (officer OR member)
  213. BOOL isOwnedGroup(const LLVector3& pos);
  214. // deal with map object updates in the world.
  215. void updateCoarseLocations(LLMessageSystem* msg);
  216. F32 getLandHeightRegion(const LLVector3& region_pos);
  217. void getInfo(LLSD& info);
  218. // handle a full update message
  219. void cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp);
  220. LLDataPacker *getDP(U32 local_id, U32 crc);
  221. void requestCacheMisses();
  222. void addCacheMissFull(const U32 local_id);
  223. void dumpCache();
  224. void unpackRegionHandshake();
  225. void calculateCenterGlobal();
  226. void calculateCameraDistance();
  227. friend std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region);
  228.     /// implements LLCapabilityProvider
  229.     virtual std::string getDescription() const;
  230. LLSpatialPartition* getSpatialPartition(U32 type);
  231. public:
  232. struct CompareDistance
  233. {
  234. bool operator()(const LLViewerRegion* const& lhs, const LLViewerRegion* const& rhs)
  235. {
  236. return lhs->mCameraDistanceSquared < rhs->mCameraDistanceSquared; 
  237. }
  238. };
  239. void showReleaseNotes();
  240. protected:
  241. void disconnectAllNeighbors();
  242. void initStats();
  243. void setFlags(BOOL b, U32 flags);
  244. public:
  245. LLWind  mWind;
  246. LLCloudLayer mCloudLayer;
  247. LLViewerParcelOverlay *mParcelOverlay;
  248. LLStat mBitStat;
  249. LLStat mPacketsStat;
  250. LLStat mPacketsLostStat;
  251. LLMatrix4 mRenderMatrix;
  252. // These arrays are maintained in parallel. Ideally they'd be combined into a
  253. // single array of an aggrigate data type but for compatibility with the old
  254. // messaging system in which the previous message only sends and parses the 
  255. // positions stored in the first array so they're maintained separately until 
  256. // we stop supporting the old CoarseLocationUpdate message.
  257. LLDynamicArray<U32> mMapAvatars;
  258. LLDynamicArray<LLUUID> mMapAvatarIDs;
  259. private:
  260. // The surfaces and other layers
  261. LLSurface* mLandp;
  262. // Region geometry data
  263. LLVector3d mOriginGlobal; // Location of southwest corner of region (meters)
  264. LLVector3d mCenterGlobal; // Location of center in world space (meters)
  265. F32 mWidth; // Width of region on a side (meters)
  266. U64 mHandle;
  267. LLHost mHost;
  268. // The unique ID for this region.
  269. LLUUID mRegionID;
  270. F32 mTimeDilation; // time dilation of physics simulation on simulator
  271. // simulator name
  272. std::string mName;
  273. std::string mZoning;
  274. // region/estate owner - usually null.
  275. LLUUID mOwnerID;
  276. // Is this agent on the estate managers list for this region?
  277. BOOL mIsEstateManager;
  278. // Network statistics for the region's circuit...
  279. LLTimer mLastNetUpdate;
  280. U32 mPacketsIn;
  281. U32 mBitsIn;
  282. U32 mLastBitsIn;
  283. U32 mLastPacketsIn;
  284. U32 mPacketsOut;
  285. U32 mLastPacketsOut;
  286. S32 mPacketsLost;
  287. S32 mLastPacketsLost;
  288. U32 mPingDelay;
  289. F32 mDeltaTime; // Time since last measurement of lastPackets, Bits, etc
  290. // Misc
  291. LLVLComposition *mCompositionp; // Composition layer for the surface
  292. U32 mRegionFlags; // includes damage flags
  293. U8 mSimAccess;
  294. F32  mBillableFactor;
  295. U32 mMaxTasks; // max prim count
  296. F32 mCameraDistanceSquared; // updated once per frame
  297. // Information for Homestead / CR-53
  298. S32 mClassID;
  299. S32 mCPURatio;
  300. std::string mColoName;
  301. std::string mProductSKU;
  302. std::string mProductName;
  303. // Maps local ids to cache entries.
  304. // Regions can have order 10,000 objects, so assume
  305. // a structure of size 2^14 = 16,000
  306. BOOL mCacheLoaded;
  307. typedef std::map<U32, LLVOCacheEntry *> cache_map_t;
  308. cache_map_t      mCacheMap;
  309. LLVOCacheEntry mCacheStart;
  310. LLVOCacheEntry mCacheEnd;
  311. U32 mCacheEntriesCount;
  312. LLDynamicArray<U32> mCacheMissFull;
  313. LLDynamicArray<U32> mCacheMissCRC;
  314. // time?
  315. // LRU info?
  316. // Cache ID is unique per-region, across renames, moving locations,
  317. // etc.
  318. LLUUID mCacheID;
  319. typedef std::map<std::string, std::string> CapabilityMap;
  320. CapabilityMap mCapabilities;
  321. LLEventPoll* mEventPoll;
  322.     /// Post an event to this LLCapabilityListener to invoke a capability message on
  323.     /// this LLViewerRegion's server
  324.     /// (https://wiki.lindenlab.com/wiki/Viewer:Messaging/Messaging_Notes#Capabilities)
  325.     LLCapabilityListener mCapabilityListener;
  326. private:
  327. bool mAlive; // can become false if circuit disconnects
  328. //spatial partitions for objects in this region
  329. std::vector<LLSpatialPartition*> mObjectPartition;
  330. LLHTTPClient::ResponderPtr  mHttpResponderPtr ;
  331. BOOL mReleaseNotesRequested;
  332. };
  333. inline BOOL LLViewerRegion::getAllowDamage() const
  334. {
  335. return ((mRegionFlags & REGION_FLAGS_ALLOW_DAMAGE) !=0);
  336. }
  337. inline BOOL LLViewerRegion::getAllowLandmark() const
  338. {
  339. return ((mRegionFlags & REGION_FLAGS_ALLOW_LANDMARK) !=0);
  340. }
  341. inline BOOL LLViewerRegion::getAllowSetHome() const
  342. {
  343. return ((mRegionFlags & REGION_FLAGS_ALLOW_SET_HOME) != 0);
  344. }
  345. inline BOOL LLViewerRegion::getResetHomeOnTeleport() const
  346. {
  347. return ((mRegionFlags & REGION_FLAGS_RESET_HOME_ON_TELEPORT) !=0);
  348. }
  349. inline BOOL LLViewerRegion::getSunFixed() const
  350. {
  351. return ((mRegionFlags & REGION_FLAGS_SUN_FIXED) !=0);
  352. }
  353. inline BOOL LLViewerRegion::getBlockFly() const
  354. {
  355. return ((mRegionFlags & REGION_FLAGS_BLOCK_FLY) !=0);
  356. }
  357. inline BOOL LLViewerRegion::getAllowDirectTeleport() const
  358. {
  359. return ((mRegionFlags & REGION_FLAGS_ALLOW_DIRECT_TELEPORT) !=0);
  360. }
  361. inline BOOL LLViewerRegion::isPrelude() const
  362. {
  363. return is_prelude( mRegionFlags );
  364. }
  365. inline BOOL LLViewerRegion::getAllowTerraform() const
  366. {
  367. return ((mRegionFlags & REGION_FLAGS_BLOCK_TERRAFORM) == 0);
  368. }
  369. inline BOOL LLViewerRegion::getRestrictPushObject() const
  370. {
  371. return ((mRegionFlags & REGION_FLAGS_RESTRICT_PUSHOBJECT) != 0);
  372. }
  373. inline BOOL LLViewerRegion::getReleaseNotesRequested() const
  374. {
  375. return mReleaseNotesRequested;
  376. }
  377. #endif