/* Auteur: Nicolas JANEY */ /* nicolas.janey@univ-fcomte.fr */ /* Octobre 2006 */ /* Gestion des lumieres en OpenGL */ #include #include #include #include #include #include "ModuleCylindres.h" #include "ModuleFont.h" static int f1; static int f2; static int tl = 1; static int to = 0; static float rx = 0.0F; static float ry = 0.0F; static float rz = 0.0F; static float e = 1.0F; static float c[4] = { 1.0F,1.0F,1.0F,1.0F }; static GLfloat lp[4] = { 0.0F,0.0F,0.0F,1.0F }; static GLfloat ld[4] = { 0.0F,0.0F,1.0F,0.0F }; static int anim = 1; void postRedisplay(void) { glutPostWindowRedisplay(f1); glutPostWindowRedisplay(f2); } void init(void) { GLfloat c[4] = { 1.0F,1.0F,1.0F,1.0F }; glMaterialfv(GL_FRONT,GL_DIFFUSE,c); glMaterialfv(GL_FRONT,GL_SPECULAR,c); glMaterialf(GL_FRONT,GL_SHININESS,15.0F); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glColor4fv(c) ; glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE); } void solidCube(float tx,float ty,float tz) { glPushMatrix(); glScalef(tx,ty,tz); glutSolidCube(1.0); glPopMatrix(); } void solidElement() { glPushMatrix(); glTranslatef(2.0F,0.0F,2.0F); solidCylindre(0.25F,3.0F,72,20); for ( int i = 0 ; i < 2 ; i++ ) { glTranslatef(0.0F,2.0F,0.0F); solidCube(1.0F,1.0F,1.0F); glRotatef(90.0F,0.0F,0.0F,1.0F); glTranslatef(0.0F,2.0F,0.0F); solidCylindre(0.25F,3.0F,72,20); } glPopMatrix(); } void solidScene() { glPushMatrix(); solidElement(); for ( int i = 1 ; i < 4 ; i++ ) { glPushMatrix(); glRotatef(90.0F*i,1.0F,0.0F,0.0F); solidElement(); glPopMatrix(); } glPopMatrix(); } void scene1(void) { glPushMatrix(); solidScene(); glPopMatrix(); } void scene2(void) { glPushMatrix(); for ( int i = 0 ; i < 4 ; i++ ) for ( int j = 0 ; j < 4 ; j++ ) for ( int k = 0 ; k < 4 ; k++ ) { float x = -2.0F + i*1.3333F; float y = -2.0F + j*1.3333F; float z = -2.0F + k*1.3333F; glPushMatrix(); glTranslatef(x,y,z); glutSolidSphere(0.3,18,18); glPopMatrix(); } glPopMatrix(); } void display(void) { glClearColor(0.8F,0.8F,0.8F,1.0F) ; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT) ; glPushMatrix(); glLightfv(GL_LIGHT0,GL_POSITION,(tl) ? lp : ld); float nrg[4] = { e*c[0],e*c[1],e*c[2],1.0F }; glLightfv(GL_LIGHT0,GL_DIFFUSE,nrg); glLightfv(GL_LIGHT0,GL_SPECULAR,nrg); glRotatef(rx,1.0F,0.0F,0.0F); glRotatef(ry,0.0F,1.0F,0.0F); glRotatef(rz,0.0F,0.0F,1.0F); switch (to) { case 0 : scene1(); break; case 1 : scene2(); break; } glPopMatrix(); glFlush(); glutSwapBuffers(); int error = glGetError(); if ( error != GL_NO_ERROR ) printf("Attention, erreur OpenGL %d\n",error); } void reshape(int tx,int ty) { glViewport(0,0,tx,ty); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(27.0,(double) tx/ty,15.0,25.0) ; glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0,0.0,20.0,0.0,0.0,0.0,0.0,1.0,0.0); } void idle(void) { rx += 1.1F; ry += 1.4F; rz += 1.7F; postRedisplay(); } void key(unsigned char key,int x,int y) { switch ( key ) { case 'r' : c[0] -= 0.01F; if ( c[0] < 0.0F ) c[0] = 0.0F; postRedisplay(); break; case 'R' : c[0] += 0.01F; if ( c[0] > 1.0F ) c[0] = 1.0F; postRedisplay(); break; case 'v' : c[1] -= 0.01F; if ( c[1] < 0.0F ) c[1] = 0.0F; postRedisplay(); break; case 'V' : c[1] += 0.01F; if ( c[1] > 1.0F ) c[1] = 1.0F; postRedisplay(); break; case 'b' : c[2] -= 0.01F; if ( c[2] < 0.0F ) c[2] = 0.0F; postRedisplay(); break; case 'B' : c[2] += 0.01F; if ( c[2] > 1.0F ) c[2] = 1.0F; postRedisplay(); break; case 'x' : if ( tl == 1 ) lp[0] += 0.1F; else ld[0] += 0.1F; postRedisplay(); break; case 'X' : if ( tl == 1 ) lp[0] -= 0.1F; else ld[0] -= 0.1F; postRedisplay(); break; case 'y' : if ( tl == 1 ) lp[1] += 0.1F; else ld[1] += 0.1F; postRedisplay(); break; case 'Y' : if ( tl == 1 ) lp[1] -= 0.1F; else ld[1] -= 0.1F; postRedisplay(); break; case 'z' : if ( tl == 1 ) lp[2] += 0.1F; else ld[2] += 0.1F; postRedisplay(); break; case 'Z' : if ( tl == 1 ) lp[2] -= 0.1F; else ld[2] -= 0.1F; postRedisplay(); break; case 45 : e /= 1.01F; postRedisplay(); break; case 43 : e *= 1.01F; postRedisplay(); break; case ' ' : anim = !anim; glutIdleFunc((anim) ? idle : NULL); break; case 'o' : to = !to ; postRedisplay(); break; case 0x0D : tl = !tl ; postRedisplay(); break; case 0x1B : exit(0); } } void reshape2(int w,int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0,w,-h,0,-1.0,1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void display2() { glClearColor(0.0F,0.0F,0.0F,1.0F); glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT); glPushMatrix(); float pos = 1.0F; if ( tl ) { placeFontCursor(5.0F,-pos*20.0F,0.0F) ; simpleBitmapOutput(1,REGULAR8x13,"Position : %6.2f %6.2f %6.2f",lp[0],lp[1],lp[2]) ; } else { placeFontCursor(5.0F,-pos*20.0F,0.0F) ; simpleBitmapOutput(1,REGULAR8x13,"Direction : %6.2f %6.2f %6.2f",ld[0],ld[1],ld[2]) ; } pos += 1.0F; placeFontCursor(5.0F,-pos*20.0F,0.0F) ; simpleBitmapOutput(1,REGULAR8x13,"Energie : %6.2f %6.2f %6.2f",e*c[0],e*c[1],e*c[2]) ; glPopMatrix(); glutSwapBuffers(); } int main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE); glutInitWindowSize(250,250); glutInitWindowPosition(50,50); f1 = glutCreateWindow("Gestion lumiere"); init(); glutIdleFunc(idle); glutReshapeFunc(reshape); glutKeyboardFunc(key); glutDisplayFunc(display); glutInitWindowSize(330,50); glutInitWindowPosition(60,340); glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE); f2 = glutCreateWindow("Valeurs"); glutDisplayFunc(display2); glutReshapeFunc(reshape2); glutKeyboardFunc(key); glutMainLoop(); return(0); }