Bene, allora siamo un passo più avanti. La funzione glLoadName(id); andrà comunque caricarla nella tua funzione dove organizzi il rendering della scena OpenGL, più o meno così:
codice:
for(i = 0 ; i < nObj; i++)
{
glPushMatrix();
glTranslated(obj[i].pos.x, obj[i].pos.y, obj[i].pos.z);
glPushName(obj[i].id); // Nota A*
obj[i].RenderObj(&obj[i]); // Nota B*
glPopName();
glPopMatrix();
}
Nota A: Non confonderei l'indice dell'oggetto con il suo identificativo.
Nota B: Userei un puntatore a funzione per renderizzare l'oggetto (anche non necessario).
codice:
typedef struct
{
GLdouble x,y,z;
} Posit;
typedef struct
{
GLint id;
Posit pos;
void (*RenderObj)(GLint, void*); // Rendering procedure.
} Obj;
Obj objects[nObj];
Nel codice di renderizzazione dell'oggetto inserirei la gestione della selezione:
codice:
void RenderSphere(void *pobj)
{
if (pobj->id == selected) glColor3f(1.0, 1.0, 0.0);
else glColor3f(0.2, 0.0, 0.8);
auxSolidSphere(1.0);
}
Per assegnare la funzione di renderizzazione alla procedura, all'inizializzazione della vista:
obj[0].RenderObj = RenderSphere;
All'evento del mouse:
GLint selected;
selected = HitTest(pt.x, pt.y);
Fai alcune prove poi facci sapere ...