 
    
    /* Auteur: Nicolas JANEY             */
      /* nicolas.janey@univ-fcomte.fr      */
      /* Avril 2001                        */
      /* Illustration d'une decomposition  */
      /* de l'espace en voxels pour une    */
      /* utilisation dans un algorithme    */
      /* de lancer de rayons               */
      
      #include <stdio.h>
      #include <math.h>
      
      #include <GL/glut.h>
      #include <GL/gl.h>
      #include <GL/glu.h>
      
      #include "ModuleCouleurs.h"
      #include "ModuleManipulateur.h"
      #include "ModuleMenus.h"
      #include "ModuleReshape.h"
      
      static int aff = 0 ;
      
      void myinit(void) {
        GLfloat light_position0[] = { 1.0F,1.0F,1.0F,0.0F };
        glLightfv(GL_LIGHT0,GL_AMBIENT,couleurNoir());
        glLightfv(GL_LIGHT0,GL_DIFFUSE,couleurBlanc());
        glLightfv(GL_LIGHT0,GL_SPECULAR,couleurBlanc());
        glLightfv(GL_LIGHT0,GL_POSITION,light_position0);
        glEnable(GL_LIGHT0);
        glEnable(GL_AUTO_NORMAL);
        glEnable(GL_NORMALIZE);
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LESS);
      }
      
      void display(void) {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glPushMatrix() ;
        manipulateurSouris();
        manipulateurClavier();
        glRotatef(10.0F,1.0,0.0,0.0);
        glRotatef(15.0F,0.0,1.0,0.0);
        glRotatef(0.0F,0.0,0.0,1.0);
        glColor4fv(couleurBlanc()) ;
        glBegin(GL_LINES) ;
        for ( int x = -6 ; x <= 6 ; x += 4 )
          for ( int y = -6 ; y <= 6 ; y += 4 ) {
            glVertex3i(x,y,-6) ;
            glVertex3i(x,y,6) ;
            glVertex3i(x,-6,y) ;
            glVertex3i(x,6,y) ;
            glVertex3i(-6,x,y) ;
            glVertex3i(6,x,y) ; }
        glEnd() ;
        glEnable(GL_LIGHTING);
        if ( aff == 1 ) {
          glPushMatrix();
          glTranslatef(3.0F,2.0F,1.0F);
          glMaterialfv(GL_FRONT,GL_DIFFUSE,couleurRouge()) ;
          glRotatef(10,1.0,0.0,0.0);
          glRotatef(20,0.0,1.0,0.0);
          glRotatef(30,0.0,0.0,1.0);
          glutSolidSphere(1.3,30,30) ;
          glPopMatrix();
          glPushMatrix();
          glTranslatef(-3.0F,4.0F,-3.0F);
          glMaterialfv(GL_FRONT,GL_DIFFUSE,couleurVert()) ;
          glRotatef(-10,1.0,0.0,0.0);
          glRotatef(-20,0.0,1.0,0.0);
          glRotatef(60,0.0,0.0,1.0);
          glutSolidCube(1.0) ;
          glPopMatrix();
          glPushMatrix();
          glTranslatef(-0.0F,-4.0F,-2.0F);
          glMaterialfv(GL_FRONT,GL_DIFFUSE,couleurBleu()) ;
          glRotatef(10,1.0,0.0,0.0);
          glRotatef(20,0.0,1.0,0.0);
          glRotatef(60,0.0,0.0,1.0);
          glutSolidCone(1.9,2.0,30,30) ;
          glPopMatrix();
          glPushMatrix();
          glTranslatef(-2.0F,-4.0F,-4.0F);
          glMaterialfv(GL_FRONT,GL_DIFFUSE,couleurJaune()) ;
          glRotatef(10,1.0,0.0,0.0);
          glRotatef(20,0.0,1.0,0.0);
          glRotatef(60,0.0,0.0,1.0);
          glutSolidTorus(0.8,1.6,30,30) ;
          glPopMatrix();
          glPushMatrix();
          glTranslatef(4.0F,-1.0F,-4.0F);
          glMaterialfv(GL_FRONT,GL_DIFFUSE,couleurMagenta()) ;
          glRotatef(10,1.0,0.0,0.0);
          glRotatef(20,0.0,1.0,0.0);
          glRotatef(60,0.0,0.0,1.0);
          glutSolidTeapot(1.5) ;
          glPopMatrix();
          glPushMatrix();
          glTranslatef(-3.0F,3.0F,4.0F);
          glMaterialfv(GL_FRONT,GL_DIFFUSE,couleurCyan()) ;
          glRotatef(10,1.0,0.0,0.0);
          glRotatef(60,0.0,1.0,0.0);
          glRotatef(60,0.0,0.0,1.0);
          glutSolidCone(0.8,2.5,30,30) ;
          glPopMatrix(); }
        glDisable(GL_LIGHTING);
        glPopMatrix() ;
        glFlush();
        glutSwapBuffers() ;
      }
      
      void key(unsigned char key,int x,int y) {
        if ( keyManipulateur(key,x,y) )
          glutPostRedisplay();
          else
          switch ( key ) {
            case 0x0D   : aff = 1-aff ;
                          glutPostRedisplay();
                          break ; }
      }
      
      int main(int argc,char **argv) {
        glutInit(&argc,argv);
        glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
        glutInitWindowSize(300,300); 
        glutInitWindowPosition(50,50); 
        glutCreateWindow("Décomposition en voxels"); 
        myinit(); 
        creationMenuBasique();
        setParametresOrthoBasique(-11.0,11.0,-11.0,11.0,-50.0,50.0);
        setManipulateurDistance(1.0F);
        glutReshapeFunc(reshapeOrthoBasique);
        glutKeyboardFunc(key);
        glutSpecialFunc(specialBasique);
        glutMotionFunc(motionBasique);
        glutMouseFunc(sourisBasique);
        glutDisplayFunc(display);
        glutMainLoop();
        return(0);
      }