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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llviewerparcelmgr.h
  3.  * @brief Viewer-side representation of owned land
  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_LLVIEWERPARCELMGR_H
  33. #define LL_LLVIEWERPARCELMGR_H
  34. #include "v3dmath.h"
  35. #include "lldarray.h"
  36. #include "llframetimer.h"
  37. #include "llsingleton.h"
  38. #include "llparcelselection.h"
  39. #include "llui.h"
  40. #include <boost/function.hpp>
  41. #include <boost/signals2.hpp>
  42. class LLUUID;
  43. class LLMessageSystem;
  44. class LLParcel;
  45. class LLViewerTexture;
  46. class LLViewerRegion;
  47. // Constants for sendLandOwner
  48. //const U32 NO_NEIGHBOR_JOIN = 0x0;
  49. //const U32 ALL_NEIGHBOR_JOIN = U32(  NORTH_MASK 
  50. //   | SOUTH_MASK 
  51. //   | EAST_MASK 
  52. //   | WEST_MASK);
  53. // Specify the type of land transfer taking place
  54. //enum ELandTransferType
  55. //{
  56. // LTT_RELEASE_LAND = 0x1,
  57. // LTT_CLAIM_LAND = 0x2,
  58. // LTT_BUY_LAND = 0x4,
  59. // LTT_DEED_LAND = 0x8,
  60. // LTT_FOR_GROUP = 0x16
  61. //};
  62. // Base class for people who want to "observe" changes in the viewer
  63. // parcel selection.
  64. //FIXME: this should be done by grabbing a floating parcel selection and observing changes on it, not the parcel mgr
  65. //--RN
  66. class LLParcelObserver
  67. {
  68. public:
  69. virtual ~LLParcelObserver() {};
  70. virtual void changed() = 0;
  71. };
  72. class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr>
  73. {
  74. public:
  75. typedef boost::function<void (const LLVector3d&)> teleport_finished_callback_t;
  76. typedef boost::signals2::signal<void (const LLVector3d&)> teleport_finished_signal_t;
  77. typedef boost::function<void()> parcel_changed_callback_t;
  78. typedef boost::signals2::signal<void()> parcel_changed_signal_t;
  79. LLViewerParcelMgr();
  80. ~LLViewerParcelMgr();
  81. static void cleanupGlobals();
  82. BOOL selectionEmpty() const;
  83. F32 getSelectionWidth() const { return F32(mEastNorth.mdV[VX] - mWestSouth.mdV[VX]); }
  84. F32 getSelectionHeight() const { return F32(mEastNorth.mdV[VY] - mWestSouth.mdV[VY]); }
  85. BOOL getSelection(LLVector3d &min, LLVector3d &max) { min = mWestSouth; max = mEastNorth; return !selectionEmpty();}
  86. LLViewerRegion* getSelectionRegion();
  87. F32 getDwelling() const { return mSelectedDwell;}
  88. void getDisplayInfo(S32* area, S32* claim, S32* rent, BOOL* for_sale, F32* dwell);
  89. // Returns selected area
  90. S32 getSelectedArea() const;
  91. void resetSegments(U8* segments);
  92. // write a rectangle's worth of line segments into the highlight array
  93. void writeHighlightSegments(F32 west, F32 south, F32 east, F32 north);
  94. // Write highlight segments from a packed bitmap of the appropriate
  95. // parcel.
  96. void writeSegmentsFromBitmap(U8* bitmap, U8* segments);
  97. void writeAgentParcelFromBitmap(U8* bitmap);
  98. // Select the collision parcel
  99. void selectCollisionParcel();
  100. // Select the parcel at a specific point
  101. LLParcelSelectionHandle selectParcelAt(const LLVector3d& pos_global);
  102. // Take the current rectangle select, and select the parcel contained
  103. // within it.
  104. LLParcelSelectionHandle selectParcelInRectangle();
  105. // Select a piece of land
  106. LLParcelSelectionHandle selectLand(const LLVector3d &corner1, const LLVector3d &corner2, 
  107.    BOOL snap_to_parcel);
  108. // Clear the selection, and stop drawing the highlight.
  109. void deselectLand();
  110. void deselectUnused();
  111. void addObserver(LLParcelObserver* observer);
  112. void removeObserver(LLParcelObserver* observer);
  113. void notifyObservers();
  114. void setSelectionVisible(BOOL visible) { mRenderSelection = visible; }
  115. BOOL isOwnedAt(const LLVector3d& pos_global) const;
  116. BOOL isOwnedSelfAt(const LLVector3d& pos_global) const;
  117. BOOL isOwnedOtherAt(const LLVector3d& pos_global) const;
  118. BOOL isSoundLocal(const LLVector3d &pos_global) const;
  119. BOOL canHearSound(const LLVector3d &pos_global) const;
  120. // Returns a reference counted pointer to current parcel selection.  
  121. // Selection does not change to reflect new selections made by user
  122. // Use this when implementing a task UI that refers to a specific
  123. // selection.
  124. LLParcelSelectionHandle getParcelSelection() const;
  125. // Returns a reference counted pointer to current parcel selection.
  126. // Pointer tracks whatever the user has currently selected.
  127. // Use this when implementing an inspector UI.
  128. // http://en.wikipedia.org/wiki/Inspector_window
  129. LLParcelSelectionHandle getFloatingParcelSelection() const;
  130. //LLParcel *getParcelSelection() const;
  131. LLParcel *getAgentParcel() const;
  132. BOOL inAgentParcel(const LLVector3d &pos_global) const;
  133. // Returns a pointer only when it has valid data.
  134. LLParcel* getHoverParcel() const;
  135. LLParcel* getCollisionParcel() const;
  136. // Can this agent build on the parcel he is on?
  137. // Used for parcel property icons in nav bar.
  138. bool allowAgentBuild() const;
  139. bool allowAgentBuild(const LLParcel* parcel) const;
  140. // Can this agent speak on the parcel he is on?
  141. // Used for parcel property icons in nav bar.
  142. bool allowAgentVoice() const;
  143. bool allowAgentVoice(const LLViewerRegion* region, const LLParcel* parcel) const;
  144. // Can this agent start flying on this parcel?
  145. // Used for parcel property icons in nav bar.
  146. bool allowAgentFly(const LLViewerRegion* region, const LLParcel* parcel) const;
  147. // Can this agent be pushed by llPushObject() on this parcel?
  148. // Used for parcel property icons in nav bar.
  149. bool allowAgentPush(const LLViewerRegion* region, const LLParcel* parcel) const;
  150. // Can scripts written by non-parcel-owners run on the agent's current
  151. // parcel?  Used for parcel property icons in nav bar.
  152. bool allowAgentScripts(const LLViewerRegion* region, const LLParcel* parcel) const;
  153. // Can the agent be damaged here?
  154. // Used for parcel property icons in nav bar.
  155. bool allowAgentDamage(const LLViewerRegion* region, const LLParcel* parcel) const;
  156. F32 getHoverParcelWidth() const
  157. { return F32(mHoverEastNorth.mdV[VX] - mHoverWestSouth.mdV[VX]); }
  158. F32 getHoverParcelHeight() const
  159. { return F32(mHoverEastNorth.mdV[VY] - mHoverWestSouth.mdV[VY]); }
  160. // UTILITIES
  161. void render();
  162. void renderParcelCollision();
  163. void renderRect( const LLVector3d &west_south_bottom, 
  164. const LLVector3d &east_north_top );
  165. void renderOneSegment(F32 x1, F32 y1, F32 x2, F32 y2, F32 height, U8 direction, LLViewerRegion* regionp);
  166. void renderHighlightSegments(const U8* segments, LLViewerRegion* regionp);
  167. void renderCollisionSegments(U8* segments, BOOL use_pass, LLViewerRegion* regionp);
  168. void sendParcelGodForceOwner(const LLUUID& owner_id);
  169. // make the selected parcel a content parcel. 
  170. void sendParcelGodForceToContent();
  171. // Pack information about this parcel and send it to the region
  172. // containing the southwest corner of the selection.
  173. // If want_reply_to_update, simulator will send back a ParcelProperties
  174. // message.
  175. void sendParcelPropertiesUpdate(LLParcel* parcel, bool use_agent_region = false);
  176. // Takes an Access List flag, like AL_ACCESS or AL_BAN
  177. void sendParcelAccessListUpdate(U32 which);
  178. // Takes an Access List flag, like AL_ACCESS or AL_BAN
  179. void sendParcelAccessListRequest(U32 flags);
  180. // asks for the parcel's media url filter list
  181. void    requestParcelMediaURLFilter();
  182. // receive the response
  183. void    receiveParcelMediaURLFilter(const LLSD &content);
  184. // Dwell is not part of the usual parcel update information because the
  185. // simulator doesn't actually know the per-parcel dwell.  Ack!  We have
  186. // to get it out of the database.
  187. void sendParcelDwellRequest();
  188. // If the point is outside the current hover parcel, request more data
  189. void setHoverParcel(const LLVector3d& pos_global);
  190. bool canAgentBuyParcel(LLParcel*, bool forGroup) const;
  191. // void startClaimLand(BOOL is_for_group = FALSE);
  192. void startBuyLand(BOOL is_for_group = FALSE);
  193. void startSellLand();
  194. void startReleaseLand();
  195. void startDivideLand();
  196. void startJoinLand();
  197. void startDeedLandToGroup();
  198. void reclaimParcel();
  199. void buyPass();
  200. // Buying Land
  201. class ParcelBuyInfo;
  202. ParcelBuyInfo* setupParcelBuy(const LLUUID& agent_id,
  203.   const LLUUID& session_id,  
  204.   const LLUUID& group_id,
  205.   BOOL is_group_owned,
  206.   BOOL is_claim,
  207.   BOOL remove_contribution);
  208. // callers responsibility to call deleteParcelBuy() on return value
  209. void sendParcelBuy(ParcelBuyInfo*);
  210. void deleteParcelBuy(ParcelBuyInfo* *info);
  211.    
  212. void sendParcelDeed(const LLUUID& group_id);
  213. // Send the ParcelRelease message
  214. void sendParcelRelease();
  215. // accessors for mAgentParcel
  216. const std::string& getAgentParcelName() const;
  217. // Create a landmark at the "appropriate" location for the
  218. // currently selected parcel.
  219. // *NOTE: Taken out 2005-03-21. Phoenix.
  220. //void makeLandmarkAtSelection();
  221. static void processParcelOverlay(LLMessageSystem *msg, void **user_data);
  222. static void processParcelProperties(LLMessageSystem *msg, void **user_data);
  223. static void processParcelAccessListReply(LLMessageSystem *msg, void **user);
  224. static void processParcelDwellReply(LLMessageSystem *msg, void **user);
  225. void dump();
  226. // Whether or not the collision border around the parcel is there because
  227. // the agent is banned or not in the allowed group
  228. BOOL isCollisionBanned();
  229. boost::signals2::connection addAgentParcelChangedCallback(parcel_changed_callback_t cb);
  230. boost::signals2::connection setTeleportFinishedCallback(teleport_finished_callback_t cb);
  231. boost::signals2::connection setTeleportFailedCallback(parcel_changed_callback_t cb);
  232. void onTeleportFinished(bool local, const LLVector3d& new_pos);
  233. void onTeleportFailed();
  234. static BOOL isParcelOwnedByAgent(const LLParcel* parcelp, U64 group_proxy_power);
  235. static BOOL isParcelModifiableByAgent(const LLParcel* parcelp, U64 group_proxy_power);
  236. private:
  237. static bool releaseAlertCB(const LLSD& notification, const LLSD& response);
  238. // If the user is claiming land and the current selection 
  239. // borders a piece of land the user already owns, ask if he
  240. // wants to join this land to the other piece.
  241. //void askJoinIfNecessary(ELandTransferType land_transfer_type);
  242. //static void joinAlertCB(S32 option, void* data);
  243. //void buyAskMoney(ELandTransferType land_transfer_type);
  244. // move land from current owner to it's group.
  245. void deedLandToGroup();
  246. static bool deedAlertCB(const LLSD& notification, const LLSD& response);
  247. static bool callbackDivideLand(const LLSD& notification, const LLSD& response);
  248. static bool callbackJoinLand(const LLSD& notification, const LLSD& response);
  249. //void finishClaim(BOOL user_to_user_sale, U32 join);
  250. LLViewerTexture* getBlockedImage() const;
  251. LLViewerTexture* getPassImage() const;
  252. private:
  253. BOOL mSelected;
  254. LLParcel* mCurrentParcel; // selected parcel info
  255. LLParcelSelectionHandle mCurrentParcelSelection;
  256. LLParcelSelectionHandle mFloatingParcelSelection;
  257. S32 mRequestResult; // result of last parcel request
  258. LLVector3d mWestSouth;
  259. LLVector3d mEastNorth;
  260. F32 mSelectedDwell;
  261. LLParcel *mAgentParcel; // info for parcel agent is in
  262. S32 mAgentParcelSequenceID; // incrementing counter to suppress out of order updates
  263. LLParcel* mHoverParcel;
  264. S32 mHoverRequestResult;
  265. LLVector3d mHoverWestSouth;
  266. LLVector3d mHoverEastNorth;
  267. LLDynamicArray<LLParcelObserver*> mObservers;
  268. BOOL mTeleportInProgress;
  269. teleport_finished_signal_t mTeleportFinishedSignal;
  270. parcel_changed_signal_t mTeleportFailedSignal;
  271. parcel_changed_signal_t mAgentParcelChangedSignal;
  272. // Array of pieces of parcel edges to potentially draw
  273. // Has (parcels_per_edge + 1) * (parcels_per_edge + 1) elements so
  274. // we can represent edges of the grid.
  275. // WEST_MASK = draw west edge
  276. // SOUTH_MASK = draw south edge
  277. S32 mParcelsPerEdge;
  278. U8* mHighlightSegments;
  279. U8* mAgentParcelOverlay;
  280. // Raw data buffer for unpacking parcel overlay chunks
  281. // Size = parcels_per_edge * parcels_per_edge / parcel_overlay_chunks
  282. static U8* sPackedOverlay;
  283. // Watch for pending collisions with a parcel you can't access.
  284. // If it's coming, draw the parcel's boundaries.
  285. LLParcel* mCollisionParcel;
  286. U8* mCollisionSegments;
  287. BOOL mRenderCollision; 
  288. BOOL mRenderSelection;
  289. S32 mCollisionBanned;     
  290. LLFrameTimer mCollisionTimer;
  291. LLViewerTexture* mBlockedImage;
  292. LLViewerTexture* mPassImage;
  293. // Media
  294. S32  mMediaParcelId;
  295. U64  mMediaRegionId;
  296. };
  297. void sanitize_corners(const LLVector3d &corner1, const LLVector3d &corner2,
  298. LLVector3d &west_south_bottom, LLVector3d &east_north_top);
  299. #endif