/* 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