particlesystem.h
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:5k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // particlesystem.h
  2. //
  3. // Copyright (C) 2008, Chris Laurel <claurel@gmail.com>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #ifndef _CELENGINE_PARTICLESYSTEM_H_
  10. #define _CELENGINE_PARTICLESYSTEM_H_
  11. #include <string>
  12. #include <list>
  13. #include "model.h"
  14. class VectorGenerator;
  15. struct ParticleVertex
  16. {
  17.     void set(const Vec3f& _position, const Vec2f& _texCoord, const unsigned char* _color)
  18.     {
  19.         position = _position;
  20.         texCoord = _texCoord;
  21.         color[Color::Red]   = _color[Color::Red];
  22.         color[Color::Green] = _color[Color::Green];
  23.         color[Color::Blue]  = _color[Color::Blue];
  24.         color[Color::Alpha] = _color[Color::Alpha];
  25.     }
  26.     
  27.     Vec3f position;
  28.     Vec2f texCoord;
  29.     unsigned char color[4];
  30. };
  31. class ParticleEmitter
  32. {
  33. public:
  34.     ParticleEmitter();
  35.     ~ParticleEmitter();
  36.     
  37.     void render(double tsec, RenderContext& rc, ParticleVertex* particleBuffer, unsigned int bufferCapacity) const;
  38.     
  39.     void setAcceleration(const Vec3f& acceleration);
  40.     void createMaterial();
  41.     
  42.     void setLifespan(double startTime, double endTime);
  43.     void setRotationRateRange(float minRate, float maxRate);
  44.     void setBlendMode(Mesh::BlendMode blendMode);
  45.     
  46. private:
  47.     double m_startTime;
  48.     double m_endTime;
  49. public:
  50.     ResourceHandle m_texture;
  51.     
  52.     float m_rate;
  53.     float m_lifetime;
  54.     
  55.     Color m_startColor;
  56.     float m_startSize;
  57.     
  58.     Color m_endColor;
  59.     float m_endSize;
  60.     
  61.     VectorGenerator* m_positionGenerator;
  62.     VectorGenerator* m_velocityGenerator;
  63.     
  64. private:
  65.     Vec3f m_acceleration;
  66.     bool m_nonZeroAcceleration;
  67.     
  68.     float m_minRotationRate;
  69.     float m_rotationRateVariance;
  70.     bool m_rotationEnabled;
  71.     
  72.     Mesh::BlendMode m_blendMode;
  73.     
  74.     Mesh::Material m_material;    
  75. };
  76. class ParticleSystem : public Geometry
  77. {
  78.  public:
  79.     ParticleSystem();
  80.     virtual ~ParticleSystem();
  81.     
  82.     virtual void render(RenderContext& rc, double t = 0.0);
  83.     virtual bool pick(const Ray3d& r, double& distance) const;
  84.     virtual bool isOpaque() const;
  85.     
  86.     void addEmitter(ParticleEmitter* emitter);
  87.         
  88.  public:
  89.     std::list<ParticleEmitter*> m_emitterList;
  90.     Mesh::VertexDescription* m_vertexDesc;
  91.     ParticleVertex* m_vertexData;
  92.     unsigned int m_particleCapacity;
  93.     unsigned int m_particleCount;    
  94. };
  95. class LCGRandomGenerator;
  96. /*! Generator abstract base class.
  97.  *  Subclasses must implement generate() method.
  98.  */
  99. class VectorGenerator
  100. {
  101. public:
  102.     VectorGenerator() {};
  103.     virtual ~VectorGenerator() {};
  104.     virtual Vec3f generate(LCGRandomGenerator& gen) const = 0;
  105. };
  106. /*! Simplest generator; produces the exact same value on each call
  107.  *  to generate().
  108.  */
  109. class ConstantGenerator : public VectorGenerator
  110. {
  111. public:
  112.     ConstantGenerator(const Vec3f& value) : m_value(value) {}
  113.     
  114.     virtual Vec3f generate(LCGRandomGenerator& gen) const;
  115.     
  116. private:
  117.     Vec3f m_value;
  118. };
  119. /*! Generates values uniformly distributed within an axis-aligned box.
  120.  */
  121. class BoxGenerator : public VectorGenerator
  122. {
  123. public:
  124.     BoxGenerator(const Vec3f& center, const Vec3f& axes) :
  125.         m_center(center),
  126.         m_semiAxes(axes * 0.5f)
  127.     {
  128.     }
  129.     
  130.     virtual Vec3f generate(LCGRandomGenerator& gen) const;
  131.     
  132. private:
  133.     Vec3f m_center;
  134.     Vec3f m_semiAxes;
  135. };
  136. /*! Generates values uniformly distributed on a line between
  137.  *  two points.
  138.  */
  139. class LineGenerator : public VectorGenerator
  140. {
  141. public:
  142.     LineGenerator(const Vec3f& p0, const Vec3f& p1) :
  143.         m_origin(p0),
  144.         m_direction(p1 - p0)
  145.     {
  146.     }
  147.     
  148.     virtual Vec3f generate(LCGRandomGenerator& gen) const;
  149.     
  150. private:
  151.     Vec3f m_origin;
  152.     Vec3f m_direction;
  153. };
  154. /*! Generates values uniformly distributed on the surface
  155.  *  of an ellipsoid.
  156.  */
  157. class EllipsoidSurfaceGenerator : public VectorGenerator
  158. {
  159. public:
  160.     EllipsoidSurfaceGenerator(const Vec3f& center, const Vec3f& semiAxes) :
  161.         m_center(center),
  162.         m_semiAxes(semiAxes)
  163.     {
  164.     }
  165.     
  166.     virtual Vec3f generate(LCGRandomGenerator& gen) const;
  167.     
  168. private:
  169.     Vec3f m_center;
  170.     Vec3f m_semiAxes;
  171. };
  172. /*! Generates values uniformly distributed within a spherical
  173.  *  section. The section is centered on the z-axis.
  174.  */
  175. class ConeGenerator : public VectorGenerator
  176. {
  177. public:
  178.     ConeGenerator(float minAngle, float maxAngle, float minLength, const float maxLength) :
  179.         m_cosMinAngle(1.0f - std::cos(minAngle)),
  180.         m_cosAngleVariance(std::cos(minAngle) - std::cos(maxAngle)),
  181.         m_minLength(minLength),
  182.         m_lengthVariance(maxLength - minLength)
  183.     {
  184.     }
  185.     
  186.     virtual Vec3f generate(LCGRandomGenerator& gen) const;
  187.     
  188. private:
  189.     float m_cosMinAngle;
  190.     float m_cosAngleVariance;
  191.     float m_minLength;
  192.     float m_lengthVariance;
  193. };
  194. /*! Generates points in a 2D gaussian distribution in
  195.  *  the xy-plane and centered on the origin.
  196.  */
  197. class GaussianDiscGenerator : public VectorGenerator
  198. {
  199. public:
  200.     GaussianDiscGenerator(float sigma) :
  201.         m_sigma(sigma)
  202.     {
  203.     }
  204.     virtual Vec3f generate(LCGRandomGenerator& gen) const;
  205. private:
  206.     float m_sigma;
  207. };
  208. //ParticleSystem* LoadParticleSystem(const std::string& filename, const std::string& resourcePath);
  209. #endif // _CELENGINE_PARTICLESYSTEM_H_