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

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éciales (Up, Down, Left, Right, Page_Up, ...) */
}

static void Motif()
{
	float Longueur = .3;

	glBegin(GL_LINES);
		glVertex2f(0.0, 0.0);
		glVertex2f(0.0, Longueur);
		glVertex2f(0.0, Longueur);
		glVertex2f(Longueur * cos(30.0 * M_PI / 180.0), Longueur * (1 + sin(30.0 * M_PI / 180.0)));
		glVertex2f(0.0, Longueur);
		glVertex2f(- Longueur * cos(30.0 * M_PI / 180.0), Longueur * (1 + sin(30.0 * M_PI / 180.0)));
	glEnd();
}

static void draw(void)
{
	glClear(GL_COLOR_BUFFER_BIT);

/* Fonction d'affichage */
/* Ici intervient le code decrivant l'affichage */

	glFlush();
}

static void idle(void)
{
}

static void visible(int vis)
{
	if (vis == GLUT_VISIBLE)
		glutIdleFunc(idle);
	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. */
	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;
}
