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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llcloud.h
  3.  * @brief Description of viewer LLCloudLayer 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_LLCLOUD_H
  33. #define LL_LLCLOUD_H
  34. // Some ideas on how clouds should work
  35. //
  36. // Each region has a cloud layer
  37. // Each cloud layer has pre-allocated space for N clouds
  38. // The LLSky class knows the max number of clouds to render M.
  39. // All clouds use the same texture, but the tex-coords can take on 8 configurations 
  40. // (four rotations, front and back)
  41. // 
  42. // The sky's part
  43. // --------------
  44. // The sky knows that A clouds have been assigned to regions and there are B left over. 
  45. // Divide B by number of active regions to get C.
  46. // Ask each region to add C more clouds and return total number D.
  47. // Add up all the D's to get a new A.
  48. //
  49. // The cloud layer's part
  50. // ----------------------
  51. // The cloud layer is a grid of possibility.  Each grid's value represents the probablility
  52. // (0.0 to 1.0) that a cloud placement query will succeed.  
  53. //
  54. // The sky asks the region to add C more clouds.
  55. // The cloud layer tries a total of E times to place clouds and returns total cloud count.
  56. // 
  57. // Clouds move according to local wind velocity.
  58. // If a cloud moves out of region then it's location is sent to neighbor region
  59. // or it is allowed to drift and decay.
  60. //
  61. // The clouds in non-visible regions do not propagate every frame.
  62. // Each frame one non-visible region is allowed to propagate it's clouds 
  63. // (might have to check to see if incoming cloud was already visible or not).
  64. //
  65. // 
  66. #include "llmath.h"
  67. //#include "vmath.h"
  68. #include "v3math.h"
  69. #include "v3dmath.h"
  70. #include "v4math.h"
  71. #include "v4color.h"
  72. #include "llpointer.h"
  73. #include "lldarray.h"
  74. #include "llframetimer.h"
  75. const U32 CLOUD_GRIDS_PER_EDGE  = 16;
  76. const F32 CLOUD_PUFF_WIDTH = 64.f;
  77. const F32 CLOUD_PUFF_HEIGHT = 48.f;
  78. class LLWind;
  79. class LLVOClouds;
  80. class LLViewerRegion;
  81. class LLCloudLayer;
  82. class LLBitPack;
  83. class LLGroupHeader;
  84. const S32 CLOUD_GROUPS_PER_EDGE = 4;
  85. class LLCloudPuff
  86. {
  87. public:
  88. LLCloudPuff();
  89. const LLVector3d &getPositionGlobal() const { return mPositionGlobal; }
  90. friend class LLCloudGroup;
  91. void updatePuffs(const F32 dt);
  92. void updatePuffOwnership();
  93. F32 getAlpha() const { return mAlpha; }
  94. U32 getLifeState() const { return mLifeState; }
  95. void setLifeState(const U32 state) { mLifeState = state; }
  96. BOOL isDead() const { return mAlpha <= 0.f; }
  97. static S32 sPuffCount;
  98. protected:
  99. F32 mAlpha;
  100. F32 mRate;
  101. LLVector3d mPositionGlobal;
  102. BOOL mLifeState;
  103. };
  104. class LLCloudGroup
  105. {
  106. public:
  107. LLCloudGroup();
  108. void cleanup();
  109. void setCloudLayerp(LLCloudLayer *clp) { mCloudLayerp = clp; }
  110. void setCenterRegion(const LLVector3 &center);
  111. void updatePuffs(const F32 dt);
  112. void updatePuffOwnership();
  113. void updatePuffCount();
  114. BOOL inGroup(const LLCloudPuff &puff) const;
  115. F32 getDensity() const { return mDensity; }
  116. S32 getNumPuffs() const { return (S32) mCloudPuffs.size(); }
  117. const LLCloudPuff &getPuff(const S32 i) { return mCloudPuffs[i]; }
  118. protected:
  119. LLCloudLayer *mCloudLayerp;
  120. LLVector3 mCenterRegion;
  121. F32 mDensity;
  122. S32 mTargetPuffCount;
  123. std::vector<LLCloudPuff> mCloudPuffs;
  124. LLPointer<LLVOClouds> mVOCloudsp;
  125. };
  126. class LLCloudLayer
  127. {
  128. public:
  129. LLCloudLayer();
  130. ~LLCloudLayer();
  131. void create(LLViewerRegion *regionp);
  132. void destroy();
  133. void reset(); // Clears all active cloud puffs
  134. void updatePuffs(const F32 dt);
  135. void updatePuffOwnership();
  136. void updatePuffCount();
  137. LLCloudGroup *findCloudGroup(const LLCloudPuff &puff);
  138. void setRegion(LLViewerRegion *regionp);
  139. LLViewerRegion* getRegion() const { return mRegionp; }
  140. void setWindPointer(LLWind *windp);
  141. void setOriginGlobal(const LLVector3d &origin_global) { mOriginGlobal = origin_global; }
  142. void setWidth(F32 width);
  143. void setBrightness(F32 brightness);
  144. void setSunColor(const LLColor4 &color);
  145. F32 getDensityRegion(const LLVector3 &pos_region); // "position" is in local coordinates
  146. void decompress(LLBitPack &bitpack, LLGroupHeader *group_header);
  147. LLCloudLayer* getNeighbor(const S32 n) const { return mNeighbors[n]; }
  148. void connectNeighbor(LLCloudLayer *cloudp, U32 direction);
  149. void disconnectNeighbor(U32 direction);
  150. void disconnectAllNeighbors();
  151. public:
  152. LLVector3d  mOriginGlobal;
  153. F32 mMetersPerEdge;
  154. F32 mMetersPerGrid;
  155. F32 mMaxAlpha; // The max cloud puff _render_ alpha
  156. protected:
  157. LLCloudLayer *mNeighbors[4];
  158. LLWind *mWindp;
  159. LLViewerRegion *mRegionp;
  160. F32  *mDensityp; // the probability density grid
  161. LLCloudGroup mCloudGroups[CLOUD_GROUPS_PER_EDGE][CLOUD_GROUPS_PER_EDGE];
  162. };
  163. #endif