#include "fountain.h" #include #include #include using namespace std; #define SPAWN_RATE .05 #define MAX_AGE 10 Fountain::Fountain() { _time_accum = 5*(double(rand())/RAND_MAX); } void Fountain::update(double time_elapsed, int spectrum_size, double* spectrum, double* spectrum2) { _time_accum += time_elapsed; for (int i = 0; i < _particles.size(); i++) { _particles[i].age += time_elapsed; _particles[i].x += _particles[i].vx * time_elapsed; _particles[i].y += _particles[i].vy * time_elapsed; _particles[i].vx += -.03 * abs(_particles[i].vy) * _particles[i].x; _particles[i].vx *= .999; //_particles[i].vy *= .9999; _particles[i].vy += .2 * time_elapsed; } double sum = 0; for (int i = 0; i < spectrum_size; i++) { sum += spectrum[i];// - spectrum2[i]; } if (sum < 0) sum = 0; _spawn_rate = SPAWN_RATE / (sum*sum); if (_time_accum > _spawn_rate) { _time_accum -= _spawn_rate; Particle p; p.x = (double(rand())/RAND_MAX - .5) * .01; p.y = (double(rand())/RAND_MAX - .5) * .1 - .8; p.vy = -.4 + sum * (double(rand())/RAND_MAX + .5); p.vx = .3 * sum * (double(rand())/RAND_MAX + .5); if (rand()%2) p.vx *= -1; p.age = 0; _particles.push_back(p); } if (_particles.size() > 0 && _particles[0].y > 1.3) _particles.pop_front(); int i = 0; // while (i < _particles.size()) { // if (_particles[i].y > 1.3) _particles.erase(_particles.begin() + i); // else i++; // } } void Fountain::draw() { glBegin(GL_POINTS); for (int i = 0; i < _particles.size(); i++) { glColor4f(1 - abs(_particles[i].vx), 1 - _particles[i].age ,1,1 - _particles[i].age); glVertex2f(_particles[i].x, _particles[i].y); } glEnd(); }