/* Auteur: Nicolas JANEY */ /* Avril 2001 */ /* Une animation sur les lumieres */ #include "windows.h" #include #include #include #include static float anglex = 0 ; static float angley = 0 ; static float anglez = 0 ; static int obj = 0 ; static int anim = 0 ; static int scene = 0 ; static int nf = 50 ; static GLfloat rouge[] = { 1.0f,0.0f,0.0f,1.0f }; static GLfloat vert[] = { 0.0f,1.0f,0.0f,1.0f }; static GLfloat bleu[] = { 0.0f,0.0f,1.0f,1.0f }; static GLfloat blanc[] = { 1.0f,1.0f,1.0f,1.0f }; static GLfloat noir[] = { 0.0f,0.0f,0.0f,1.0f }; void myinit(void) { GLfloat shininess[] = { 50.0 }; glMaterialfv(GL_FRONT,GL_SPECULAR,blanc); glMaterialfv(GL_FRONT,GL_DIFFUSE,blanc); glMaterialfv(GL_FRONT,GL_AMBIENT,noir); glMaterialfv(GL_FRONT,GL_SHININESS,shininess); glLightfv(GL_LIGHT0,GL_DIFFUSE,rouge); glLightfv(GL_LIGHT1,GL_DIFFUSE,bleu); glLightfv(GL_LIGHT0,GL_SPECULAR,vert); glLightfv(GL_LIGHT1,GL_SPECULAR,vert); glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,20); glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,25); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); } void CALLBACK display(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix() ; glRotatef(anglex,1.0F,0.0F,0.0F) ; glRotatef(angley,0.0F,1.0F,0.0F) ; glRotatef(anglez,0.0F,0.0F,1.0F) ; if ( scene ) { GLfloat light0_position[] = { 1.0f,0.0f,0.0f,0.0f }; GLfloat light1_position[] = { -1.0f,0.0f,0.0f,0.0f }; glLightfv(GL_LIGHT0,GL_POSITION,light0_position); glLightfv(GL_LIGHT1,GL_POSITION,light1_position); } else { GLfloat light0_dir[] = { -1.0f,0.0f,0.0f }; GLfloat light1_dir[] = { 1.0f,0.0f,0.0f }; glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,light0_dir); glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,light1_dir); glEnable(GL_LIGHTING); GLfloat light0_position[] = { 2.0f,0.0f,0.0f,1.0f }; GLfloat light1_position[] = { -2.0f,0.0f,0.0f,1.0f }; glLightfv(GL_LIGHT0,GL_POSITION,light0_position); glLightfv(GL_LIGHT1,GL_POSITION,light1_position); } glPopMatrix() ; glPushMatrix() ; if ( obj ) glutSolidSphere(1.0,nf,nf); else auxSolidSphere(1.0); glPopMatrix() ; glFlush(); auxSwapBuffers() ; } void CALLBACK myReshape(int w,int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho (-1.5,1.5,-1.5*(GLfloat)h/(GLfloat)w,1.5*(GLfloat)h/(GLfloat)w,-10.0,10.0); else glOrtho (-1.5*(GLfloat)w/(GLfloat)h,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5,-10.0,10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void CALLBACK idle(void) { if ( anim ) { anglex++ ; angley-- ; anglez+=2 ; display() ; } } void CALLBACK keyReturn(void) { obj = 1 - obj; } void CALLBACK keySpace(void) { anim = 1 - anim; } void CALLBACK keyUp(void) { nf++; } void CALLBACK keyDown(void) { nf--; if ( nf < 8 ) nf = 8; } void CALLBACK keyA(void) { scene = 1 - scene; } void main(void) { auxInitDisplayMode(AUX_DOUBLE|AUX_RGB|AUX_DEPTH); auxInitPosition(0,0,300,300); auxInitWindow("Lumières mouvantes"); myinit(); auxIdleFunc(idle) ; auxKeyFunc(AUX_RETURN,keyReturn) ; auxKeyFunc(AUX_SPACE,keySpace) ; auxKeyFunc(AUX_A,keyA) ; auxKeyFunc(AUX_a,keyA) ; auxKeyFunc(AUX_UP,keyUp) ; auxKeyFunc(AUX_DOWN,keyDown) ; auxReshapeFunc(myReshape); auxMainLoop(display); }