Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/lib/graphics/particles/particle_system.cc @ 3966

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

orxonox/trunk: merged branches/particleEngine into the trunk, because of the new vector class
merged with command:
svn merge -r 3922:HEAD particleEngine/ ../trunk/

not merged src/story_entities/world.cc. will do this at a later time (do not forget)

File size: 7.4 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific:
12   main-programmer: Benjamin Grauer
13   co-programmer: ...
14*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_PARTICLE
17
18#include "particle_system.h"
19
20#include "particle_emitter.h"
21#include "particle_engine.h"
22#include "compiler.h"
23#include "material.h"
24
25using namespace std;
26
27/**
28   \brief standard constructor
29   \param count the Count of particles in the System
30   \param type The Type of the ParticleSystem
31
32   \todo this constructor is not jet implemented - do it
33*/
34ParticleSystem::ParticleSystem (unsigned int maxCount, PARTICLE_TYPE type)
35{
36   this->setClassName ("ParticleSystem");
37   this->name = NULL;
38   this->maxCount = maxCount;
39   this->count = 0;
40   this->particleType = type;
41   this->particles = NULL;
42   this->setConserve(.8);
43   this->setLifeSpan(.1);
44   this->setInheritSpeed(0);
45   this->glID = NULL;
46   this->setRadius(1.0, 1.0, 0.0);
47   this->setType(PARTICLE_SPRITE, 1);
48   ParticleEngine::getInstance()->addSystem(this);
49}
50
51
52/**
53   \brief standard deconstructor
54*/
55ParticleSystem::~ParticleSystem() 
56{
57  // delete what has to be deleted here
58   ParticleEngine::getInstance()->removeSystem(this);
59}
60
61/**
62   \brief sets the Name of the Particle System
63   \param name the Name of the System
64*/
65void ParticleSystem::setName(const char* name)
66{
67  if (this->name)
68    delete this->name;
69  this->name = new char[strlen(name)+1];
70  strcpy(this->name, name);
71}
72
73/**
74   \returns the Name of the ParticleSystem
75*/
76const char* ParticleSystem::getName(void) const
77{
78  return this->name;
79}
80
81/**
82   \todo this will be different
83*/
84void ParticleSystem::setType(PARTICLE_TYPE particleType, int count)
85{
86  this->particleType = particleType;
87  this->dialectCount = count;
88  if (glID != NULL)
89    delete glID;
90
91  glID = new GLuint[count];
92  for (int i = 0; i< count; i++)
93    glID[i] = 0;
94
95  glID[0] = glGenLists(count);
96 
97  material = new Material("transperencyMap");
98  material->setDiffuseMap("pictures/radialTransparency.png");
99  //  material->setTransparency(.5);
100
101  glNewList(glID[0], GL_COMPILE);
102  glBegin(GL_TRIANGLE_STRIP);
103  glTexCoord2f(1, 1);
104  glVertex3f(0.0, .5, .5);
105  glTexCoord2f(1, 0);
106  glVertex3f(0.0, -.5, .5);
107  glTexCoord2f(0, 1);
108  glVertex3f(0.0, .5, -.5);
109  glTexCoord2f(0, 0);
110  glVertex3f(0.0, -.5, -.5);
111  glEnd();
112  glEndList();
113}
114
115// setting properties
116void ParticleSystem::setMaterial(Material* material)
117{
118  this->material = material;
119}
120
121
122
123/**
124   \brief how much of the speed from the ParticleEmitter should flow onto the ParticleSystem
125   \param value a Value between zero and one
126
127   
128   if you want to change the value of this variable during emission time (to make it more dynamic)
129   you may want to use the animation class
130*/
131void ParticleSystem::setInheritSpeed(float value)
132{
133  if (unlikely(value > 1.0))
134    this->inheritSpeed = 1;
135  else if (unlikely(value < 0.0))
136    this->inheritSpeed = 0;
137  else
138    this->inheritSpeed = value;
139}
140
141/**
142   \brief Sets the lifespan of newly created particles
143*/   
144void ParticleSystem::setLifeSpan(float lifeSpan, float randomLifeSpan)
145{
146  this->lifeSpan = lifeSpan;
147  this->randomLifeSpan = randomLifeSpan;
148}
149
150/**
151   \brief sets the radius of newly created particles
152*/
153void ParticleSystem::setRadius(float startRadius, float endRadius, float randomStartRadius, float randomEndRadius)
154{
155  this->startRadius = startRadius;
156  this->endRadius = endRadius;
157  this->randomStartRadius = randomStartRadius;
158  this->randomEndRadius = randomEndRadius;
159}
160
161/**
162   \brief sets the conserve Factor of newly created particles
163*/
164void ParticleSystem::setConserve(float conserve)
165{
166  if (conserve > 1.0)
167    this->conserve = 1.0;
168  else if (conserve < 0.0)
169    this->conserve = 0.0;
170  else
171    this->conserve = conserve;
172}
173
174/**
175   \brief ticks the system.
176   \param dt the time to tick all the Particles of the System
177
178   this is used to get all the particles some motion
179*/
180void ParticleSystem::tick(float dt)
181{
182  Particle* tickPart = particles;  // the particle to Tick
183  Particle* prevPart = NULL;       //
184  while (likely(tickPart != NULL))
185    {
186      tickPart->position = tickPart->position + tickPart->velocity;
187      tickPart->radius += tickPart->radiusIt * dt;
188
189      // many more to come
190
191
192      if (this->conserve < 1.0)
193        tickPart->velocity = tickPart->velocity * this->conserve;
194      // find out if we have to delete tickPart
195      if ((tickPart->timeToLive -= dt) <= 0)
196        {
197          // remove the particle from the list
198          if (likely(prevPart != NULL))
199            {
200              prevPart->next = tickPart->next;
201              delete tickPart;
202              tickPart = prevPart->next;
203            }
204          else
205            {
206              prevPart = NULL;
207              this->particles = tickPart->next;
208              delete tickPart;
209              tickPart = this->particles;
210            }
211          --this->count;
212        }
213      else
214        {     
215          prevPart = tickPart;
216          tickPart = tickPart->next;
217        }
218    }
219}
220
221/**
222   \brief draws all the Particles of this System
223*/
224void ParticleSystem::draw(void)
225{
226  //  material->select();
227
228
229  glMatrixMode(GL_MODELVIEW);
230  //  glDisable(GL_LIGHTING);
231  material->select();
232
233  Particle* drawPart = particles;
234  if (likely(drawPart != NULL))
235    {
236      glBegin(GL_POINTS);
237      while (likely(drawPart != NULL))
238        {
239          // draw in DOT mode
240          glPushMatrix();
241          glTranslatef(drawPart->position.x, drawPart->position.y, drawPart->position.z);
242          glScalef(drawPart->radius, drawPart->radius, drawPart->radius);
243          glCallList(*this->glID);
244         
245          //              glVertex3f(drawPart->position.x, drawPart->position.y, drawPart->position.z);
246          drawPart = drawPart->next;
247          glPopMatrix();
248        }
249      glEnd();
250    }
251}
252
253/**
254   \brief adds a new Particle to the System
255   \param position the position where the particle gets emitted.
256   \param velocity the Starting velocity of the particle.
257   \param data some more data given by the emitter
258*/
259void ParticleSystem::addParticle(const Vector& position, const Vector& velocity, unsigned int data)
260{
261  if (this->count <= this->maxCount)
262    {
263      // if it is the first Particle
264      if (unlikely(particles == NULL))
265        {
266          this->particles = new Particle;
267          this->particles->next = NULL;
268        }
269      // filling the List from the beginning
270      else
271        {
272          Particle* tmpPart = new Particle;
273          tmpPart->next = this->particles;
274          this->particles = tmpPart;
275        }
276     
277      particles->timeToLive = this->lifeSpan + (float)(random()/RAND_MAX)* this->randomLifeSpan;
278      particles->position = position;
279      particles->velocity = velocity;
280
281      //  particle->rotation = ; //! \todo rotation is once again something to be done.
282      particles->mass = this->initialMass + (random()/RAND_MAX -.5)* this->randomInitialMass;
283      particles->radius = this->startRadius + (random()/RAND_MAX-.5)*this->randomStartRadius;
284     
285      particles->radiusIt = (this->endRadius + (random()/RAND_MAX-.5)*this->randomEndRadius - particles->radius) / particles->timeToLive;
286
287      ++this->count;
288    }
289  else
290    PRINTF(4)("maximum count of particles reached not adding any more\n");
291}
292
293/**
294   \brief outputs some nice debug information
295*/
296void ParticleSystem::debug(void)
297{
298  PRINT(0)("  ParticleSystem %s\n", this->name);
299  PRINT(0)("  ParticleCount: %d, maximumCount: %d :: filled %d%%\n", this->count, this->maxCount, 100*this->count/this->maxCount);
300}
Note: See TracBrowser for help on using the repository browser.