/* Auteur: Nicolas JANEY */ /* nicolas.janey@univ-fcomte.fr */ /* Avril 2004 */ /* Comparaison Z-Buffer - Lancer de rayons */ #include #include #include #include #include #include #include "ModuleCouleurs.h" #include "ModuleMenus.h" #include "ModuleFont.h" #include "ModuleMatriceVecteurDouble.h" #include "ModuleManipulateur.h" #include "LancerDeRayonsFonctions.h" static int width ; static int height ; static int width2 ; static int height2 ; static int f1; static int f2; static float indice = 1.0F; materiel c0 = { (couleur *) couleurRouge(), (couleur *) couleurNoir(), 1,(couleur *) couleurGrisMoyen(), (couleur *) couleurNoir(), 1,(couleur *) couleurBlanc(), 3.0F,1.5F, 0,0.0F }; materiel c1 = { (couleur *) couleurVert(), (couleur *) couleurNoir(), 1,(couleur *) couleurGrisMoyen(), (couleur *) couleurNoir(), 1,(couleur *) couleurBlanc(), 3.0F,1.333F, 0,0.0F }; materiel c2 = { (couleur *) couleurBlanc(), (couleur *) couleurNoir(), 1,(couleur *) couleurGrisMoyen(), (couleur *) couleurNoir(), 1,(couleur *) couleurGrisMoyen(), 3.0F,1.33F, 0,0.0F }; materiel c3 = { (couleur *) couleurBleu(), (couleur *) couleurNoir(), 1,(couleur *) couleurGrisMoyen(), (couleur *) couleurNoir(), 1,(couleur *) couleurGrisMoyen(), 3.0F,1.5F, 0,0.0F }; materiel c41 = { (couleur *) couleurBlanc(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), 3.0F,1.0F, 0,0.0F }; materiel c42 = { (couleur *) couleurRouge(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), 3.0F,1.0F, 0,0.0F }; materiel c43 = { (couleur *) couleurVert(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), 3.0F,1.0F, 0,0.0F }; materiel c44 = { (couleur *) couleurBleu(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), 3.0F,1.0F, 0,0.0F }; materiel c45 = { (couleur *) couleurMagenta(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), 3.0F,1.0F, 0,0.0F }; materiel c5 = { (couleur *) newCouleur(couleurGris(0.15F,0.5F)), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), (couleur *) couleurNoir(), 1,(couleur *) couleurBlanc(), 3.0F,indice, 0,0.0F }; materiel c6 = { (couleur *) newCouleur(couleurGris(0.15F,0.5F)), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), (couleur *) couleurNoir(), 1,(couleur *) couleurBlanc(), 3.0F,1.5F, 0,0.0F }; materiel c7 = { (couleur *) couleurNoir(), (couleur *) couleurNoir(), 1,(couleur *) couleurBlanc(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), 3.0F,1.5F, 0,0.0F }; materiel c8 = { (couleur *) couleurJaune(), (couleur *) couleurNoir(), 0,(couleur *) couleurGrisClair(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), 3.0F,1.5F, 0,0.0F }; materiel c9 = { (couleur *) couleurCyan(), (couleur *) couleurNoir(), 0,(couleur *) couleurGrisClair(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), 3.0F,1.5F, 0,0.0F }; materiel c10 = { (couleur *) couleurRouge(), (couleur *) couleurNoir(), 0,(couleur *) couleurGrisClair(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), 3.0F,1.5F, 0,0.0F }; materiel c11 = { (couleur *) couleurVert(), (couleur *) couleurNoir(), 0,(couleur *) couleurGrisClair(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), 3.0F,1.5F, 0,0.0F }; materiel c12 = { (couleur *) couleurBlanc(), (couleur *) couleurNoir(), 0,(couleur *) couleurGrisClair(), (couleur *) couleurNoir(), 0,(couleur *) couleurNoir(), 3.0F,1.5F, 0,0.0F }; lumiere lums1[2] = { { { 0.0F,2.0F,-10.0F,1.0F },1.0F,(couleur *) couleurBlanc() }, { { 0.0F,-2.0F,-12.0F,1.0F },1.0F,(couleur *) couleurBlanc() } }; lumiere lums2[2] = { { { 6.0F,0.0F,-5.0F,1.0F },1.0F,(couleur *) couleurBlanc() }, { { -3.0F,0.0F,-8.0F,1.0F },1.0F,(couleur *) couleurBlanc() } }; lumiere lums3[2] = { { { 6.0F,0.0F,-7.5F,1.0F },2.0F,(couleur *) couleurJaune() }, { { -6.0F,0.0F,-7.5F,1.0F },2.0F,(couleur *) couleurBlanc() } }; lumiere lums6[2] = { { { 2.0F,1.0F,-6.0F,1.0F },2.5F,(couleur *) couleurBlanc() }, { { -2.0F,-1.0F,-6.0F,1.0F },2.5F,(couleur *) couleurBlanc() } }; objet objs1[4] = { { cube,2.0F,2.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.6F,1.2F,0.9F,&c0 }, { cube,-2.0F,2.0F,-15.0F,60.0F,1.0F,1.0F,0.0F,2.4F,1.8F,1.2F,&c1 }, { sphere,-2.0F,-2.0F,-15.0F,25.0F,-1.0F,1.0F,1.0F,0.9F,1.2F,1.4F,&c2 }, { sphere,2.0F,-2.0F,-15.0F,60.0F,-1.0F,-1.0F,1.0F,0.6F,2.1F,1.9F,&c3 } }; objet objs2[2] = { { sphere,0.0F,0.0F,-15.0F,0.0F,0.0F,0.0F,1.0F,2.0F,3.0F,4.0F,&c2 }, { sphere,1.0F,0.0F,-10.0F,0.0F,0.0F,0.0F,1.0F,0.4F,0.4F,0.4F,&c3 } }; objet objs3[26] = { { cube,3.0F,3.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c41 }, { cube,3.0F,1.5F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c42 }, { cube,3.0F,0.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c43 }, { cube,3.0F,-1.5F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c44 }, { cube,3.0F,-3.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c45 }, { cube,1.5F,3.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c41 }, { cube,1.5F,1.5F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c42 }, { cube,1.5F,0.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c43 }, { cube,1.5F,-1.5F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c44 }, { cube,1.5F,-3.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c45 }, { cube,0.0F,3.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c41 }, { cube,0.0F,1.5F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c42 }, { cube,0.0F,0.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c43 }, { cube,0.0F,-1.5F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c44 }, { cube,0.0F,-3.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c45 }, { cube,-1.5F,3.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c41 }, { cube,-1.5F,1.5F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c42 }, { cube,-1.5F,0.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c43 }, { cube,-1.5F,-1.5F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c44 }, { cube,-1.5F,-3.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c45 }, { cube,-3.0F,3.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c41 }, { cube,-3.0F,1.5F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c42 }, { cube,-3.0F,0.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c43 }, { cube,-3.0F,-1.5F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c44 }, { cube,-3.0F,-3.0F,-15.0F,35.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c45 }, { sphere,0.0F,0.0F,-9.0F,0.0F,0.0F,0.0F,1.0F,2.0F,2.0F,2.0F,&c5 } }; objet objs4[26] = { { cube,3.0F,3.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c41 }, { cube,3.0F,1.5F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c42 }, { cube,3.0F,0.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c43 }, { cube,3.0F,-1.5F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c44 }, { cube,3.0F,-3.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c45 }, { cube,1.5F,3.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c41 }, { cube,1.5F,1.5F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c42 }, { cube,1.5F,0.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c43 }, { cube,1.5F,-1.5F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c44 }, { cube,1.5F,-3.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c45 }, { cube,0.0F,3.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c41 }, { cube,0.0F,1.5F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c42 }, { cube,0.0F,0.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c43 }, { cube,0.0F,-1.5F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c44 }, { cube,0.0F,-3.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c45 }, { cube,-1.5F,3.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c41 }, { cube,-1.5F,1.5F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c42 }, { cube,-1.5F,0.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c43 }, { cube,-1.5F,-1.5F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c44 }, { cube,-1.5F,-3.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c45 }, { cube,-3.0F,3.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c41 }, { cube,-3.0F,1.5F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c42 }, { cube,-3.0F,0.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c43 }, { cube,-3.0F,-1.5F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c44 }, { cube,-3.0F,-3.0F,-15.0F,45.0F,1.0F,1.0F,1.0F,1.0F,0.8F,0.6F,&c45 }, { cube,0.0F,0.0F,-8.0F,40.0F,0.1F,1.0F,0.1F,3.0F,3.0F,0.7F,&c6 } }; objet objs5[6] = { { cube,0.0F,0.0F,-14.5F,0.0F,1.0F,1.0F,1.0F,4.5F,4.5F,0.2F,&c12 }, { cube,0.0F,2.5F,-12.0F,0.0F,1.0F,1.0F,1.0F,4.5F,0.2F,4.5F,&c11 }, { cube,0.0F,-2.5F,-12.0F,0.0F,1.0F,1.0F,1.0F,4.5F,0.2F,4.5F,&c10 }, { cube,2.5F,0.0F,-12.0F,0.0F,1.0F,1.0F,1.0F,0.2F,4.5F,4.5F,&c9 }, { cube,-2.5F,0.0F,-12.0F,0.0F,1.0F,1.0F,1.0F,0.2F,4.5F,4.5F,&c8 }, { sphere,0.0F,0.0F,-12.0F,0.0F,0.0F,0.0F,1.0F,1.75F,1.75F,1.75F,&c7 } }; scene sc1 = { 4,objs1,2,lums1,30.0F,5.0F,40.0F,160,160 }; scene sc2 = { 2,objs2,2,lums2,30.0F,5.0F,40.0F,160,160 }; scene sc3 = { 26,objs3,2,lums3,30.0F,5.0F,40.0F,210,210 }; scene sc4 = { 26,objs4,2,lums3,30.0F,5.0F,40.0F,240,240 }; scene sc5 = { 6,objs5,2,lums6,35.0F,5.0F,40.0F,210,210 }; scene *scenes[6] = { &sc1,&sc2,&sc3,&sc4,&sc5,&sc5 }; static int sce = 2; static int nsce = 6; static GLubyte *im = NULL ; void displayZBuffer(scene *sc) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(sc->vang,(double) width/height,sc->cmin,sc->cmax); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPushMatrix(); glEnable(GL_LIGHTING); glEnable(GL_CULL_FACE); int i; for ( i = 0 ; i < sc->nlum ; i++ ) { int l = GL_LIGHT0+i; glEnable(l); float p[4] = { (float) sc->lum[i].pos[0],(float) sc->lum[i].pos[1],(float) sc->lum[i].pos[2],(float) sc->lum[i].pos[3] }; glLightfv(l,GL_POSITION,p); float d[4] = { (float) sc->lum[i].coul->r*sensibilite*fact,(float) sc->lum[i].coul->v*sensibilite*fact,(float) sc->lum[i].coul->b*sensibilite*fact,(float) sc->lum[i].coul->a }; glLightfv(l,GL_DIFFUSE,d); glLightfv(l,GL_SPECULAR,d); glLightfv(l,GL_AMBIENT,couleurNoir()); glLightf(l,GL_CONSTANT_ATTENUATION,0.0F); glLightf(l,GL_QUADRATIC_ATTENUATION,1.0F); } for ( ; i < 8 ; i++ ) { int l = GL_LIGHT0+i; glEnable(l); } for ( i = 0 ; i < sc->nobj ; i++ ) { glPushMatrix(); glTranslated(sc->obj[i].tx,sc->obj[i].ty,sc->obj[i].tz); manipulateurSouris(); manipulateurClavier(); glRotated(sc->obj[i].a,sc->obj[i].ax,sc->obj[i].ay,sc->obj[i].az); glScaled(sc->obj[i].rx,sc->obj[i].ry,sc->obj[i].rz); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,(float *) sc->obj[i].m->diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,(float *) sc->obj[i].m->ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,(float *) sc->obj[i].m->specular); glMaterialfv(GL_FRONT_AND_BACK,GL_EMISSION,(float *) sc->obj[i].m->emission); glMaterialfv(GL_FRONT_AND_BACK,GL_SHININESS,(float *) &sc->obj[i].m->shininess); switch(sc->obj[i].type) { case cube : glutSolidCube(1.0); break; case sphere : glutSolidSphere(1.0,180,180); break; } glPopMatrix(); } glDisable(GL_LIGHTING); glDisable(GL_CULL_FACE); glPopMatrix(); glFlush(); glutSwapBuffers(); } void display(void) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(scenes[sce]->vang,(double) width/height,scenes[sce]->cmin,scenes[sce]->cmax); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); displayZBuffer(scenes[sce]); glFlush(); glutSwapBuffers(); glutSwapBuffers(); } void myinit (void) { glClearColor(0.0F,0.0F,0.0F,0.0F); glEnable(GL_DEPTH_TEST); glEnable(GL_ALPHA_TEST); glEnable(GL_BLEND); glPixelStorei(GL_UNPACK_ALIGNMENT,1); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE); } void reshape(int w, int h) { glViewport(0,0,w,h); width = w; height = h; } void ajustementTailleFenetre() { if ( ( scenes[sce]->tx != width ) || ( scenes[sce]->ty != height ) ) glutReshapeWindow(scenes[sce]->tx,scenes[sce]->ty); else glutPostRedisplay(); } static int j = 0; static int anim = 0; void reAnime(void) { j = 0; anim = 0; } void idle(void) { int w = width2; int h = height2; glutSetWindow(f1); ajustementTailleFenetre(); glutSetWindow(f2); ajustementTailleFenetre(); if ( j == 0 ) im = initialisationsCalculImageLancerDeRayon(scenes[sce],width2,height2); calculImageLancerDeRayon(scenes[sce],j,w,h,&im[(j*w)*3]); j++; if ( j == h ) { glutIdleFunc(NULL); anim = 0; j = 0; } else glutPostRedisplay(); } void key2(unsigned char key,int x,int y) { switch (key) { case 0x0D : anim = 1; glutIdleFunc(idle); break; case ' ' : printf("Indice = "); scanf("%f",&indice); if ( indice < 0.01F ) indice = 0.01F ; if ( sce == 2 ) c5.indice = indice; reAnime(); glutIdleFunc(idle); break ; case 43 : indice += 0.01F; if ( sce == 2 ) c5.indice = indice; reAnime(); glutIdleFunc(idle); break; case 45 : indice -= 0.01F; if ( indice < 1.0F ) indice = 1.0F; if ( sce == 2 ) c5.indice = indice; reAnime(); glutIdleFunc(idle); break; case 's' : case 'S' : sce = (sce+1) % nsce; if ( sce == 2 ) c5.indice = indice; if ( sce == 4 ) c7.r = c8.r = c9.r = c10.r = c11.r = 0; if ( sce == 5 ) c7.r = c8.r = c9.r = c10.r = c11.r = 1; reAnime(); glutIdleFunc(idle); break ; case 0x1B : exit(0) ; break; } } void key(unsigned char ky,int x,int y) { if ( keyManipulateur(ky,x,y) ) glutPostRedisplay(); else key2(ky,x,y); } void displayLancerDeRayon(scene *sc) { glPushMatrix() ; int w = width2; int h = height2; if ( im == NULL ) { int t = w*h*3 ; im =(GLubyte *) calloc(t,sizeof(GLubyte)); } glRasterPos2f(0.0F,0.0F) ; glDrawPixels(w,h,GL_RGB,GL_UNSIGNED_BYTE,im) ; glPopMatrix() ; } void display2(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); displayLancerDeRayon(scenes[sce]); if ( sce == 2 ) { setAlignement(CENTER); placeFontCursor(width2/2,10.0,0.1F); simpleBitmapOutput(1,REGULAR8x13,"INDICE : %6.4f",indice) ; } glFlush(); glutSwapBuffers(); } void reshape2(int w,int h) { glutIdleFunc(idle); glViewport(0,0,w,h); width2 = w; height2 = h; int ww = w; int hh = h; int t = ww*hh*3 ; im =(GLubyte *) calloc(t,sizeof(GLubyte)); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0,w,0,h,-1.0,1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE); { glutInitWindowSize(320,180); glutInitWindowPosition(20,20); f1 = glutCreateWindow("Mini lancer de rayons: Z-Buffer et Gouraud"); myinit(); ajustementTailleFenetre(); creationMenuBasique(); glutKeyboardFunc(key); glutReshapeFunc(reshape); glutDisplayFunc(display); glutSpecialFunc(specialBasique); glutMotionFunc(motionBasique); glutMouseFunc(sourisBasique); } { glutInitWindowPosition(30,300); glutInitWindowSize(320,180); f2 = glutCreateWindow("Mini lancer de rayons: Lancer de rayons"); myinit(); ajustementTailleFenetre(); creationMenuBasique(); glutIdleFunc(idle); glutKeyboardFunc(key2); glutReshapeFunc(reshape2); glutDisplayFunc(display2); } glutMainLoop(); return(0); }