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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llsurface.h
  3.  * @brief Description of LLSurface class
  4.  *
  5.  * $LicenseInfo:firstyear=2000&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2000-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_LLSURFACE_H
  33. #define LL_LLSURFACE_H
  34. //#include "vmath.h"
  35. #include "v3math.h"
  36. #include "v3dmath.h"
  37. #include "v4math.h"
  38. #include "m3math.h"
  39. #include "m4math.h"
  40. #include "llquaternion.h"
  41. #include "v4coloru.h"
  42. #include "v4color.h"
  43. #include "llvowater.h"
  44. #include "llpatchvertexarray.h"
  45. #include "llviewertexture.h"
  46. class LLTimer;
  47. class LLUUID;
  48. class LLAgent;
  49. class LLStat;
  50. static const U8 NO_EDGE    = 0x00;
  51. static const U8 EAST_EDGE  = 0x01;
  52. static const U8 NORTH_EDGE = 0x02;
  53. static const U8 WEST_EDGE  = 0x04;
  54. static const U8 SOUTH_EDGE = 0x08;
  55. static const S32 ONE_MORE_THAN_NEIGHBOR = 1;
  56. static const S32 EQUAL_TO_NEIGHBOR  = 0;
  57. static const S32 ONE_LESS_THAN_NEIGHBOR = -1;
  58. const S32 ABOVE_WATERLINE_ALPHA = 32;  // The alpha of water when the land elevation is above the waterline.
  59. class LLViewerRegion;
  60. class LLSurfacePatch;
  61. class LLBitPack;
  62. class LLGroupHeader;
  63. class LLSurface 
  64. {
  65. public:
  66. LLSurface(U32 type, LLViewerRegion *regionp = NULL);
  67. virtual ~LLSurface();
  68. static void initClasses(); // Do class initialization for LLSurface and its child classes.
  69. void create(const S32 surface_grid_width,
  70. const S32 surface_patch_width,
  71. const LLVector3d &origin_global,
  72. const F32 width); // Allocates and initializes surface
  73. void setRegion(LLViewerRegion *regionp);
  74. void setOriginGlobal(const LLVector3d &origin_global);
  75. void connectNeighbor(LLSurface *neighborp, U32 direction);
  76. void disconnectNeighbor(LLSurface *neighborp);
  77. void disconnectAllNeighbors();
  78. virtual void decompressDCTPatch(LLBitPack &bitpack, LLGroupHeader *gopp, BOOL b_large_patch);
  79. virtual void updatePatchVisibilities(LLAgent &agent);
  80. inline F32 getZ(const U32 k) const { return mSurfaceZ[k]; }
  81. inline F32 getZ(const S32 i, const S32 j) const { return mSurfaceZ[i + j*mGridsPerEdge]; }
  82. LLVector3 getOriginAgent() const;
  83. const LLVector3d &getOriginGlobal() const;
  84. F32 getMetersPerGrid() const;
  85. S32 getGridsPerEdge() const; 
  86. S32 getPatchesPerEdge() const;
  87. S32 getGridsPerPatchEdge() const;
  88. U32 getRenderStride(const U32 render_level) const;
  89. U32 getRenderLevel(const U32 render_stride) const;
  90. // Returns the height of the surface immediately above (or below) location,
  91. // or if location is not above surface returns zero.
  92. F32 resolveHeightRegion(const F32 x, const F32 y) const;
  93. F32 resolveHeightRegion(const LLVector3 &location) const
  94. { return resolveHeightRegion( location.mV[VX], location.mV[VY] ); }
  95. F32 resolveHeightGlobal(const LLVector3d &position_global) const;
  96. LLVector3 resolveNormalGlobal(const LLVector3d& v) const; //  Returns normal to surface
  97. LLSurfacePatch *resolvePatchRegion(const F32 x, const F32 y) const;
  98. LLSurfacePatch *resolvePatchRegion(const LLVector3 &position_region) const;
  99. LLSurfacePatch *resolvePatchGlobal(const LLVector3d &position_global) const;
  100. // Update methods (called during idle, normally)
  101. BOOL idleUpdate(F32 max_update_time);
  102. BOOL containsPosition(const LLVector3 &position);
  103. void moveZ(const S32 x, const S32 y, const F32 delta);
  104. LLViewerRegion *getRegion() const { return mRegionp; }
  105. F32 getMinZ() const { return mMinZ; }
  106. F32 getMaxZ() const { return mMaxZ; }
  107. void setWaterHeight(F32 height);
  108. F32 getWaterHeight() const;
  109. LLViewerTexture *getSTexture();
  110. LLViewerTexture *getWaterTexture();
  111. BOOL hasZData() const { return mHasZData; }
  112. void dirtyAllPatches(); // Use this to dirty all patches when changing terrain parameters
  113. void dirtySurfacePatch(LLSurfacePatch *patchp);
  114. LLVOWater *getWaterObj() { return mWaterObjp; }
  115. static void setTextureSize(const S32 texture_size);
  116. friend class LLSurfacePatch;
  117. friend std::ostream& operator<<(std::ostream &s, const LLSurface &S);
  118. public:
  119. // Number of grid points on one side of a region, including +1 buffer for
  120. // north and east edge.
  121. S32 mGridsPerEdge;
  122. F32 mOOGridsPerEdge; // Inverse of grids per edge
  123. S32 mPatchesPerEdge; // Number of patches on one side of a region
  124. S32 mNumberOfPatches; // Total number of patches
  125. // Each surface points at 8 neighbors (or NULL)
  126. // +---+---+---+
  127. // |NW | N | NE|
  128. // +---+---+---+
  129. // | W | 0 | E |
  130. // +---+---+---+
  131. // |SW | S | SE|
  132. // +---+---+---+
  133. LLSurface *mNeighbors[8]; // Adjacent patches
  134. U32 mType; // Useful for identifying derived classes
  135. F32 mDetailTextureScale; //  Number of times to repeat detail texture across this surface 
  136. static F32 sTextureUpdateTime;
  137. static S32 sTexelsUpdated;
  138. protected:
  139. void createSTexture();
  140. void createWaterTexture();
  141. void initTextures();
  142. void initWater();
  143. void createPatchData(); // Allocates memory for patches.
  144. void destroyPatchData();    // Deallocates memory for patches.
  145. BOOL generateWaterTexture(const F32 x, const F32 y,
  146. const F32 width, const F32 height); // Generate texture from composition values.
  147. //F32 updateTexture(LLSurfacePatch *ppatch);
  148. LLSurfacePatch *getPatch(const S32 x, const S32 y) const;
  149. protected:
  150. LLVector3d mOriginGlobal; // In absolute frame
  151. LLSurfacePatch *mPatchList; // Array of all patches
  152. // Array of grid data, mGridsPerEdge * mGridsPerEdge
  153. F32 *mSurfaceZ;
  154. // Array of grid normals, mGridsPerEdge * mGridsPerEdge
  155. LLVector3 *mNorm;
  156. std::set<LLSurfacePatch *> mDirtyPatchList;
  157. // The textures should never be directly initialized - use the setter methods!
  158. LLPointer<LLViewerTexture> mSTexturep; // Texture for surface
  159. LLPointer<LLViewerTexture> mWaterTexturep; // Water texture
  160. LLPointer<LLVOWater> mWaterObjp;
  161. // When we want multiple cameras we'll need one of each these for each camera
  162. S32 mVisiblePatchCount;
  163. U32 mGridsPerPatchEdge; // Number of grid points on a side of a patch
  164. F32 mMetersPerGrid; // Converts (i,j) indecies to distance
  165. F32 mMetersPerEdge; // = mMetersPerGrid * (mGridsPerEdge-1)
  166. LLPatchVertexArray mPVArray;
  167. BOOL mHasZData; // We've received any patch data for this surface.
  168. F32 mMinZ; // min z for this region (during the session)
  169. F32 mMaxZ; // max z for this region (during the session)
  170. S32 mSurfacePatchUpdateCount; // Number of frames since last update.
  171. private:
  172. LLViewerRegion *mRegionp; // Patch whose coordinate system this surface is using.
  173. static S32 sTextureSize; // Size of the surface texture
  174. };
  175. //        .   __.
  176. //     Z /|   /| Y                                 North
  177. //        |   / 
  178. //        |  /             |<----------------- mGridsPerSurfaceEdge --------------->|
  179. //        | /              __________________________________________________________
  180. //        |/______ X     /_______________________________________________________  /
  181. //                /      /      /      /      /      /      /      /M*M-2 /M*M-1 / /  
  182. //                      /______/______/______/______/______/______/______/______/ /  
  183. //                     /      /      /      /      /      /      /      /      / /  
  184. //                    /______/______/______/______/______/______/______/______/ /  
  185. //                   /      /      /      /      /      /      /      /      / /  
  186. //                  /______/______/______/______/______/______/______/______/ /  
  187. //      West       /      /      /      /      /      /      /      /      / /  
  188. //                /______/______/______/______/______/______/______/______/ /     East
  189. //               /...   /      /      /      /      /      /      /      / /  
  190. //              /______/______/______/______/______/______/______/______/ /  
  191. //       _.    / 2M   /      /      /      /      /      /      /      / /  
  192. //       /|   /______/______/______/______/______/______/______/______/ /  
  193. //      /    / M    / M+1  / M+2  / ...  /      /      /      / 2M-1 / /   
  194. //     j    /______/______/______/______/______/______/______/______/ /   
  195. //         / 0    / 1    / 2    / ...  /      /      /      / M-1  / /   
  196. //        /______/______/______/______/______/______/______/______/_/   
  197. //                                South             |<-L->|
  198. //             i -->
  199. //
  200. // where M = mSurfPatchWidth
  201. // and L = mPatchGridWidth
  202. // 
  203. // Notice that mGridsPerSurfaceEdge = a power of two + 1
  204. // This provides a buffer on the east and north edges that will allow us to 
  205. // fill the cracks between adjacent surfaces when rendering.
  206. #endif