History

added particle life stages

Jeffrey Ventrella committed 13 years ago

Commit 1f1259c1 parent d572fee4 files · +59 −39Browse files

Showing the changes to interface/src/ParticleSystem.cpp (1 of 4 files). Show all

Unified · Split

interface/src/ParticleSystem.cpp+32−21
@@ -39,6 +39,7 @@ ParticleSystem::ParticleSystem() { · 38 unmodified lines
39 39
40 for (int s = 0; s<NUM_PARTICLE_LIFE_STAGES; s++) {40 for (int s = 0; s<NUM_PARTICLE_LIFE_STAGES; s++) {
41 _emitter[e].particleAttributes[s].radius = DEFAULT_PARTICLE_RADIUS;41 _emitter[e].particleAttributes[s].radius = DEFAULT_PARTICLE_RADIUS;
42 _emitter[e].particleAttributes[s].color = glm::vec4(0.0f, 0.0f, 0.0f, 0.0f);
42 _emitter[e].particleAttributes[s].bounce = DEFAULT_PARTICLE_BOUNCE;43 _emitter[e].particleAttributes[s].bounce = DEFAULT_PARTICLE_BOUNCE;
43 _emitter[e].particleAttributes[s].airFriction = DEFAULT_PARTICLE_AIR_FRICTION;44 _emitter[e].particleAttributes[s].airFriction = DEFAULT_PARTICLE_AIR_FRICTION;
44 _emitter[e].particleAttributes[s].gravity = 0.0f;45 _emitter[e].particleAttributes[s].gravity = 0.0f;
@@ -125,6 +126,7 @@ void ParticleSystem::createParticle(int e, glm::vec3 position, glm::vec3 velocit · 80 unmodified lines
125 _particle[p].color = color;126 _particle[p].color = color;
126 127
127 _particle[p].radius = _emitter[e].particleAttributes[0].radius;128 _particle[p].radius = _emitter[e].particleAttributes[0].radius;
129 _particle[p].color = _emitter[e].particleAttributes[0].color;
128 130
129 _numParticles ++; 131 _numParticles ++;
130 132
@@ -175,6 +177,7 @@ void ParticleSystem::setParticleAttributes(int emitterIndex, int lifeStage, Part · 44 unmodified lines
175 ParticleAttributes * a = &_emitter[emitterIndex].particleAttributes[lifeStage];177 ParticleAttributes * a = &_emitter[emitterIndex].particleAttributes[lifeStage];
176 178
177 a->radius = attributes.radius;179 a->radius = attributes.radius;
180 a->color = attributes.color;
178 a->bounce = attributes.bounce;181 a->bounce = attributes.bounce;
179 a->gravity = attributes.gravity;182 a->gravity = attributes.gravity;
180 a->airFriction = attributes.airFriction;183 a->airFriction = attributes.airFriction;
@@ -192,19 +195,27 @@ void ParticleSystem::setParticleAttributes(int emitterIndex, int lifeStage, Part · 11 unmodified lines
192void ParticleSystem::updateParticle(int p, float deltaTime) {195void ParticleSystem::updateParticle(int p, float deltaTime) {
193 196
194 assert(_particle[p].age <= _particle[p].lifespan);197 assert(_particle[p].age <= _particle[p].lifespan);
195
196 float ageFraction = _particle[p].age / _particle[p].lifespan;
197
198
199
200
201 int lifeStage = (int)( ageFraction * NUM_PARTICLE_LIFE_STAGES );
202
203
204 _particle[p].radius = _emitter[_particle[p].emitterIndex].particleAttributes[lifeStage].radius;
205 198
199 float ageFraction = _particle[p].age / _particle[p].lifespan;
200
201 int lifeStage = (int)( ageFraction * (NUM_PARTICLE_LIFE_STAGES-1) );
202
203 float lifeStageFraction = ageFraction * ( NUM_PARTICLE_LIFE_STAGES - 1 ) - lifeStage;
206 204
205 /*
206 if ( p == 0 ) {
207 printf( "lifespan = %f ageFraction = %f lifeStage = %d lifeStageFraction = %f\n", _particle[p].lifespan, ageFraction, lifeStage, lifeStageFraction );
208 }
209 */
207 210
211 _particle[p].radius
212 = _emitter[_particle[p].emitterIndex].particleAttributes[lifeStage ].radius * (1.0f - lifeStageFraction)
213 + _emitter[_particle[p].emitterIndex].particleAttributes[lifeStage+1].radius * lifeStageFraction;
214
215 _particle[p].color
216 = _emitter[_particle[p].emitterIndex].particleAttributes[lifeStage ].color * (1.0f - lifeStageFraction)
217 + _emitter[_particle[p].emitterIndex].particleAttributes[lifeStage+1].color * lifeStageFraction;
218
208 Emitter myEmitter = _emitter[_particle[p].emitterIndex];219 Emitter myEmitter = _emitter[_particle[p].emitterIndex];
209 220
210 // apply random jitter221 // apply random jitter
@@ -292,13 +303,13 @@ void ParticleSystem::setCollisionSphere(int e, glm::vec3 position, float radius) · 81 unmodified lines
292 _emitter[e].particleAttributes[lifeStage].collisionSphereRadius = radius;303 _emitter[e].particleAttributes[lifeStage].collisionSphereRadius = radius;
293}304}
294 305
295void ParticleSystem::setEmitterParticle(int emitterIndex, bool showing ) {306void ParticleSystem::setEmitterBaseParticle(int emitterIndex, bool showing ) {
296 307
297 _emitter[emitterIndex].baseParticle.alive = true;308 _emitter[emitterIndex].baseParticle.alive = true;
298 _emitter[emitterIndex].baseParticle.emitterIndex = emitterIndex;309 _emitter[emitterIndex].baseParticle.emitterIndex = emitterIndex;
299}310}
300 311
301void ParticleSystem::setEmitterParticle(int emitterIndex, bool showing, float radius, glm::vec4 color ) {312void ParticleSystem::setEmitterBaseParticle(int emitterIndex, bool showing, float radius, glm::vec4 color ) {
302 313
303 _emitter[emitterIndex].baseParticle.alive = true;314 _emitter[emitterIndex].baseParticle.alive = true;
304 _emitter[emitterIndex].baseParticle.emitterIndex = emitterIndex;315 _emitter[emitterIndex].baseParticle.emitterIndex = emitterIndex;
@@ -310,7 +321,7 @@ void ParticleSystem::setEmitterParticle(int emitterIndex, bool showing, float ra · 5 unmodified lines
310void ParticleSystem::render() {321void ParticleSystem::render() {
311 322
312 // render the emitters323 // render the emitters
313 for (unsigned int e = 0; e < _numEmitters; e++) {324 for (int e = 0; e < _numEmitters; e++) {
314 325
315 if (_emitter[e].baseParticle.alive) {326 if (_emitter[e].baseParticle.alive) {
316 glColor4f(_emitter[e].baseParticle.color.r, _emitter[e].baseParticle.color.g, _emitter[e].baseParticle.color.b, _emitter[e].baseParticle.color.a );327 glColor4f(_emitter[e].baseParticle.color.r, _emitter[e].baseParticle.color.g, _emitter[e].baseParticle.color.b, _emitter[e].baseParticle.color.a );
@@ -370,14 +381,14 @@ void ParticleSystem::renderParticle(int p) { · 53 unmodified lines
370 glutSolidSphere(_particle[p].radius, 6, 6);381 glutSolidSphere(_particle[p].radius, 6, 6);
371 glPopMatrix();382 glPopMatrix();
372 383
373 // render velocity lines384 if (SHOW_VELOCITY_TAILS) {
374 glColor4f( _particle[p].color.x, _particle[p].color.y, _particle[p].color.z, 0.5f);385 glColor4f( _particle[p].color.x, _particle[p].color.y, _particle[p].color.z, 0.5f);
375 glm::vec3 end = _particle[p].position - _particle[p].velocity * 2.0f;386 glm::vec3 end = _particle[p].position - _particle[p].velocity * 2.0f;
376 glBegin(GL_LINES);387 glBegin(GL_LINES);
377 glVertex3f(_particle[p].position.x, _particle[p].position.y, _particle[p].position.z);388 glVertex3f(_particle[p].position.x, _particle[p].position.y, _particle[p].position.z);
378 glVertex3f(end.x, end.y, end.z);389 glVertex3f(end.x, end.y, end.z);
379 390 glEnd();
380 glEnd();391 }
381 }392 }
382}393}
383 394