Salve a tutti spero mi possiate aiutare!
Il problema è che quando clicco su un oggetto il sistema me lo riconosce solo che seleziona qualunque oggetto che sta all'interno della scena visibile...
Ecco il codice:
codice:
void list_hits(GLint hits, GLuint *names){ /**
* Per ogni tocco sono allocati 4 bytes
* Scrivo per comodità in realtà non mi serve più avanti questo abiliterà la luce direzionale
* sull'oggetto
*/
for (int i = 1; i < hits; ++i){
printf("Numero di click: %d\n"
"Min Z: %d\n"
"Max Z: %d\n"
"Oggetto cliccato: %d\n",
(GLubyte)names[i * 4],
(GLubyte)names[i * 4 + 1],
(GLubyte)names[i * 4 + 2],
(GLubyte)names[i * 4 + 3]
);
printf("\n");
/*if((GLubyte)names[i * 4 + 3] == 11 && click1 == false) {
click1 = true;
}else if((GLubyte)names[i * 4 + 3] == 11 && click1 == true) click1 = false; //sta roba mi abilita il tasto premuto*/
}
}
void gl_select(int x, int y){
GLuint buff[64] = {0};
GLint hits, view[4];
//Questo sceglie il buffer dove verranno inseriti i valori
glSelectBuffer(64, buff);
//Questo prende informazioni sulla viewport
glGetIntegerv(GL_VIEWPORT, view);
glRenderMode(GL_SELECT);
// Da l'avvio per inizializzare i nomi
glInitNames();
glPushName(0);
//Questo mi restringe l'area di selezione attorno al cursore
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluPickMatrix(x, (view[3] - y), 3.0f, 3.0f, view);
gluPerspective(45.0f, (view[2] - view[0]) / (view[3] - view[1]), 0.1f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glutSwapBuffers();
display();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
//Questo mi dice quanti sono gli oggetti scritti nell'area
hits = glRenderMode(GL_RENDER);
//Scrive gli oggetti nella lista
list_hits(hits, buff);
glMatrixMode(GL_MODELVIEW);
}
/**
* Callback per la gestione dei click del mouse
*/
void processMouse(int button, int state, int x, int y) {
if ((button == GLUT_LEFT_BUTTON) && (state == GLUT_DOWN)){
gl_select(x,SH-y);
}
}
Questa è la display:
codice:
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
cameraMov();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLdouble ratio = static_cast<GLdouble>(width) / static_cast<GLdouble>(height);
gluPerspective(45, //angolo di visuale
ratio, //aspect ratio (rapporto tra larghezza e altezza)
1, //Z near cutting plane
1000); //Z far cutting plane
glMatrixMode(GL_MODELVIEW);
creaPavimento();
creaDome();
if(click1){
glutSolidSphere(0.4, 20, 20);
}
glFlush();
glutSwapBuffers();
}