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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llworld.h
  3.  * @brief Collection of viewer regions in the vacinity of the user.
  4.  *
  5.  * Represents the whole world, so far as 3D functionality is conserned.
  6.  * Always contains the region that the user's avatar is in along with
  7.  * neighboring regions. As the user crosses region boundaries, new
  8.  * regions are added to the world and distant ones are rolled up.
  9.  *
  10.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  11.  * 
  12.  * Copyright (c) 2001-2010, Linden Research, Inc.
  13.  * 
  14.  * Second Life Viewer Source Code
  15.  * The source code in this file ("Source Code") is provided by Linden Lab
  16.  * to you under the terms of the GNU General Public License, version 2.0
  17.  * ("GPL"), unless you have obtained a separate licensing agreement
  18.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  19.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  20.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  21.  * 
  22.  * There are special exceptions to the terms and conditions of the GPL as
  23.  * it is applied to this Source Code. View the full text of the exception
  24.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  25.  * online at
  26.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  27.  * 
  28.  * By copying, modifying or distributing this software, you acknowledge
  29.  * that you have read and understood your obligations described above,
  30.  * and agree to abide by those obligations.
  31.  * 
  32.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  33.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  34.  * COMPLETENESS OR PERFORMANCE.
  35.  * $/LicenseInfo$
  36.  */
  37. #ifndef LL_LLWORLD_H
  38. #define LL_LLWORLD_H
  39. #include "llpatchvertexarray.h"
  40. #include "llmath.h"
  41. #include "v3math.h"
  42. #include "llsingleton.h"
  43. #include "llstring.h"
  44. #include "llviewerpartsim.h"
  45. #include "llviewertexture.h"
  46. #include "llvowater.h"
  47. class LLViewerRegion;
  48. class LLVector3d;
  49. class LLMessageSystem;
  50. class LLNetMap;
  51. class LLHost;
  52. class LLViewerObject;
  53. class LLSurfacePatch;
  54. class LLCloudPuff;
  55. class LLCloudGroup;
  56. class LLVOAvatar;
  57. // LLWorld maintains a stack of unused viewer_regions and an array of pointers to viewer regions
  58. // as simulators are connected to, viewer_regions are popped off the stack and connected as required
  59. // as simulators are removed, they are pushed back onto the stack
  60. class LLWorld : public LLSingleton<LLWorld>
  61. {
  62. public:
  63. LLWorld();
  64. void destroyClass();
  65. LLViewerRegion* addRegion(const U64 &region_handle, const LLHost &host);
  66. // safe to call if already present, does the "right thing" if
  67. // hosts are same, or if hosts are different, etc...
  68. void removeRegion(const LLHost &host);
  69. void disconnectRegions(); // Send quit messages to all child regions
  70. LLViewerRegion* getRegion(const LLHost &host);
  71. LLViewerRegion* getRegionFromPosGlobal(const LLVector3d &pos);
  72. LLViewerRegion* getRegionFromPosAgent(const LLVector3 &pos);
  73. LLViewerRegion* getRegionFromHandle(const U64 &handle);
  74. BOOL positionRegionValidGlobal(const LLVector3d& pos); // true if position is in valid region
  75. LLVector3d clipToVisibleRegions(const LLVector3d &start_pos, const LLVector3d &end_pos);
  76. void updateAgentOffset(const LLVector3d &offset);
  77. // All of these should be in the agent coordinate frame
  78. LLViewerRegion* resolveRegionGlobal(LLVector3 &localpos, const LLVector3d &position);
  79. LLViewerRegion* resolveRegionAgent(LLVector3 &localpos, const LLVector3 &position);
  80. F32 resolveLandHeightGlobal(const LLVector3d &position);
  81. F32 resolveLandHeightAgent(const LLVector3 &position);
  82. // Return the lowest allowed Z point to prevent objects from being moved
  83. // underground.
  84. F32 getMinAllowedZ(LLViewerObject* object);
  85. // takes a line segment defined by point_a and point_b, then
  86. // determines the closest (to point_a) point of intersection that is
  87. // on the land surface or on an object of the world.
  88. // Stores results in "intersection" and "intersection_normal" and
  89. // returns a scalar value that is the normalized (by length of line segment) 
  90. // distance along the line from "point_a" to "intersection".
  91. //
  92. // Currently assumes point_a and point_b only differ in z-direction,
  93. // but it may eventually become more general.
  94. F32 resolveStepHeightGlobal(const LLVOAvatar* avatarp, const LLVector3d &point_a, const LLVector3d &point_b,
  95. LLVector3d &intersection, LLVector3 &intersection_normal,
  96. LLViewerObject** viewerObjectPtr=NULL);
  97. LLSurfacePatch * resolveLandPatchGlobal(const LLVector3d &position);
  98. LLVector3 resolveLandNormalGlobal(const LLVector3d &position); // absolute frame
  99. U32 getRegionWidthInPoints() const { return mWidth; }
  100. F32 getRegionScale() const { return mScale; }
  101. // region X and Y size in meters
  102. F32 getRegionWidthInMeters() const { return mWidthInMeters; }
  103. F32 getRegionMinHeight() const { return -mWidthInMeters; }
  104. F32 getRegionMaxHeight() const { return MAX_OBJECT_Z; }
  105. void updateRegions(F32 max_update_time);
  106. void updateVisibilities();
  107. void updateParticles();
  108. void updateClouds(const F32 dt);
  109. LLCloudGroup * findCloudGroup(const LLCloudPuff &puff);
  110. void renderPropertyLines();
  111. void resetStats();
  112. void updateNetStats(); // Update network statistics for all the regions...
  113. void printPacketsLost();
  114. void requestCacheMisses();
  115. // deal with map object updates in the world.
  116. static void processCoarseUpdate(LLMessageSystem* msg, void** user_data);
  117. F32 getLandFarClip() const;
  118. void setLandFarClip(const F32 far_clip);
  119. LLViewerTexture *getDefaultWaterTexture();
  120. void updateWaterObjects();
  121. void shiftRegions(const LLVector3& offset);
  122. void setSpaceTimeUSec(const U64 space_time_usec);
  123. U64 getSpaceTimeUSec() const;
  124. void getInfo(LLSD& info);
  125. public:
  126. typedef std::list<LLViewerRegion*> region_list_t;
  127. const region_list_t& getRegionList() const { return mActiveRegionList; }
  128. // Returns lists of avatar IDs and their world-space positions within a given distance of a point.
  129. // All arguments are optional. Given containers will be emptied and then filled.
  130. // Not supplying origin or radius input returns data on all avatars in the known regions.
  131. void getAvatars(
  132. std::vector<LLUUID>* avatar_ids = NULL,
  133. std::vector<LLVector3d>* positions = NULL, 
  134. const LLVector3d& relative_to = LLVector3d(), F32 radius = FLT_MAX) const;
  135. private:
  136. region_list_t mActiveRegionList;
  137. region_list_t mRegionList;
  138. region_list_t mVisibleRegionList;
  139. region_list_t mCulledRegionList;
  140. // Number of points on edge
  141. static const U32 mWidth;
  142. // meters/point, therefore mWidth * mScale = meters per edge
  143. static const F32 mScale;
  144. static const F32 mWidthInMeters;
  145. F32 mLandFarClip; // Far clip distance for land.
  146. LLPatchVertexArray mLandPatch;
  147. S32 mLastPacketsIn;
  148. S32 mLastPacketsOut;
  149. S32 mLastPacketsLost;
  150. U64 mSpaceTimeUSec;
  151. ////////////////////////////
  152. //
  153. // Data for "Fake" objects
  154. //
  155. std::list<LLVOWater*> mHoleWaterObjects;
  156. LLPointer<LLVOWater> mEdgeWaterObjects[8];
  157. LLPointer<LLViewerTexture> mDefaultWaterTexturep;
  158. };
  159. void process_enable_simulator(LLMessageSystem *mesgsys, void **user_data);
  160. void process_disable_simulator(LLMessageSystem *mesgsys, void **user_data);
  161. void process_region_handshake(LLMessageSystem* msg, void** user_data);
  162. void send_agent_pause();
  163. void send_agent_resume();
  164. #endif