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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llviewerpartsim.h
  3.  * @brief LLViewerPart class header file
  4.  *
  5.  * $LicenseInfo:firstyear=2003&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2003-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_LLVIEWERPARTSIM_H
  33. #define LL_LLVIEWERPARTSIM_H
  34. #include "lldarrayptr.h"
  35. #include "llframetimer.h"
  36. #include "llpointer.h"
  37. #include "llpartdata.h"
  38. #include "llviewerpartsource.h"
  39. class LLViewerTexture;
  40. class LLViewerPart;
  41. class LLViewerRegion;
  42. class LLViewerTexture;
  43. class LLVOPartGroup;
  44. typedef void (*LLVPCallback)(LLViewerPart &part, const F32 dt);
  45. ///////////////////
  46. //
  47. // An individual particle
  48. //
  49. class LLViewerPart : public LLPartData
  50. {
  51. public:
  52. ~LLViewerPart();
  53. public:
  54. LLViewerPart();
  55. void init(LLPointer<LLViewerPartSource> sourcep, LLViewerTexture *imagep, LLVPCallback cb);
  56. U32 mPartID; // Particle ID used primarily for moving between groups
  57. F32 mLastUpdateTime; // Last time the particle was updated
  58. F32 mSkipOffset; // Offset against current group mSkippedTime
  59. LLVPCallback mVPCallback; // Callback function for more complicated behaviors
  60. LLPointer<LLViewerPartSource> mPartSourcep; // Particle source used for this object
  61. // Current particle state (possibly used for rendering)
  62. LLPointer<LLViewerTexture> mImagep;
  63. LLVector3 mPosAgent;
  64. LLVector3 mVelocity;
  65. LLVector3 mAccel;
  66. LLColor4 mColor;
  67. LLVector2 mScale;
  68. static U32 sNextPartID;
  69. };
  70. class LLViewerPartGroup
  71. {
  72. public:
  73. LLViewerPartGroup(const LLVector3 &center,
  74.   const F32 box_radius,
  75.   bool hud);
  76. virtual ~LLViewerPartGroup();
  77. void cleanup();
  78. BOOL addPart(LLViewerPart* part, const F32 desired_size = -1.f);
  79. void updateParticles(const F32 lastdt);
  80. BOOL posInGroup(const LLVector3 &pos, const F32 desired_size = -1.f);
  81. void shift(const LLVector3 &offset);
  82. typedef std::vector<LLViewerPart*>  part_list_t;
  83. part_list_t mParticles;
  84. const LLVector3 &getCenterAgent() const { return mCenterAgent; }
  85. S32 getCount() const { return (S32) mParticles.size(); }
  86. LLViewerRegion *getRegion() const { return mRegionp; }
  87. void removeParticlesByID(const U32 source_id);
  88. LLPointer<LLVOPartGroup> mVOPartGroupp;
  89. BOOL mUniformParticles;
  90. U32 mID;
  91. F32 mSkippedTime;
  92. bool mHud;
  93. protected:
  94. LLVector3 mCenterAgent;
  95. F32 mBoxRadius;
  96. LLVector3 mMinObjPos;
  97. LLVector3 mMaxObjPos;
  98. LLViewerRegion *mRegionp;
  99. };
  100. class LLViewerPartSim : public LLSingleton<LLViewerPartSim>
  101. {
  102. public:
  103. LLViewerPartSim();
  104. virtual ~LLViewerPartSim(){}
  105. void destroyClass();
  106. typedef std::vector<LLViewerPartGroup *> group_list_t;
  107. typedef std::vector<LLPointer<LLViewerPartSource> > source_list_t;
  108. void shift(const LLVector3 &offset);
  109. void updateSimulation();
  110. void addPartSource(LLPointer<LLViewerPartSource> sourcep);
  111. void cleanupRegion(LLViewerRegion *regionp);
  112. BOOL shouldAddPart(); // Just decides whether this particle should be added or not (for particle count capping)
  113. F32 maxRate() // Return maximum particle generation rate
  114. {
  115. if (sParticleCount >= MAX_PART_COUNT)
  116. {
  117. return 1.f;
  118. }
  119. if (sParticleCount > PART_THROTTLE_THRESHOLD*sMaxParticleCount)
  120. {
  121. return (((F32)sParticleCount/(F32)sMaxParticleCount)-PART_THROTTLE_THRESHOLD)*PART_THROTTLE_RESCALE;
  122. }
  123. return 0.f;
  124. }
  125. F32 getRefRate() { return sParticleAdaptiveRate; }
  126. F32 getBurstRate() {return sParticleBurstRate; }
  127. void addPart(LLViewerPart* part);
  128. void updatePartBurstRate() ;
  129. void clearParticlesByID(const U32 system_id);
  130. void clearParticlesByOwnerID(const LLUUID& task_id);
  131. void removeLastCreatedSource();
  132. const source_list_t* getParticleSystemList() const { return &mViewerPartSources; }
  133. friend class LLViewerPartGroup;
  134. BOOL aboveParticleLimit() const { return sParticleCount > sMaxParticleCount; }
  135. static void setMaxPartCount(const S32 max_parts) { sMaxParticleCount = max_parts; }
  136. static S32  getMaxPartCount() { return sMaxParticleCount; }
  137. static void incPartCount(const S32 count) { sParticleCount += count; }
  138. static void decPartCount(const S32 count) { sParticleCount -= count; }
  139. U32 mID;
  140. protected:
  141. LLViewerPartGroup *createViewerPartGroup(const LLVector3 &pos_agent, const F32 desired_size, bool hud);
  142. LLViewerPartGroup *put(LLViewerPart* part);
  143. group_list_t mViewerPartGroups;
  144. source_list_t mViewerPartSources;
  145. LLFrameTimer mSimulationTimer;
  146. static S32 sMaxParticleCount;
  147. static S32 sParticleCount;
  148. static F32 sParticleAdaptiveRate;
  149. static F32 sParticleBurstRate;
  150. static const S32 MAX_PART_COUNT;
  151. static const F32 PART_THROTTLE_THRESHOLD;
  152. static const F32 PART_THROTTLE_RESCALE;
  153. static const F32 PART_ADAPT_RATE_MULT;
  154. static const F32 PART_ADAPT_RATE_MULT_RECIP;
  155. //debug use only
  156. public:
  157. static S32 sParticleCount2;
  158. static void checkParticleCount(U32 size = 0) ;
  159. };
  160. #endif // LL_LLVIEWERPARTSIM_H