#include <stdlib.h>
#include <dms/dms.h>
#include "rainParticles.h"

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


rainParticles::rainParticles(int numParticles,dms::Vector3 posMin,
                            dms::Vector3 posMax)
    {
    posMin_ = posMin;
    posMax_ = posMax;
    tailOffset_.set(0, 1, 0);
    colorMin_.set(0.5, 0.6, 0.75);
    colorMax_.set(0.8, 0.8, 0.8);
    numParticles_ = numParticles;
    particles_ = new struct _particle[numParticles_];
    }


void rainParticles::initialize(void)
    {
    for (int i=0; i < numParticles_; i++)
        {
        initParticle(i);
        particles_[i].position[1] *= drand48();
        particles_[i].tailPosition = particles_[i].position + tailOffset_;
        }
    }


void rainParticles::initParticle(int n)
    {
    particles_[n].position = dms::randomPoint3(posMin_, posMax_);
    particles_[n].tailPosition = particles_[n].position + tailOffset_;
    particles_[n].velocity.set(0, -60, 0);
    particles_[n].color = dms::randomPoint3(colorMin_, colorMax_);
    }


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


void rainParticles::draw(void)
    {
    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();
    }
