#include <stdlib.h>
#include <stdio.h>
#include <dms/dms.h>
#include "fireParticles.h"

#define MAX_LIFETIME 0.5

struct _particle
    {
     dms::Vector3 position;
     dms::Vector3 tailPosition;
     dms::Vector3 velocity;
     dms::Vector3 color;
     float removeTime;
    };


fireParticles::fireParticles(int numParticles,dms::Vector3 center,float radius)
    {
    posCenter_ = center;
    posRadius_ = radius;
    tailOffset_.set(0, -0.5, 0);
    colorMin_.set(0.9, 0.15, 0.05);
    colorMax_.set(1.0, 0.25, 0.15);
    numParticles_ = numParticles;
    particles_ = new struct _particle[numParticles_];
    }


void fireParticles::initialize(void)
    {
    for (int i=0; i < numParticles_; i++)
        {
        initParticle(i);
        particles_[i].removeTime = dms::frameTime()
                                   + dms::randomFloat(0,MAX_LIFETIME);
        }
    }


void fireParticles::initParticle(int n)
    {
    float radius = dms::randomFloat(0, posRadius_);
    dms::Vector2 pos = dms::randomUnitVector2() * radius;
    particles_[n].position[0] = pos[0] + posCenter_[0];
    particles_[n].position[1] = posCenter_[1];
    particles_[n].position[2] = pos[1] + posCenter_[2];
    particles_[n].velocity.set(0, 6, 0);
    particles_[n].position += particles_[n].velocity *
                dms::randomFloat(0,dms::deltaTime());
    particles_[n].tailPosition = particles_[n].position + tailOffset_;
    particles_[n].color = dms::randomPoint3(colorMin_, colorMax_);
#if 0
    particles_[n].removeTime = dms::frameTime() + MAX_LIFETIME;
#else
    particles_[n].removeTime = dms::frameTime() 
                               + MAX_LIFETIME * (1.0 - radius/posRadius_)
                               + dms::randomFloat(-0.1, 0.1);
#endif
    }


void fireParticles::update(void)
    {
    float dt = dms::deltaTime();
    float now = dms::frameTime();
    for (int i=0; i < numParticles_; i++)
        {
        if (particles_[i].removeTime <= now)
            initParticle(i);
        particles_[i].tailPosition += particles_[i].velocity * dt;
        particles_[i].position += particles_[i].velocity * dt;
        }
    }


void fireParticles::draw(void)
    {
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE);
    glDepthMask(GL_FALSE);
    glBegin(GL_LINES);
    for (int i=0; i < numParticles_; i++)
        {
        glColor3fv(particles_[i].color.vec);
        glVertex3fv(particles_[i].tailPosition.vec);
        glVertex3fv(particles_[i].position.vec);
        }
    glEnd();
    glDepthMask(GL_TRUE);
    glBlendFunc(GL_ONE, GL_ZERO);
    glDisable(GL_BLEND);
    }

