Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: particles documented

File size: 6.3 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     //!< A Mask if the Particles should be displayed as DOTs
18#define PARTICLE_SPARK_MASK            0x000010     //!< A Mask if the Particles should be displayed as SPARKs
19#define PARTICLE_SPRITE_MASK           0x000100     //!< A Mask if the Particles should be displayed as SPRITESs
20#define PARTICLE_MODEL_MASK            0x001000     //!< A Mask if the Particles should be displayed as MODELSs
21#define PARTICLE_WORDL_ENTITY_MASK     0x010000     //!< A Mask if the Particles should be displayed as WORLD_ENTITIEs
22#define PARTICLE_MULTI_MASK            0x100000     //!< A Mask if they are Multi-partilces
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 massRand;             //!< A random mass
52  float radius;               //!< The current size of this particle.
53  float radiusRand;           //!< a random Radius
54
55  GLfloat color [4];          //!< A Color for the particles.
56
57  Particle* next;             //!< pointer to the next particle in the List. (NULL if no preceding one)
58};
59
60//! A class to handle ParticleSystems
61class ParticleSystem : public PhysicsInterface {
62  friend class ParticleEmitter;
63 
64 public:
65  ParticleSystem(unsigned int maxCount = PARTICLE_DEFAULT_MAX_COUNT,
66                 PARTICLE_TYPE type = PARTICLE_DEFAULT_TYPE);
67  virtual ~ParticleSystem();
68
69  void setType(PARTICLE_TYPE particleType, int count = 0);
70  void setMaterial(Material* material);
71  void setInheritSpeed(float value);
72  void setLifeSpan(float lifeSpan, float randomLifeSpan = 0.0);
73  void setConserve(float conserve);
74
75  /* Per-Particle-Attributes */
76  void setRadius(float lifeCycleTime, float radius, float randRadius = 0.0);
77  void setMass(float lifeCycleTime, float mass, float randMass = 0.0);
78  void setColor(float lifeCycleTime, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
79
80  /** \returns the Type of the particles */
81  inline PARTICLE_TYPE getType(void) const { return this->particleType; };
82  /** \returns the Material that lies on this particles */
83  inline const Material* getMaterial(void) const { return this->material; };
84  /** \returns the inherit-speed-factor */
85  inline float getInheritSpeed(void) const { return this->inheritSpeed; };
86  /** \returns the lifespan of the particles */
87  inline float getLifeSpan(void) const { return this->lifeSpan; };
88  /** \returns the starting-radius of the particles */
89  inline float getStartRadius(void) { return this->radiusAnim.getValue(0.0); };
90  /** \returns the end-radius of the particles */
91  inline float getEndRadius(void) { return this->radiusAnim.getValue(1.0); };
92  /** \returns the conserve-factor of the particles */
93  inline float getConserve(void) const { return this->conserve; };
94  /** \returns the initial mass of the particles */
95  inline float getMass(void) const { return this->initialMass; };
96
97  virtual void applyField(Field* field);
98  /** \brief this is an empty function, because the Physics are implemented in tick \param dt: useless here */
99  virtual void tickPhys(float dt) {};
100
101  void addParticle(const Vector& position, const Vector& velocity, unsigned int data = 0);
102
103  void tick(float dt);
104  void draw(void) const;
105
106  void debug(void);
107
108 private:
109  char*             name;                //!< the Name of the Particle System
110
111  float             conserve;            //!< How much energy gets conserved to the next Tick.
112  float             lifeSpan;            //!< Initial lifetime of a Particle.
113  float             randomLifeSpan;      //!< A random value for the Lifespan (around the initial lifetime)
114  float             initialMass;         //!< The initial Mass of the Particle
115  float             randomInitialMass;   //!< The random initial Mass of the Particle
116  float             inheritSpeed;        //!< How much speed the particle inherits from the Emitters speed \todo move this to the emitter
117
118  // particles
119  int               maxCount;            //!< The maximum count of Particles.
120  int               count;               //!< The current count of Particles.
121  PARTICLE_TYPE     particleType;        //!< A type for all the Particles
122  Material*         material;            //!< A Material for all the Particles.
123  Particle*         particles;           //!< A list of particles of this System.
124  Particle*         deadList;            //!< A list of dead Particles in the System.
125
126  GLuint*           glID;                //!< A List of different gl-List-ID's
127  GLuint            dialectCount;        //!< How many different types of particles are there in the Particle System 
128
129  // per particle attributes
130  QuickAnimation radiusAnim;             //!< Animation of the radius
131  QuickAnimation randRadiusAnim;         //!< Animation of the random Value of the radius
132  QuickAnimation massAnim;               //!< Animation of the mass
133  QuickAnimation randMassAnim;           //!< Animation of the random Mass
134  QuickAnimation colorAnim[4];           //!< Animation of the 4 colors (r,g,b,a)
135};
136
137#endif /* _PARTICLE_SYSTEM_H */
Note: See TracBrowser for help on using the repository browser.