/* Présentation d'OpenGL
   7 Mars 2003
   Clément Bourdarias <phneutre@icculus.org>
*/

/* exemple6 : display lists */
/* compiler avec gcc -o exemple6 exemple6.c -ansi -pedantic -Wall -lglut -lGLU -lGL */

#include <GL/gl.h>
#include <GL/glut.h>

/* l'angle duquel on fait tourner le triangle */
float angle=0.0f;

/* la display list */
GLuint displaylist;

/* cette fonction est appelée dès que la fenêtre
   est redimensionnée */
void
reshape(int w, int h)
{
  /* on utilise la fenetre entiere */
  glViewport(0, 0, w, h); 
  
  /* on modifie la matrice de projection */  
  glMatrixMode(GL_PROJECTION);
  /* remise à zéro de la matrice */
  glLoadIdentity();
  /* définition du volume de vue */
  gluPerspective(60.0,w/h,1.0,200.0);
  /* on revient à la matrice de vue */
  glMatrixMode(GL_MODELVIEW);
}

void
display(void)
{
  /* on vide l'écran */
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  /* remise à zéro de la matrice de transformations */
  glLoadIdentity();

  /* on fait tourner la liste ENTIERE */
  glTranslatef(0.0,-0.5,-7.0);
  glRotatef(angle ,0.0,1.0,0.0);

  /* appelle la liste */
  glCallList(displaylist);    

  /* on dessine l'image en mémoire */ 
  glutSwapBuffers(); 
}

void animate(void)
{
  /* on augmente l'angle de rotation du triangle */
  angle += 0.1;
  if(angle > 360.0) angle -= 360.0;
  
  /* dessine l'image à l'écran */
  glutPostRedisplay();
}

/* crée la display list qui contient notre scene */
void create_display_list(void)
{  
  /* couleur bleue, reflets blancs */
  GLfloat mat_specular_2[] = { 1.0, 1.0, 1.0, 1.0 };
  GLfloat mat_shininess_2[] = { 50.0 };
  GLfloat mat_amb_diff_2[] = { 0.5, 0.5, 0.9, 1.0 };
  
  displaylist = glGenLists(1);
  glNewList (displaylist, GL_COMPILE);
   
  glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular_2);
  glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess_2);
  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_amb_diff_2);
  
  glBegin(GL_QUADS);
    glNormal3f(0.0,0.0,1.0);
    glVertex3f(-0.5, 0.5, 0.0);
    glVertex3f(-0.5, -0.5, 0.0);
    glVertex3f(0.5, -0.5, 0.0);
    glVertex3f(0.5, 0.5, 0.0);
    
    glNormal3f(1.0,0.0,0.0);
    glVertex3f(0.5, 0.5, 0.0);
    glVertex3f(0.5, -0.5, 0.0);    
    glVertex3f(0.5, -0.5, -1.0);
    glVertex3f(0.5, 0.5, -1.0);
    
    /* dessous */
    glNormal3f(0.0,1.0,0.0);
    glVertex3f(-0.5, -0.5, -1.0);
    glVertex3f(-0.5, -0.5, 0.0);    
    glVertex3f(0.5, -0.5, 0.0);
    glVertex3f(0.5, -0.5, -1.0);
  glEnd();
  
  glEndList();
 
}

void
init_opengl(void)
{
  GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 }; 
  GLfloat white_light[] = { 0.8, 0.8, 0.8, 1.0 };
  GLfloat light_position[] = { 0.0, -10.0, 50.0, 1.0 };

  /* couleur de fond */
  glClearColor(0.0,0.0,0.0,0.0);
 
  /* élimination des parties cachées (z-buffer) */
  glEnable(GL_DEPTH_TEST);
  
  /* acivation des calculs sur les lumieres */
  glEnable(GL_LIGHTING);
  glShadeModel(GL_SMOOTH);
  
  /* définition d'une source de lumière */
  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);
  glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);
  glEnable(GL_LIGHT0);  
}

int
main(int argc, char **argv)
{
  /* initialisation de GLUT */
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB);
  glutInitWindowSize(600,600);
  
  /* création de la fenêtre en elle même */
  glutCreateWindow("exemple6");
  
  /* fonctions d'initialisations d'OpenGL */
  init_opengl();
  
  create_display_list();

  /* assignation des fonctions de dessin et 
      de redimesionnement */
  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  glutIdleFunc(animate);
  
  /* c'est parti ! */
  glutMainLoop();
  return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1