#include <windows.h>                            // Header pour les Applications Windows
//    #include <stdio.h>                              // Header d'Entrée/Sortie Standard
//    #include <stdlib.h>                             // Header d'Entrée/Sortie Standard
    #include <gl/glut.h>                            // Header OpenGL Utility Toolkit (GLUT)
//    #include <string.h>                             // Header pour strcpy et strcat
    #include <math.h>                               // Header allocation de mémoire, pour les TGA
    #include <time.h>

    #define EXIT        {fclose(fichier);return -1;} // Permet de quitter plus rapidement
    #define CTOI(C)     (*(int*)&C)                 // Récupère en int un nombre pointé par un char*
    #define pi          3.1415926535897932384626433832795f // PI pour les angles
    #define maxp        100                          // nombre de points
    #define ARC_EN_CIEL glColor3f(1.0f*(float)(cos(arc_en_ciel/20.0f)),1.0f*(float)(sin(arc_en_ciel/25.0f)),1.0f-0.5f*(float)(cos(arc_en_ciel/17.0f)))

struct points
 {
    float StartX;
    float StartY;
    float StartZ;
    float InitXVel;
    float InitYVel;
    float InitZVel;
    float wind;
    float color[3]; // Les 3 couleurs RVB
    float intensity;
    float t;
 };

    struct points point[100];
    int i;

    #include "plugin.h"

int    temps()
 {
    static  int   time;
    static  int   timebase=0;
    static  int   tempnb=0;
    int temp;

    time=glutGet(GLUT_ELAPSED_TIME);
    temp = timebase;
    timebase = time;

    return time - temp;
 }

void InitPoint( struct points * ipoint)
 {
    float vel=10;
    float angle=(rand()*30+30)/(float)(180*pi);
    int coul=rand()*3;
    ipoint->StartX = cos(angle);
    ipoint->StartY = sin(angle);
    ipoint->StartZ = cos(angle);

    ipoint->InitXVel = cos(angle)*vel;
    ipoint->InitYVel = sin(angle)*vel;
    ipoint->InitZVel = cos(angle)*vel;

    ipoint->wind = 0;

    ipoint->color[0] = 1.0f*(float)(cos(arc_en_ciel/20.0f));
    ipoint->color[1] = 1.0f*(float)(sin(arc_en_ciel/25.0f));
    ipoint->color[2] = 1.0f-0.5f*(float)(cos(arc_en_ciel/17.0f));

    ipoint->intensity = 1;
    ipoint->t = 0;
 }

////////////////////////////////////////////////////////////////////////////

void Draw()
{
    a+=0.5;
    b+=1.6;
    float   x=0, y=0, z=0;
    float   x1=0, y1=0;
//    float   wind = 100;
    float   gravity = 0;//9.81/2.0;
    float   addtemps=temps( );

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslated(0,0,-50);// Equivaut exactement à gluLookAt(0,0,5,0,0,0,0,1,0);
    glRotated(a,0,0,1);
    // glRotated(b,1,0,1);    

    glBegin(GL_QUADS);
    for (i=0; i<maxp; i++)
     {

        x = point[i].StartX + point[i].InitXVel * point[i].t + point[i].wind * pow(point[i].t,2);
        y = point[i].StartY + point[i].InitYVel * point[i].t - gravity * pow(point[i].t,2);
        float tmp;
        if (point[i].intensity>0.1)
            tmp = point[i].t/(float)(point[i].intensity);

        glColor3f(point[i].color[0]*point[i].intensity,point[i].color[1]*point[i].intensity,point[i].color[2]*point[i].intensity);
        glVertex3f(x+tmp/10.0, y+tmp/10.0, 0);
        glVertex3f(x+tmp/10.0, y-tmp/10.0, 0);
        glVertex3f(x-tmp/10.0, y-tmp/10.0, 0);
        glVertex3f(x-tmp/10.0, y+tmp/10.0, 0);

        point[i].intensity-=0.05*point[i].t;
        point[i].t+=addtemps;

        if ((point[i].intensity<0) || (y<-50))
            InitPoint(&point[i]);

     }
    glEnd();

    arc_en_ciel+= 0.5f;                             // Pour la couleur arc-en-ciel

    glutSwapBuffers();
    glutPostRedisplay();     
 }

int main( int argc, char *argv[ ], char *envp[ ] )
{
    glutInit(&argc,argv);
    glutInitWindowSize(300,300);
    glutInitWindowPosition (100,100);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Coucou !");    

    InitGL();

    srand ( time ( NULL ) );
    for (i=0; i<maxp; i++)
        InitPoint(&point[i]);

    glutReshapeFunc(Reshape);
    glutDisplayFunc(Draw);
    glutMainLoop();

    return 0;
}