Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: no more flickering effect at the beginning

File size: 5.5 KB
Line 
1/*!
2    \file particle_system.h
3
4*/
5
6#ifndef _PARTICLE_SYSTEM_H
7#define _PARTICLE_SYSTEM_H
8
9#include "base_object.h"
10#include "physics_interface.h"
11
12#include "glincl.h"
13#include "vector.h"
14
15#include "quick_animation.h"
16
17#define PARTICLE_DOT_MASK           0x000001
18#define PARTICLE_SPARK_MASK         0x000010
19#define PARTICLE_SPRITE_MASK        0x000100
20#define PARTICLE_MODEL_MASK         0x001000
21#define PARTICLE_WORDL_ENTITY_MASK  0x010000
22#define PARTICLE_MULTI_MASK         0x100000
23
24//! An enumerator for the different types of particles.
25typedef enum PARTICLE_TYPE {PARTICLE_DOT = PARTICLE_DOT_MASK,
26                            PARTICLE_SPARK = PARTICLE_SPARK_MASK,
27                            PARTICLE_SPRITE = PARTICLE_SPRITE_MASK,
28                            PARTICLE_MULTI_SPRITE = PARTICLE_SPRITE_MASK | PARTICLE_MULTI_MASK,
29                            PARTICLE_MODEL = PARTICLE_MODEL_MASK,
30                            PARTICLE_MULTI_MODE = PARTICLE_MODEL_MASK | PARTICLE_MULTI_MASK};
31
32#define PARTICLE_DEFAULT_MAX_COUNT    200               //!< a default count of particles in the system.
33#define PARTICLE_DEFAULT_TYPE         PARTICLE_SPRITE   //!< A default type of the system.
34
35// FORWARD DEFINITION
36class Material;
37class ParticleEmitter;
38class Field;
39
40//! A struct for one Particle
41typedef struct Particle
42{
43  float lifeTime;             //!< The time this particle has to live.
44  float lifeCycle;            //!< The fraction of time passed. (in percentage of its lifeTime)
45
46  Vector position;            //!< The current position of this particle.
47  Vector velocity;            //!< The current velocity of this particle.
48  Vector extForce;            //!< The external Force that influences this Particle.
49  Quaternion rotation;        //!< The current rotation of this particle.
50  float mass;                 //!< The mass of this particle.
51  float radius;               //!< The current size of this particle.
52  float radiusIt;             //!< The difference of the Size per second.
53
54  GLfloat color [4];          //!< A Color for the particles.
55
56  PARTICLE_TYPE type;
57
58  Particle* next;             //!< pointer to the next particle in the List. (NULL if no preceding one)
59};
60
61//! A class to handle ParticleSystems
62class ParticleSystem : public PhysicsInterface {
63  friend class ParticleEmitter;
64 
65 public:
66  ParticleSystem(unsigned int maxCount = PARTICLE_DEFAULT_MAX_COUNT,
67                 PARTICLE_TYPE type = PARTICLE_DEFAULT_TYPE);
68  virtual ~ParticleSystem();
69  void setName(const char* name);
70  const char* getName(void) const;
71
72  void setType(PARTICLE_TYPE particleType, int count = 0);
73  void setMaterial(Material* material);
74  void setInheritSpeed(float value);
75  void setLifeSpan(float lifeSpan, float randomLifeSpan = 0.0);
76  void setConserve(float conserve);
77
78  /* Per-Particle-Attributes */
79  void setRadius(float lifeCycleTime, float radius, float randRadius = 0.0);
80  void setMass(float lifeCycleTime, float mass, float randMass = 0.0);
81  void setColor(float lifeCycleTime, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
82
83  /** \returns the Type of the particles */
84  inline PARTICLE_TYPE getType(void) const { return this->particleType; };
85  /** \returns the Material that lies on this particles */
86  inline const Material* getMaterial(void) const { return this->material; };
87  /** \returns the inherit-speed-factor */
88  inline float getInheritSpeed(void) const { return this->inheritSpeed; };
89  /** \returns the lifespan of the particles */
90  inline float getLifeSpan(void) const { return this->lifeSpan; };
91  /** \returns the starting-radius of the particles */
92  inline float getStartRadius(void) { return this->radiusAnim.getValue(0.0); };
93  /** \returns the end-radius of the particles */
94  inline float getEndRadius(void) { return this->radiusAnim.getValue(1.0); };
95  /** \returns the conserve-factor of the particles */
96  inline float getConserve(void) const { return this->conserve; };
97  /** \returns the initial mass of the particles */
98  inline float getMass(void) const { return this->initialMass; };
99
100  virtual void applyField(Field* field);
101  virtual void tickPhys(float dt) {};
102
103  void addParticle(const Vector& position, const Vector& velocity, unsigned int data = 0);
104
105  void tick(float dt);
106  void draw(void) const;
107
108  void debug(void);
109
110 private:
111  char* name;                // the Name of the Particle System
112
113  float conserve;            //!< How much energy gets conserved to the next Tick.
114  float lifeSpan;            //!< Initial lifetime of a Particle.
115  float randomLifeSpan;      //!< A random value for the Lifespan (around the initial lifetime)
116  float initialMass;         //!< The initial Mass of the Particle
117  float randomInitialMass;   //!< The random initial Mass of the Particle
118  float inheritSpeed;        //!< How much speed the particle inherits from the Emitters speed \todo move this to the emitter
119
120  // particles
121  int maxCount;              //!< The maximum count of Particles.
122  int count;                 //!< The current count of Particles.
123  PARTICLE_TYPE particleType;//!< A type for all the Particles
124  Material* material;        //!< A Material for all the Particles.
125  Particle* particles;       //!< A list of particles of this System.
126  Particle* deadList;        //!< A list of dead Particles in the System.
127
128  GLuint* glID;              //!< A List of different gl-List-ID's
129  GLuint dialectCount;       //!< How many different types of particles are there in the Particle System 
130
131  // per particle attributes
132  QuickAnimation radiusAnim;
133  QuickAnimation randRadiusAnim;
134  QuickAnimation massAnim;
135  QuickAnimation randMassAnim;
136  QuickAnimation colorAnim[4];
137};
138
139#endif /* _PARTICLE_SYSTEM_H */
Note: See TracBrowser for help on using the repository browser.