Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

orxonox/trunk: particle_system is now loaded differently

ParticleEngine is NOT needed anymore, this is faster and better

File size: 6.8 KB
RevLine 
[4597]1/*!
[5039]2 * @file particle_system.h
[3329]3
[3245]4*/
[1853]5
[3925]6#ifndef _PARTICLE_SYSTEM_H
7#define _PARTICLE_SYSTEM_H
[1853]8
[4493]9#include "world_entity.h"
[4377]10#include "physics_interface.h"
11
[4381]12#include "glincl.h"
[3925]13#include "vector.h"
[6612]14#include <list>
[3930]15
[4421]16#include "quick_animation.h"
17
[4602]18// Forward Declaration
19class TiXmlElement;
20
[4478]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
[3956]27
[3930]28//! An enumerator for the different types of particles.
[4597]29typedef enum PARTICLE_TYPE
30{
31  PARTICLE_DOT           =  PARTICLE_DOT_MASK,
32  PARTICLE_SPARK         =  PARTICLE_SPARK_MASK,
33  PARTICLE_SPRITE        =  PARTICLE_SPRITE_MASK,
34  PARTICLE_MULTI_SPRITE  =  PARTICLE_SPRITE_MASK | PARTICLE_MULTI_MASK,
35  PARTICLE_MODEL         =  PARTICLE_MODEL_MASK,
36  PARTICLE_MULTI_MODE    =  PARTICLE_MODEL_MASK | PARTICLE_MULTI_MASK
37};
[3930]38
[4478]39#define PARTICLE_DEFAULT_MAX_COUNT    200               //!< A default count of particles in the system.
[3942]40#define PARTICLE_DEFAULT_TYPE         PARTICLE_SPRITE   //!< A default type of the system.
[3930]41
[5405]42// FORWARD DECLARATION
[3926]43class Material;
[3930]44class ParticleEmitter;
[4338]45class Field;
[3543]46
[3925]47//! A struct for one Particle
48typedef struct Particle
49{
[4493]50  float         lifeTime;            //!< The time this particle has to live.
51  float         lifeCycle;           //!< The fraction of time passed. (in percentage of its lifeTime)
[4338]52
[4493]53  Vector        position;            //!< The current position of this particle.
[4687]54  Vector        velocity;            //!< The current velocity of this Particle.
[4493]55  Vector        extForce;            //!< The external Force that influences this Particle.
[4687]56  Quaternion    orientation;         //!< The current orientation of this Particle.
57  Quaternion    momentum;            //!< The current angular momentum (spin) of this Particle.
58  float         mass;                //!< The mass of this Particle.
[4493]59  float         massRand;            //!< A random mass
[4687]60  float         radius;              //!< The current size of this Particle.
[4493]61  float         radiusRand;          //!< a random Radius
62  GLfloat       color [4];           //!< A Color for the particles.
[3930]63
[4493]64  Particle*     next;                //!< pointer to the next particle in the List. (NULL if no preceding one)
[3925]65};
[3543]66
[4394]67//! A class to handle ParticleSystems
[4493]68class ParticleSystem : public WorldEntity, public PhysicsInterface {
[4597]69
[1904]70 public:
[4176]71  ParticleSystem(unsigned int maxCount = PARTICLE_DEFAULT_MAX_COUNT,
[4597]72                 PARTICLE_TYPE type = PARTICLE_DEFAULT_TYPE);
[4602]73  ParticleSystem(const TiXmlElement* root);
[3925]74  virtual ~ParticleSystem();
[1853]75
[4746]76  void init();
[6512]77  virtual void loadParams(const TiXmlElement* root);
[4602]78
[4725]79  void setType(const char* particleType);
[3942]80  void setType(PARTICLE_TYPE particleType, int count = 0);
[3930]81  void setMaterial(Material* material);
[5446]82  void setMaterialTexture(const char* textureFile);
[4663]83  void setModel(const char* modelName = NULL);
[3931]84  void setLifeSpan(float lifeSpan, float randomLifeSpan = 0.0);
[3932]85  void setConserve(float conserve);
[4727]86  void setMaxCount(int maxCount);
[3245]87
[4430]88  /* Per-Particle-Attributes */
89  void setRadius(float lifeCycleTime, float radius, float randRadius = 0.0);
90  void setMass(float lifeCycleTime, float mass, float randMass = 0.0);
[4725]91  void setColor(float lifeCycleTime, float red, float green, float blue, float alpha);
[4338]92
[4836]93  /** @returns the Type of the particles */
[4746]94  inline PARTICLE_TYPE getType() const { return this->particleType; };
[4836]95  /** @returns the Material that lies on this particles */
[4746]96  inline const Material* getMaterial() const { return this->material; };
[4836]97  /** @returns the lifespan of the particles */
[4746]98  inline float getLifeSpan() const { return this->lifeSpan; };
[4836]99  /** @returns the starting-radius of the particles */
[4746]100  inline float getStartRadius() { return this->radiusAnim.getValue(0.0); };
[4836]101  /** @returns the end-radius of the particles */
[4746]102  inline float getEndRadius() { return this->radiusAnim.getValue(1.0); };
[4836]103  /** @returns the conserve-factor of the particles */
[4746]104  inline float getConserve() const { return this->conserve; };
[4836]105  /** @returns the initial mass of the particles */
[4746]106  inline float getMass() const { return this->initialMass; };
[4338]107
[4746]108  virtual unsigned int getFaceCount() const;
[4677]109
[6612]110  void addEmitter(ParticleEmitter* emitter);
111  void addEmitterXML(const TiXmlElement* emitterRoot);
112  void removeEmitter(ParticleEmitter* emitter);
[4677]113
[4395]114  virtual void applyField(Field* field);
[4836]115  /** \brief this is an empty function, because the Physics are implemented in tick @param dt: useless here */
[4396]116  virtual void tickPhys(float dt) {};
[4338]117
[4690]118  void addParticle(const Vector& position, const Vector& velocity, const Quaternion& orientation, const Quaternion& momentum, unsigned int data = 0);
[4394]119
[4493]120  virtual void tick(float dt);
[4746]121  virtual void draw() const;
[3931]122
[4746]123  void debug() const;
[3944]124
[3245]125 private:
[4478]126  float             conserve;            //!< How much energy gets conserved to the next Tick.
127  float             lifeSpan;            //!< Initial lifetime of a Particle.
128  float             randomLifeSpan;      //!< A random value for the Lifespan (around the initial lifetime)
129  float             initialMass;         //!< The initial Mass of the Particle
130  float             randomInitialMass;   //!< The random initial Mass of the Particle
[3938]131
[4478]132  int               maxCount;            //!< The maximum count of Particles.
133  int               count;               //!< The current count of Particles.
134  PARTICLE_TYPE     particleType;        //!< A type for all the Particles
135  Material*         material;            //!< A Material for all the Particles.
136  Particle*         particles;           //!< A list of particles of this System.
137  Particle*         deadList;            //!< A list of dead Particles in the System.
[3932]138
[4478]139  GLuint*           glID;                //!< A List of different gl-List-ID's
[4597]140  GLuint            dialectCount;        //!< How many different types of particles are there in the Particle System
[4421]141
[6612]142  std::list<ParticleEmitter*> emitters;  //!< The Emitters that do emit into this System.
143
[4431]144  // per particle attributes
[4493]145  QuickAnimation    radiusAnim;          //!< Animation of the radius
146  QuickAnimation    randRadiusAnim;      //!< Animation of the random Value of the radius
147  QuickAnimation    massAnim;            //!< Animation of the mass
148  QuickAnimation    randMassAnim;        //!< Animation of the random Mass
149  QuickAnimation    colorAnim[4];        //!< Animation of the 4 colors (r,g,b,a)
[1853]150};
151
[3925]152#endif /* _PARTICLE_SYSTEM_H */
Note: See TracBrowser for help on using the repository browser.