#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;
}