#include <GL/glut.h>
#include <libio.h>
#include <math.h>


struct pointm
{
  float x;
  float y;
  float deltax;
  float deltay;
} ;
struct pointm point1,point2;
static void key(unsigned char touche, int x, int y)
{
/* Fonction appelée lorsque l'utilisateur presse une touche "normale" */
	switch (touche) {
	case 27:	/* touche escape */
		exit(0);
	}
}

static void specialKey(int touche, int x, int y)
{
/* Fonction correspondant aux touches spécial (Up, Down, Left, Right, Page_Up, ...) */
}


void init_points(void)
{
  point1.x=0.0;
  point1.y=0.0;
  point1.deltax=0.0001;
  point1.deltay=-0.0003;
  point2.x=0.2;
  point2.y=0.5;
  point2.deltax=0.0005;
  point2.deltay=0.0002;
}
void bouge(void)
{
  //printf("bouge\n");
  point1.x+=point1.deltax;
  point1.y+=point1.deltay;
  point2.x+=point2.deltax;
  point2.y+=point2.deltay;
  if ( (point1.x<=-1) || (point1.x>=1) ) point1.deltax=-point1.deltax;  
  if ( (point1.y<=-1) || (point1.y>=1) ) point1.deltay=-point1.deltay; 
  if ( (point2.x<=-1) || (point2.x>=1) ) point2.deltax=-point2.deltax;  
  if ( (point2.y<=-1) || (point2.y>=1) ) point2.deltay=-point2.deltay; 
  draw();
}

static void draw(void)
{
  //while(1)
   // {
      glClear(GL_COLOR_BUFFER_BIT);
            /* Fonction d'affichage */
      /* Ici intervient le code decrivant l'affichage */
      glColor3f(1.0,1.0,1.0);
      glLineWidth(3.5);
      glBegin(GL_LINES);
      glVertex2f(point1.x,point1.y);
      glVertex2f(point2.x,point2.y);
      glEnd();
      glFlush();
    //}
}

static void idle(void)
{
  //printf("idle\n");
}

static void visible(int vis)
{
	if (vis == GLUT_VISIBLE)
		glutIdleFunc(bouge);
	else
		glutIdleFunc(NULL);
}

static void mouseFunc(int button, int state, int x, int y)
{
/* Fonction appelée lorsque l'une des touches de la souris change d'état:
 * Touche possible : GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON & GLUT_RIGHT_BUTTON.
 * Etat possible : GLUT_DOWN & GLUT_UP.
 * x et y correspondent aux coordonnées x et y de la souris.
 */
}

static void MotionFunc(int x, int y)
{
/* Fonction appelée lorsque l'utilisateur bouge la souris alors qu'une de ses touche est appuyée */
}

int main(int argc, char *argv[])
{
/* Initialisation de glut */
	glutInit(&argc, argv);
/* definition de la position de la fenetre */
	glutInitWindowPosition(0, 0);
	glutInitWindowSize(600, 600);
/* Creation du contexte OpenGL en mode indexé et simple buffer à l'interieur de la fenetre */
	glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
/* Affichage de la fenetre */
	glutCreateWindow("Squelette");

/* Initialisation des differentes fonctions de callbacks */
	glutDisplayFunc(draw);
	glutVisibilityFunc(visible);
	glutKeyboardFunc(key);
	glutSpecialFunc(specialKey);
	glutMouseFunc(mouseFunc);
	glutMotionFunc(MotionFunc);

/* Initialisation de differents paramètres OpenGL */
	glDrawBuffer(GL_FRONT);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
	glMatrixMode(GL_MODELVIEW);


/* Lancement de la boucle principale de traitement d'OpenGL. */
	init_points();
	glutMainLoop();
/* Le return n'est jamais appele, car la glutMainLoop ne retourne jamais !
 * Sa presence permet cependant d'éviter que le compilateur n'affiche un warning ...
 */
	return 0;
}
