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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llpartdata.h
  3.  * @brief Particle system data packing
  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_LLPARTDATA_H
  33. #define LL_LLPARTDATA_H
  34. #include "lluuid.h"
  35. #include "v3math.h"
  36. #include "v3dmath.h"
  37. #include "v2math.h"
  38. #include "v4color.h"
  39. class LLMessageSystem;
  40. class LLDataPacker;
  41. const S32 PS_CUR_VERSION = 18;
  42. //
  43. // These constants are used by the script code, not by the particle system itself
  44. //
  45. enum LLPSScriptFlags
  46. {
  47. // Flags for the different parameters of individual particles
  48. LLPS_PART_FLAGS,
  49. LLPS_PART_START_COLOR,
  50. LLPS_PART_START_ALPHA,
  51. LLPS_PART_END_COLOR,
  52. LLPS_PART_END_ALPHA,
  53. LLPS_PART_START_SCALE,
  54. LLPS_PART_END_SCALE,
  55. LLPS_PART_MAX_AGE,
  56. // Flags for the different parameters of the particle source
  57. LLPS_SRC_ACCEL,
  58. LLPS_SRC_PATTERN,
  59. LLPS_SRC_INNERANGLE,
  60. LLPS_SRC_OUTERANGLE,
  61. LLPS_SRC_TEXTURE,
  62. LLPS_SRC_BURST_RATE,
  63. LLPS_SRC_BURST_DURATION,
  64. LLPS_SRC_BURST_PART_COUNT,
  65. LLPS_SRC_BURST_RADIUS,
  66. LLPS_SRC_BURST_SPEED_MIN,
  67. LLPS_SRC_BURST_SPEED_MAX,
  68. LLPS_SRC_MAX_AGE,
  69. LLPS_SRC_TARGET_UUID,
  70. LLPS_SRC_OMEGA,
  71. LLPS_SRC_ANGLE_BEGIN,
  72. LLPS_SRC_ANGLE_END
  73. };
  74. class LLPartData
  75. {
  76. public:
  77. LLPartData() :
  78. mFlags(0),
  79. mMaxAge(0.f),
  80. mParameter(0.f)
  81. {
  82. }
  83. BOOL unpack(LLDataPacker &dp);
  84. BOOL pack(LLDataPacker &dp);
  85. LLSD asLLSD() const;
  86. operator LLSD() const {return asLLSD(); }
  87. bool fromLLSD(LLSD& sd);
  88. // Masks for the different particle flags
  89. enum
  90. {
  91. LL_PART_INTERP_COLOR_MASK = 0x01,
  92. LL_PART_INTERP_SCALE_MASK = 0x02,
  93. LL_PART_BOUNCE_MASK = 0x04,
  94. LL_PART_WIND_MASK = 0x08,
  95. LL_PART_FOLLOW_SRC_MASK = 0x10, // Follows source, no rotation following (expensive!)
  96. LL_PART_FOLLOW_VELOCITY_MASK = 0x20, // Particles orient themselves with velocity
  97. LL_PART_TARGET_POS_MASK = 0x40,
  98. LL_PART_TARGET_LINEAR_MASK = 0x80, // Particle uses a direct linear interpolation
  99. LL_PART_EMISSIVE_MASK = 0x100, // Particle is "emissive", instead of being lit
  100. LL_PART_BEAM_MASK = 0x200, // Particle is a "beam" connecting source and target
  101. // Not implemented yet!
  102. //LL_PART_RANDOM_ACCEL_MASK = 0x100, // Particles have random acceleration
  103. //LL_PART_RANDOM_VEL_MASK = 0x200, // Particles have random velocity shifts"
  104. //LL_PART_TRAIL_MASK = 0x400, // Particles have historical "trails"
  105. // Viewer side use only!
  106. LL_PART_HUD = 0x40000000,
  107. LL_PART_DEAD_MASK = 0x80000000,
  108. };
  109. void setFlags(const U32 flags);
  110. void setMaxAge(const F32 max_age);
  111. void setStartScale(const F32 xs, F32 ys);
  112. void setEndScale(const F32 xs, F32 ys);
  113. void setStartColor(const LLVector3 &rgb);
  114. void setEndColor(const LLVector3 &rgb);
  115. void setStartAlpha(const F32 alpha);
  116. void setEndAlpha(const F32 alpha);
  117. friend class LLPartSysData;
  118. friend class LLViewerPartSourceScript;
  119. // These are public because I'm really lazy...
  120. public:
  121. U32 mFlags; // Particle state/interpolators in effect
  122. F32 mMaxAge; // Maximum age of the particle
  123. LLColor4 mStartColor; // Start color
  124. LLColor4 mEndColor; // End color
  125. LLVector2 mStartScale; // Start scale
  126. LLVector2 mEndScale; // End scale
  127. LLVector3 mPosOffset; // Offset from source if using FOLLOW_SOURCE
  128. F32 mParameter; // A single floating point parameter
  129. };
  130. class LLPartSysData
  131. {
  132. public:
  133. LLPartSysData();
  134. BOOL unpack(LLDataPacker &dp);
  135. BOOL pack(LLDataPacker &dp);
  136. BOOL unpackBlock(const S32 block_num);
  137. BOOL packBlock();
  138. static BOOL packNull();
  139. static BOOL isNullPS(const S32 block_num); // Returns FALSE if this is a "NULL" particle system (i.e. no system)
  140. // Different masks for effects on the source
  141. enum
  142. {
  143. LL_PART_SRC_OBJ_REL_MASK = 0x01, // Accel and velocity for particles relative object rotation
  144. LL_PART_USE_NEW_ANGLE = 0x02, // Particles uses new 'correct' angle parameters.
  145. };
  146. // The different patterns for how particles are created
  147. enum
  148. {
  149. LL_PART_SRC_PATTERN_DROP = 0x01,
  150. LL_PART_SRC_PATTERN_EXPLODE = 0x02,
  151. // Not implemented fully yet
  152. LL_PART_SRC_PATTERN_ANGLE = 0x04,
  153. LL_PART_SRC_PATTERN_ANGLE_CONE = 0x08,
  154. LL_PART_SRC_PATTERN_ANGLE_CONE_EMPTY = 0x10,
  155. };
  156. void setBurstSpeedMin(const F32 spd) { mBurstSpeedMin = llclamp(spd, -100.f, 100.f); }
  157. void setBurstSpeedMax(const F32 spd) { mBurstSpeedMax = llclamp(spd, -100.f, 100.f); }
  158. void setBurstRadius(const F32 rad)  { mBurstRadius = llclamp(rad, 0.f, 50.f); }
  159. void setPartAccel(const LLVector3 &accel);
  160. void setUseNewAngle() { mFlags |=  LL_PART_USE_NEW_ANGLE; }
  161. void unsetUseNewAngle() { mFlags &= ~LL_PART_USE_NEW_ANGLE; }
  162. // Since the actual particle creation rate is
  163. // a combination of multiple parameters, we
  164. // need to clamp it using a separate method instead of an accessor.
  165. void clampSourceParticleRate();
  166. friend std::ostream&  operator<<(std::ostream& s, const LLPartSysData &data); // Stream a
  167. public:
  168. // Public because I'm lazy....
  169. //
  170. // There are two kinds of data for the particle system
  171. // 1. Parameters which specify parameters of the source (mSource*)
  172. // 2. Parameters which specify parameters of the particles generated by the source (mPart*)
  173. //
  174. U32 mCRC;
  175. U32 mFlags;
  176. U8 mPattern; // Pattern for particle velocity/output
  177. F32 mInnerAngle; // Inner angle for PATTERN_ANGLE
  178. F32 mOuterAngle; // Outer angle for PATTERN_ANGLE
  179. LLVector3 mAngularVelocity; // Angular velocity for emission axis (for PATTERN_ANGLE)
  180. F32 mBurstRate; // How often to do a burst of particles
  181. U8 mBurstPartCount; // How many particles in a burst
  182. F32 mBurstRadius;
  183. F32 mBurstSpeedMin; // Minimum particle velocity
  184. F32 mBurstSpeedMax; // Maximum particle velocity
  185. F32 mMaxAge; // Maximum lifetime of this particle source
  186. LLUUID mTargetUUID; // Target UUID for the particle system
  187. F32 mStartAge; // Age at which to start the particle system (for an update after the
  188. // particle system has started)
  189. //
  190. // These are actually particle properties, but can be mutated by the source,
  191. // so are stored here instead
  192. //
  193. LLVector3 mPartAccel;
  194. LLUUID mPartImageID;
  195. //
  196. // The "template" partdata where we actually store the non-mutable particle parameters
  197. //
  198. LLPartData mPartData;
  199. protected:
  200. S32 mNumParticles; // Number of particles generated
  201. };
  202. #endif // LL_LLPARTDATA_H