Activation de l'éclairage
Activation des 4 lumières
Lumière 0 configurée
Lumière 1 configurée
Lumière 2 configurée
Lumière 3 configurée
Toutes les lumières ensembles
Introduction d'une réflexion spéculaire
Différents matériaux
Fichier source : ParametrageMaterielEtLumieresSolution.cpp
Modules utilitaires
static int l = 0;
static int ldef = 0;
static int l0 = 0;
static int l1 = 0;
static int l2 = 0;
static int l3 = 0;
static int ms = 0;
static int md = 0;
static int ma = 0;
static int me = 0;
static void activationLumieres(void) {
if ( l )
glEnable(GL_LIGHTING);
else
glDisable(GL_LIGHTING);
if ( l0 )
glEnable(GL_LIGHT0);
else
glDisable(GL_LIGHT0);
if ( l1 )
glEnable(GL_LIGHT1);
else
glDisable(GL_LIGHT1);
if ( l2 )
glEnable(GL_LIGHT2);
else
glDisable(GL_LIGHT2);
if ( l3 )
glEnable(GL_LIGHT3);
else
glDisable(GL_LIGHT3);
}
static void configurationLumieres(void) {
const GLfloat magenta[] = { 1.0F,0.0F,1.0F,1.0F };
const GLfloat rouge[] = { 1.0F,0.0F,0.0F,1.0F };
const GLfloat vert[] = { 0.0F,1.0F,0.0F,1.0F };
const GLfloat bleu[] = { 0.0F,0.0F,1.0F,1.0F };
const GLfloat jaune[] = { 1.0F,1.0F,0.0F,1.0F };
const GLfloat grisMoyen[] = { 0.5F,0.5F,0.5F,1.0F };
const GLfloat pos0[] = { 2.0F,2.0F,2.0F,1.0F };
glLightfv(GL_LIGHT0,GL_POSITION,pos0);
glLightfv(GL_LIGHT0,GL_DIFFUSE,rouge);
glLightfv(GL_LIGHT0,GL_SPECULAR,noir);
glLightfv(GL_LIGHT0,GL_AMBIENT,noir);
const GLfloat pos1[] = { -2.0F,0.0F,4.0F,0.0F };
glLightfv(GL_LIGHT1,GL_POSITION,pos1);
glLightfv(GL_LIGHT1,GL_DIFFUSE,vert);
glLightfv(GL_LIGHT1,GL_SPECULAR,blanc);
glLightfv(GL_LIGHT1,GL_AMBIENT,noir);
const GLfloat pos2[] = { -3.0F,-3.0F, 15.0F,1.0F };
const GLfloat dir2[] = { 3.0F, 3.0F,-10.0F };
glLightfv(GL_LIGHT2,GL_POSITION,pos2);
glLightfv(GL_LIGHT2,GL_SPOT_DIRECTION,dir2);
glLightf(GL_LIGHT2,GL_SPOT_CUTOFF,20.0F);
glLightfv(GL_LIGHT2,GL_DIFFUSE,bleu);
glLightfv(GL_LIGHT2,GL_SPECULAR,jaune);
glLightfv(GL_LIGHT2,GL_AMBIENT,noir);
const GLfloat pos3[] = { 0.0F,0.0F,0.0F,1.0F };
glLightfv(GL_LIGHT3,GL_POSITION,pos3);
glLightfv(GL_LIGHT3,GL_DIFFUSE,noir);
glLightfv(GL_LIGHT3,GL_SPECULAR,noir);
glLightfv(GL_LIGHT3,GL_AMBIENT,magenta);
}
static void configurationMateriel(void) {
const GLfloat diffuseDefaut[] = { 0.8F,0.8F,0.8F,1.0F };
const GLfloat ambientDefaut[] = { 0.2F,0.2F,0.2F,1.0F };
const GLfloat specularDefaut[] = { 0.0F,0.0F,0.0F,1.0F };
const GLfloat emissionDefaut[] = { 0.0F,0.0F,0.0F,1.0F };
const GLfloat magenta[] = { 1.0F,0.0F,1.0F,1.0F };
const GLfloat cyan[] = { 0.0F,1.0F,1.0F,1.0F };
const GLfloat jaune[] = { 1.0F,1.0F,0.0F,1.0F };
if ( md ) {
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,magenta); }
else {
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuseDefaut); }
if ( ma ) {
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,cyan); }
else {
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambientDefaut); }
if ( me ) {
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,jaune); }
else {
glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,emissionDefaut); }
if ( ms ) {
glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,64.0);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,blanc); }
else {
glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,0.0);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specularDefaut); }
}
/* Fonction executee lors d'un rafraichissement */
/* de la fenetre de dessin */
static void display(void) {
const float *fond;
switch (cFond) {
case 0 :
fond = gris;
break;
case 1 :
fond = blanc;
break;
case 2 :
fond = noir;
break; }
glClearColor(fond[0],fond[1],fond[2],fond[3]);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPolygonMode(GL_FRONT_AND_BACK,(pMode == 1) ? GL_FILL : GL_LINE);
glPushMatrix();
glPushAttrib(GL_LIGHTING_BIT);
int notReset = 1;
activationLumieres();
configurationLumieres();
configurationMateriel();
if ( ldef ) {
notReset = 0;
glPopAttrib();
activationLumieres(); }
glRotatef(r1,1.0F,2.0F,3.0F);
glRotatef(r2,-1.0F,2.0F,-3.0F);
scene();
if ( notReset ) {
glPopAttrib(); }
glPopMatrix();
glFlush();
glutSwapBuffers();
int error = glGetError();
if ( error != GL_NO_ERROR )
printf("Attention erreur %d\n",error);
}
/* Fonction executee lors de l'appui */
/* d'une touche alphanumerique du clavier */
static void keyboard(unsigned char key,int x,int y) {
switch (key) {
case 0x0D :
l = !l;
glutPostRedisplay();
break;
case 43 :
sz /= 1.01;
glutPostRedisplay();
break;
case 45 :
sz *= 1.01;
glutPostRedisplay();
break;
case 'a' :
{ anim = !anim;
glutIdleFunc(( anim ) ? idle : NULL); }
break;
case 'z' :
{ pMode = !pMode;
glutPostRedisplay(); }
break;
case 'f' :
{ cFond = (cFond+1)%3;
glutPostRedisplay(); }
break;
case 'F' :
{ static int full = 0;
static int wFx;
static int wFy;
full = !full;
if ( full ) {
wFx = glutGet(GLUT_WINDOW_WIDTH);
wFy = glutGet(GLUT_WINDOW_HEIGHT);
wPx = glutGet(GLUT_WINDOW_X);
wPy = glutGet(GLUT_WINDOW_Y);
glutFullScreen(); }
else {
glutPositionWindow(wPx,wPy);
glutReshapeWindow(wFx,wFy); } }
break;
case 0x1B :
exit(0);
break; }
}
/* Fonction executee lors de l'appui */
/* d'une touche speciale du clavier : */
/* - touches de curseur */
/* - touches de fonction */
static void special(int specialKey,int x,int y) {
switch(specialKey) {
case GLUT_KEY_F5 :
ms = !ms;
glutPostRedisplay();
break;
case GLUT_KEY_F6 :
md = !md;
glutPostRedisplay();
break;
case GLUT_KEY_F7 :
ma = !ma;
glutPostRedisplay();
break;
case GLUT_KEY_F8 :
me = !me;
glutPostRedisplay();
break;
case GLUT_KEY_F1 :
l0 = !l0;
glutPostRedisplay();
break;
case GLUT_KEY_F2 :
l1 = !l1;
glutPostRedisplay();
break;
case GLUT_KEY_F3 :
l2 = !l2;
glutPostRedisplay();
break;
case GLUT_KEY_F4 :
l3 = !l3;
glutPostRedisplay();
break;
case GLUT_KEY_F10 :
ldef = !ldef;
glutPostRedisplay();
break;
case GLUT_KEY_UP :
r1 += 1.0F;
glutPostRedisplay();
break;
case GLUT_KEY_DOWN :
r1 -= 1.0F;
glutPostRedisplay();
break;
case GLUT_KEY_RIGHT :
r2 += 1.0F;
glutPostRedisplay();
break;
case GLUT_KEY_LEFT :
r2 -= 1.0F;
glutPostRedisplay();
break; }
}