Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/lib/particles/particle_system.h @ 8001

Last change on this file since 8001 was 7300, checked in by bensch, 19 years ago

orxonox/trunk: the most evil for (int i=0; i <'=' …) bug ever…

File size: 5.7 KB
Line 
1/*!
2 * @file particle_system.h
3
4*/
5
6#ifndef _PARTICLE_SYSTEM_H
7#define _PARTICLE_SYSTEM_H
8
9#include "world_entity.h"
10#include "physics_interface.h"
11
12#include "glincl.h"
13#include "vector.h"
14#include <list>
15
16#include "quick_animation.h"
17
18// Forward Declaration
19class TiXmlElement;
20
21#define PARTICLE_DOT_MASK              0x000001     //!< A Mask if the Particles should be displayed as DOTs
22#define PARTICLE_SPARK_MASK            0x000010     //!< A Mask if the Particles should be displayed as SPARKs
23#define PARTICLE_SPRITE_MASK           0x000100     //!< A Mask if the Particles should be displayed as SPRITESs
24#define PARTICLE_MODEL_MASK            0x001000     //!< A Mask if the Particles should be displayed as MODELSs
25#define PARTICLE_WORDL_ENTITY_MASK     0x010000     //!< A Mask if the Particles should be displayed as WORLD_ENTITIEs
26#define PARTICLE_MULTI_MASK            0x100000     //!< A Mask if they are Multi-partilces
27
28#define PARTICLE_DEFAULT_MAX_COUNT    200               //!< A default count of particles in the system.
29
30// FORWARD DECLARATION
31class Material;
32class ParticleEmitter;
33class Field;
34
35//! A struct for one Particle
36typedef struct Particle
37{
38  float         lifeTime;            //!< The time this particle has to live.
39  float         lifeCycle;           //!< The fraction of time passed. (in percentage of its lifeTime)
40
41  Vector        position;            //!< The current position of this particle.
42  Vector        velocity;            //!< The current velocity of this Particle.
43  Vector        extForce;            //!< The external Force that influences this Particle.
44  Quaternion    orientation;         //!< The current orientation of this Particle.
45  Quaternion    momentum;            //!< The current angular momentum (spin) of this Particle.
46  float         mass;                //!< The mass of this Particle.
47  float         massRand;            //!< A random mass
48  float         radius;              //!< The current size of this Particle.
49  float         radiusRand;          //!< a random Radius
50  GLfloat       color [4];           //!< A Color for the particles.
51
52  Particle*     next;                //!< pointer to the next particle in the List. (NULL if no preceding one)
53};
54
55//! A class to handle ParticleSystems
56class ParticleSystem : public WorldEntity, public PhysicsInterface {
57
58 public:
59  ParticleSystem(unsigned int maxCount = PARTICLE_DEFAULT_MAX_COUNT);
60  virtual ~ParticleSystem();
61
62  virtual void loadParams(const TiXmlElement* root);
63  void loadEmitters(const TiXmlElement* root);
64
65  void setLifeSpan(float lifeSpan, float randomLifeSpan = 0.0);
66  void setConserve(float conserve);
67  void setMaxCount(unsigned int maxCount);
68
69  /* Per-Particle-Attributes */
70  void setRadius(float lifeCycleTime, float radius, float randRadius = 0.0);
71  void setMass(float lifeCycleTime, float mass, float randMass = 0.0);
72  void setColor(float lifeCycleTime, float red, float green, float blue, float alpha);
73
74  /** @returns the lifespan of the particles */
75  inline float getLifeSpan() const { return this->lifeSpan; };
76  /** @returns the starting-radius of the particles */
77  inline float getStartRadius() { return this->radiusAnim.getValue(0.0); };
78  /** @returns the end-radius of the particles */
79  inline float getEndRadius() { return this->radiusAnim.getValue(1.0); };
80  /** @returns the conserve-factor of the particles */
81  inline float getConserve() const { return this->conserve; };
82  /** @returns the initial mass of the particles */
83  inline float getMass() const { return this->initialMass; };
84
85  /** @returns the count of particles in this System */
86  inline unsigned int getCount() const { return this->count; };
87  /** @returns the maximum count of particles that can be contained by this System */
88  inline unsigned int getMaxCount() const { return this->maxCount; };
89
90  virtual unsigned int getFaceCount() const;
91
92  void addEmitter(ParticleEmitter* emitter);
93  void removeEmitter(ParticleEmitter* emitter);
94
95  virtual void applyField(const Field* field);
96  /** @brief this is an empty function, because the Physics are implemented in tick @param dt: useless here */
97  virtual void tickPhys(float dt) {};
98
99  void addParticle(const Vector& position, const Vector& velocity, const Quaternion& orientation, const Quaternion& momentum, unsigned int data = 0);
100
101  void precache(unsigned int seconds, unsigned int ticksPerSecond = 25);
102
103  virtual void tick(float dt);
104  virtual void draw() const = 0;
105
106  void debug() const;
107
108 protected:
109  float             conserve;            //!< How much energy gets conserved to the next Tick.
110  float             lifeSpan;            //!< Initial lifetime of a Particle.
111  float             randomLifeSpan;      //!< A random value for the Lifespan (around the initial lifetime)
112  float             initialMass;         //!< The initial Mass of the Particle
113  float             randomInitialMass;   //!< The random initial Mass of the Particle
114
115  unsigned int      maxCount;            //!< The maximum count of Particles.
116  unsigned int      count;               //!< The current count of Particles.
117  Particle*         particles;           //!< A list of particles of this System.
118  Particle*         deadList;            //!< A list of dead Particles in the System.
119
120  std::list<ParticleEmitter*> emitters;  //!< The Emitters that do emit into this System.
121
122  // per particle attributes
123  QuickAnimation    radiusAnim;          //!< Animation of the radius
124  QuickAnimation    randRadiusAnim;      //!< Animation of the random Value of the radius
125  QuickAnimation    massAnim;            //!< Animation of the mass
126  QuickAnimation    randMassAnim;        //!< Animation of the random Mass
127  QuickAnimation    colorAnim[4];        //!< Animation of the 4 colors (r,g,b,a)
128};
129
130#endif /* _PARTICLE_SYSTEM_H */
Note: See TracBrowser for help on using the repository browser.