1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
void Dessiner(Case *** tab, GLenum mode)
{
int i;
int j;
int k;
double cube = CUBE_TAILLE;
GLint hits;
GLint viewport[4];
GLuint buffer[50];
if (mode == GL_SELECT)
{
// On efface tout afin de ne pas avoir des "reflets" dans la fenêtre
// (GL_COLOR_BUFFER_BIT) et on réinitialiese le Z-Buffer (GL_DEPTH_BUFFER_BIT)
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity ();
gluPerspective(70.0f,(double)640/480,0.0001,100.0);
// Le placement de la caméra se fait sur la matrice GL_MODELVIEW, il faut
// donc l'appeler et l'initialiser
glMatrixMode( GL_MODELVIEW );
// On reprend la matrice initiale
glLoadIdentity();
gluLookAt(3.5,3.5,3.5,0,0,0,0,0,1);
// On fait une rotation du cube pour le faire tourner
glRotated(angleX, 1.0, 0.0, 0.0);
glRotated(angleZ, 0.0, 1.0, 0.0);
glRotated(angleY, 0.0, 0.0, 1.0);
// On cadre le cube en 0,0,0
glTranslated(-cube/2,-cube/2,-cube/2);
}
else if (mode == GL_RENDER)
{
glGetIntegerv(GL_VIEWPORT, viewport);
glSelectBuffer(50,buffer);
(void) glRenderMode(GL_SELECT);
glInitNames();
glPushName(0);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity ();
gluPickMatrix((GLdouble) x, (GLdouble) (viewport[3]-y), 1.0f, 1.0f, viewport);
gluPerspective(70.0f,(double)640/480,0.0001,1000);
}
int compteurCube = 0;
for (i=0; i<cube; i++)
{
for (j=0; j<cube; j++)
{
for (k=0; k<cube; k++)
{
if (mode == GL_RENDER)
glLoadName(compteurCube);
if (tab[i][j][k].valeur == 0)
temp = caseVide;
if (tab[i][j][k].affichage==1)
glColor3ub(255,0,0);
else glColor3ub(255,255,255);
glBindTexture(GL_TEXTURE_2D, temp);
glBegin(GL_QUADS);
glTexCoord2d(0,1); glVertex3d(i+1,j+1,k+1);
glTexCoord2d(0,0); glVertex3d(i+1,j+1,k);
glTexCoord2d(1,0); glVertex3d(i,j+1,k);
glTexCoord2d(1,1); glVertex3d(i,j+1,k+1);
glTexCoord2d(0,1); glVertex3d(i+1,j,k+1);
glTexCoord2d(0,0); glVertex3d(i+1,j,k);
glTexCoord2d(1,0); glVertex3d(i+1,j+1,k);
glTexCoord2d(1,1); glVertex3d(i+1,j+1,k+1);
glTexCoord2d(0,1); glVertex3d(i,j,k+1);
glTexCoord2d(0,0); glVertex3d(i,j,k);
glTexCoord2d(1,0); glVertex3d(i+1,j,k);
glTexCoord2d(1,1); glVertex3d(i+1,j,k+1);
glTexCoord2d(0,1); glVertex3d(i,j+1,k+1);
glTexCoord2d(0,0); glVertex3d(i,j+1,k);
glTexCoord2d(1,0); glVertex3d(i,j,k);
glTexCoord2d(1,1); glVertex3d(i,j,k+1);
glTexCoord2d(0,1); glVertex3d(i+1,j+1,k);
glTexCoord2d(0,0); glVertex3d(i+1,j,k);
glTexCoord2d(1,0); glVertex3d(i,j,k);
glTexCoord2d(1,1); glVertex3d(i,j+1,k);
glTexCoord2d(0,1); glVertex3d(i+1,j,k+1);
glTexCoord2d(0,0); glVertex3d(i+1,j+1,k+1);
glTexCoord2d(1,0); glVertex3d(i,j+1,k+1);
glTexCoord2d(1,1); glVertex3d(i,j,k+1);
glEnd();
compteurCube++;
}
}
}
if (mode == GL_RENDER)
{
glMatrixMode (GL_PROJECTION);
glPopMatrix ();
glFlush ();
hits = glRenderMode(GL_RENDER);
processHits (hits, buffer);
}
glFlush();
SDL_GL_SwapBuffers();
} |
Partager