L'exécutable

Le source : Exam-TD1-2004-2005-Exo4.cpp

/* Auteur: Nicolas JANEY            */
/* nicolas.janey@univ-fcomte.fr     */
/* Novembre 2004                    */
/* Animation en OpenGL + GLUT       */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>

#include "ModuleCouleurs.h"
#include "ModuleMenus.h"
#include "ModuleFont.h"
#include "ModuleReshape.h"

static int image = 0;
static int n = 600;
static int f1;
static int f2;
static int carre = 0;

void calculPosition(int image,int n,float *x,float *y) {
  float l = 20.0F*image/(float) n;
  if ( l < 5.0 ) {
    *x = 2.5F;
    *y = -2.5F + l;
    return; }
  if ( l < 10.0 ) {
    *x = 7.5F - l;
    *y = 2.5F;
    return; }
  if ( l < 15.0 ) {
    *x = -2.5F;
    *y = 12.5F - l;
    return; }
  *x = -17.5F + l;
  *y = -2.5F;
}

void dessineTrajectoireCarree(void) {
  glBegin(GL_LINE_LOOP);
  glVertex2f(-2.5F,-2.5F);
  glVertex2f(2.5F,-2.5F);
  glVertex2f(2.5F,2.5F);
  glVertex2f(-2.5F,2.5F);
  glEnd();
}

void display1() {
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  glPushMatrix();
  if ( carre )
    dessineTrajectoireCarree();
  float x;
  float y;
  calculPosition(image,n,&x,&y);
  glTranslatef(x,y,0.0F);
  glutSolidSphere(1.0,120,120);
  glPopMatrix();
  glFlush();
  glutSwapBuffers() ;
}

void display2() {
  glClearColor(0.5F,0.5F,0.5F,1.0F);
  glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
  glPushMatrix();
  float x;
  float y;
  calculPosition(image,n,&x,&y);
  float pos = 1.0F;
  glColor4fv(couleurNoir());
  placeFontCursor(5.0F,-pos*20.0F,0.0F) ;
  simpleBitmapOutput(1,REGULAR8x13,"Image %4d sur %4d",image,n) ;
  pos += 1;
  placeFontCursor(5.0F,-pos*20.0F,0.0F) ;
  simpleBitmapOutput(1,REGULAR8x13,"P : %7.3f %7.3f",x,y) ;
  glPopMatrix();
  glutSwapBuffers();
}

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 idle(void) {
  image++;
  if ( image == n )
    image = 0;
  glutPostWindowRedisplay(f1);
  glutPostWindowRedisplay(f2);
}

void key(unsigned char key,int x,int y) {
  switch ( key ) {
    case 43   : n++ ;
                glutPostWindowRedisplay(f1);
                glutPostWindowRedisplay(f2);
                break;
    case 45   : n-- ;
                if ( n < 2 )
                  n = 2;
                if ( image >= n )
                  image = n-1;
                glutPostWindowRedisplay(f1);
                glutPostWindowRedisplay(f2);
                break;
    case ' '  : carre = !carre;
                glutPostWindowRedisplay(f1);
                glutPostWindowRedisplay(f2);
                break;
    case 0x0D : { static int anim = 1;
                  anim = !anim;
                  if ( anim )
                    glutIdleFunc(idle);
                    else
                    glutIdleFunc(NULL); }
                break;
    case 0x1B : exit(0);
                break; }
}

void myinit() {
  glClearColor(0.8F,0.8F,0.8F,1.0F);
  GLfloat mat_shininess[] = { 50.0 };
  GLfloat light0_position[] = { 1.0,1.0,1.0,0.0 };
  GLfloat light1_position[] = { -1.0,1.0,1.0,0.0 };
  GLfloat light2_position[] = { 1.0,-1.0,1.0,0.0 };
  glMaterialfv(GL_FRONT,GL_SPECULAR,couleurBlanc());
  glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
  glLightfv(GL_LIGHT0,GL_DIFFUSE,couleurRouge());
  glLightfv(GL_LIGHT1,GL_DIFFUSE,couleurVert());
  glLightfv(GL_LIGHT2,GL_DIFFUSE,couleurBleu());
  glLightfv(GL_LIGHT0,GL_POSITION,light0_position);
  glLightfv(GL_LIGHT1,GL_POSITION,light1_position);
  glLightfv(GL_LIGHT2,GL_POSITION,light2_position);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  glEnable(GL_LIGHT1);
  glEnable(GL_LIGHT2);
  glDepthFunc(GL_LESS);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_NORMALIZE);
  glEnable(GL_AUTO_NORMAL);
}

int main(int argc,char **argv) {
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
  glutInitWindowSize(250,250); 
  glutInitWindowPosition(50,50); 
  f1 = glutCreateWindow("Animation OpenGL + GLUT"); 
  myinit(); 
  creationMenuBasique();
  setParametresOrthoBasique(-4.0,4.0,-4.0,4.0,-50.0,50.0);
  glutReshapeFunc(reshapeOrthoBasique);
  glutKeyboardFunc(key);
  glutIdleFunc(idle);
  glutDisplayFunc(display1);
  glutInitWindowSize(200,50);
  glutInitWindowPosition(60,340);
  glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
  f2 = glutCreateWindow("Position sphère");
  creationMenuBasique();
  glutDisplayFunc(display2);
  glutReshapeFunc(reshape2);
  glutKeyboardFunc(key);
  glutMainLoop();
  return(0);
}

Les modules utilitaires : Modules.zip

RETOUR