The programm I wrote draws the planet earth. This sphere is constructed as icosahedron (12 faces) containing 12 pentagons and loads of hexagons.
Before I draw a pentagon or a hexagon I pass a token via glPassthrough in order to recognize later on the selected element - of coz outside glBegin, glEnd.
Unfortunately the feedback-result does not work. Without Feedbackmode I see exactly just a piece of the whole globe. But as soons as I am in Feedback Mode and I select an element the feddbackbuffer simply contains the elements
in the same order as they were put in.
when the planet is draw the tokens are 1 2 3 4 5 6 7 8 9 etc.
when elements are selected i would expect for
example just 7, 8 and 9 but instead I get the full list from 1 2 3 4 5 6 etc.
I already spent ages on that topic - If somebody has a hint - thanks!
//################################################################################
// MY PROBLEM ! !
//################################################################################
void vOrbit::checkHits( int x, int y )
{
GLfloat feedbackBuf[BUFSIZE];
GLint size;
GLint viewport[4];
GLdouble matrix[16];
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glGetIntegerv( GL_VIEWPORT, viewport );
glGetDoublev( GL_PROJECTION_MATRIX, matrix );
glRenderMode( GL_FEEDBACK );
glMatrixMode( GL_PROJECTION );
glPushMatrix();
glLoadIdentity();
gluPickMatrix( (double)x, (double)(viewport[3]-y), 200.0, 200.0, viewport );
gluPerspective(45.0, (GLfloat)viewport[3]/(GLfloat)viewport[2] ,1.0, 200.0);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glSetCamera();
planeta.drawPlanet(-1); // glCallList(glList);
glMatrixMode(GL_PROJECTION);
glPopMatrix(); // Projection Matrix
glMatrixMode(GL_MODELVIEW);
size = glRenderMode( GL_RENDER );
cout << "! vOrbit::checkHits() size = " << size << " at (x,y)=(" << x << ", " << y << ")." << endl;
if (size!=0) proces****s( size, feedbackBuf );
glutSwapBuffers();
}
//################################################################################
void vOrbit: roces****s( int size, GLfloat *buffer )
{
int count;
GLfloat token=0.0;
GLfloat *ptr = buffer;
int i=0;
int flag=0;
Vector3<float> r,p;
if (size==-1) size=BUFSIZE;
count=size;
while (count>0)
{
token=buffer[size-count]; count--;
if (token==GL_PASS_THROUGH_TOKEN)
{
cout << "* vOrbit: [img]http://www.opengl.org/discussion_boards/ubb/tongue.gif[/img]roces****s() Pass_Through_Token = " << buffer[size-count] << endl;
count--;
}
else if (token==GL_POLYGON_TOKEN)
{
i= (int)buffer[size-count]; count--;
cout << "* vOrbit: [img]http://www.opengl.org/discussion_boards/ubb/tongue.gif[/img]roces****s() POLYGON = " << token << " Number = " << i << endl;
while(i && (count>0))
{
cout << "* vOrbit: [img]http://www.opengl.org/discussion_boards/ubb/tongue.gif[/img]roces****s() (x,y,z,count)=(" << buffer[size-count] << ", "
<< buffer[size-count+1] << ", " << buffer[size-count+2] << ", " << count << " )." << endl;
count-=3;
i--;
}
}
else
{
cout << "* vOrbit: [img]http://www.opengl.org/discussion_boards/ubb/tongue.gif[/img]roces****s() Unknown Token found: " << token << endl;
return;
}
}
}
. . .
//################################################################################
// Position Camera in the scene with variables zoom, xrot,yrot and zrot
//################################################################################
void vOrbit::glSetCamera( void )
{
glLoadIdentity();
glTranslatef( 0.0, 0.0, zoom );
glRotatef(xRot, 1.0, 0.0, 0.0 );
glRotatef(yRot, 0.0, 1.0, 0.0 );
glRotatef(zRot, 0.0 , 0.0 , 1.0 );
}
//################################################################################
void vOrbit::glDisplay( )
{
//cout << “vOrbit::glDisplay()” << flush << endl;
glShadeModel( GL_SMOOTH );
glClear(GL_COLOR_BUFFER_BIT);
glSetCamera();
glBegin (GL_LINES);
glColor3f(1.0, 0.0, 0.0);
glVertex3f(-10.0, 0.0, 0.0);
glVertex3f( 10.0, 0.0, 0.0);
glColor3f(0.0, 1.0, 0.0);
glVertex3f( 0.0, 0.0,-10.0);
glVertex3f( 0.0, 0.0, 10.0);
glColor3f(0.0, 0.0, 1.0);
glVertex3f( 0.0,-10.0, 0.0);
glVertex3f( 0.0, 10.0, 0.0);
glEnd();
if (glList<0)
{
glList=glGenLists(1);
planeta.drawPlanet(glList);
}
glCallList(glList);
glutSwapBuffers();
}
. . .
. . .
//################################################################################
void vOrbit::glMouse(int button, int state, int x, int y)
{ . . .
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
checkHits(x,y);
. . .
}
//################################################################################
void vOrbit::glReshape( int width, int height )
{
GLfloat h = (GLfloat) width / (GLfloat) height;
glViewport( 0, 0, width, height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective(45.0, h ,1.0, 200.0);
glMatrixMode( GL_MODELVIEW );
}
//################################################################################
//
//################################################################################
void vOrbit::glInit( void )
{
GLfloat pos0[] = { 20.0, 20.0, 100.0 };
GLfloat specular0[] = { 0.5, 0.5, 0.5, 0.15 };
GLfloat shininess0[]= { 10.0, 10.0, 10.0 };
GLfloat diffuse0[] = { 0.5, 0.5, 0.5, 0.5 };
glClearColor (0.0, 0.0, 0.5, 1.0);
glLightModelf( GL_LIGHT_MODEL_LOCAL_VIEWER, GL_LIGHT_MODEL_AMBIENT);
glLightfv(GL_LIGHT0, GL_POSITION, pos0);
glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse0);
glMaterialfv(GL_FRONT, GL_SPECULAR, specular0 );
glMaterialfv(GL_FRONT, GL_SHININESS, shininess0);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glPolygonMode(GL_FRONT, GL_FILL);
glEnable(GL_DITHER);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glCullFace(GL_BACK);
glFrontFace(GL_CCW);
glEnable(GL_CULL_FACE);
glDisable(GL_ALPHA_TEST);
glDisable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColorMaterial(GL_FRONT, GL_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
glEnable( GL_DEPTH_TEST );
}
//################################################################################
void vOrbit::glReset( void )
{
glLightModelf( GL_LIGHT_MODEL_LOCAL_VIEWER, GL_LIGHT_MODEL_AMBIENT);
glInit();
}