J 'ai fait un code et ça marche très bien; il détecte les couleurs des objets. Mais je veux que, pour une valeur particulière de la couleur, dessiner un objet (une boule dans ce cas), alors j'ai inséré une condition sur une variable qui contient la couleur dans ma fonction display mais cela ne marche pas :
le code:
#include<GL/glut.h>
#include <stdlib.h>
#include<stdio.h>
int X,Y,r=-1,v=-1;
static const float blanc[] = { 1.0F,1.0F,1.0F,1.0F };
static const float gris[] = { 0.6F,0.6F,0.6F,1.0F };
void changeSize(int w, int h)
{
if(h == 0)
h = 1;
float ratio = 1.0* w / h;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w, h);
gluPerspective(45,ratio,1,1000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,5.0, 0.0,0.0,-1.0,0.0f,1.0f,0.0f);
}
void init(void)
{
const GLfloat mat_shininess[] = { 50.0 };
glMaterialfv(GL_FRONT,GL_SPECULAR,blanc);
glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);
const GLfloat mat_diffuse[4] = { 1.0F,0.0F,0.0F,1.0F };
glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);
glLightfv(GL_LIGHT0,GL_DIFFUSE,gris);
glLightfv(GL_LIGHT1,GL_DIFFUSE,gris);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);
glEnable(GL_AUTO_NORMAL);
glEnable(GL_CULL_FACE);
}
void dessinerboules(void)
{
int i,j;
float y=-1.45,x=-1.65;
for ( i = 0 ; i < 10 ; i++ )
{
for(j=0;j<4;j++)
{
glPushMatrix();
glTranslatef(x,y, 0.1);
glMaterialfv(GL_FRONT,GL_DIFFUSE,blanc);
glutSolidSphere(0.1,10000,10000);
glPopMatrix();
x=x+0.3;
}
x=-1.65;
y=y+0.3;
}
}
void drawPickingMode()
{
int i,j;
float y=-1.45,x=-1.65;
for ( i = 0 ; i < 10 ; i++ )
{
for(j=0;j<4;j++)
{
glPushMatrix();
glTranslatef(x,y, 0.1);
glColor3ub(4*i+j+1,0,0);
glutSolidSphere(0.1,10000,10000);
glPopMatrix();
x=x+0.3;
}
x=-1.65;
y=y+0.3;
}
}
void selectionmode(void)
{
GLint viewport[4];
GLubyte pixel[3];
glGetIntegerv(GL_VIEWPORT,viewport);
glDisable(GL_LIGHTING);
glDisable(GL_LESS);
glDisable(GL_DEPTH_TEST);
glDisable(GL_NORMALIZE);
glDisable(GL_AUTO_NORMAL);
glDisable(GL_CULL_FACE);
glDisable(GL_TEXTURE_2D);
glDisable(GL_LIGHTING);
drawPickingMode();
glReadPixels(X,viewport[3]-Y,1,1,GL_RGB,GL_UNSIGNED_BYTE,(void *)pixel);
r=pixel[0];
v=pixel[1];
printf("&%d,%d&\t%d\t%d\n",X,Y,r,v);
glRenderMode (GL_RENDER);
}
void click(int button, int state, int x, int y)
{
if ((button == GLUT_LEFT_BUTTON) && (state == GLUT_DOWN))
{
X=x;Y=y;
selectionmode();
}
else return;
}
void display(void)
{
glClearColor(0.0F,0.0F,0.0F,0.0F) ;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
dessinerboules();
if (r==1)
{
glPushMatrix();
glTranslatef(1.75,-1.8,-0.10);
glMaterialfv(GL_FRONT,GL_DIFFUSE,blanc);
glutSolidSphere(0.1,10000,10000);
glPopMatrix();
}
glFlush();
glutSwapBuffers();
}
int main(int argc, char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
glutInitWindowPosition(0,0);
glutInitWindowSize(700,700);
glutCreateWindow("MasterMind");
init();
glutReshapeFunc(changeSize);
glutDisplayFunc(display);
glutMouseFunc(click);
glutMainLoop();
return(0);
}
je travaille sous windows vista
Merci