#include "explosion.h" #include #include #include "m4x4.h" typedef struct materialStruct { GLfloat ambient[4]; GLfloat diffuse[4]; GLfloat specular[4]; GLfloat shininess; } materialStruct; extern materialStruct brassMaterials; Explosion::Explosion(Math3d::M3d position, int size) { _numParticles = size; _particles = new Particle[_numParticles]; srand((unsigned) time(0)); for (int i=0; i<_numParticles; i++) { _particles[i].position = position; _particles[i].direction = Math3d::M3d((((float) rand() / RAND_MAX) - 0.5) * 2.0, (((float) rand() / RAND_MAX) - 0.5) * 2.0, (((float) rand() / RAND_MAX) - 0.5) * 2.0); _particles[i].direction.normalize(); // cout << i << ": " << _particles[i].direction << endl; // _particles[i].orientation = Math3d::MQuat((float)(rand()%3 - 1), (float)(rand()%3 - 1), // (float)(rand()%3 - 1), (float)(rand()%3 - 1)); _particles[i].orientation = Math3d::MQuat((((float) rand() / RAND_MAX) - 0.5) * 2.0, (((float) rand() / RAND_MAX) - 0.5) * 2.0, (((float) rand() / RAND_MAX) - 0.5) * 2.0, (((float) rand() / RAND_MAX) - 0.5) * 2.0); _particles[i].orientation.normalize(); _particles[i].size = (float) (rand() % 6) + 1.0; _particles[i].speed = ((float) rand() / RAND_MAX) * 200.0; } _timeAlive = 0.0; } void Explosion::Render() { glDisable(GL_TEXTURE_2D); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, brassMaterials.ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, brassMaterials.diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, brassMaterials.specular); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, brassMaterials.shininess); for (int i=0; i<_numParticles; i++) { glPushMatrix(); glTranslatef(_particles[i].position[0], _particles[i].position[1], _particles[i].position[2]); Math3d::M4x4 rotMat; rotMat.loadRotate(_particles[i].orientation); glMultMatrixd(rotMat); glBegin(GL_TRIANGLES); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, _particles[i].size, 0.0); glVertex3f(_particles[i].size, _particles[i].size, 0.0); glEnd(); glPopMatrix(); } glEnable(GL_TEXTURE_2D); } void Explosion::UpdateState(float timeElapsed) { for (int i=0; i<_numParticles; i++) { _particles[i].position += _particles[i].direction * timeElapsed * _particles[i].speed; } _timeAlive += timeElapsed; }