void G308_Geometry::stopPicking() { glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glFlush(); hits = glRenderMode(GL_RENDER); //printf(" Back to render, %d hits ", hits); if (hits != 0){ processHits2(hits,selectBuf,0); } else sel_vrt=-1; // clear clicks }
void TPinterface::performPicking2(int x, int y) { // Sets the buffer to be used for selection and activate selection mode glSelectBuffer (BUFSIZE, selectBuf); glRenderMode(GL_SELECT); // Initialize the picking name stack glInitNames(); // The process of picking manipulates the projection matrix // so we will be activating, saving and manipulating it glMatrixMode(GL_PROJECTION); //store current projmatrix to restore easily in the end with a pop glPushMatrix (); //get the actual projection matrix values on an array of our own to multiply with pick matrix later GLfloat projmat[16]; glGetFloatv(GL_PROJECTION_MATRIX,projmat); // reset projection matrix glLoadIdentity(); // get current viewport and use it as reference for // setting a small picking window of 5x5 pixels around mouse coordinates for picking GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); // this is multiplied in the projection matrix gluPickMatrix ((GLdouble) x, (GLdouble) (CGFapplication::height - y), 5.0, 5.0, viewport); // multiply the projection matrix stored in our array to ensure same conditions as in normal render glMultMatrixf(projmat); // force scene drawing under this mode // only the names of objects that fall in the 5x5 window will actually be stored in the buffer scene->display(); // restore original projection matrix glMatrixMode (GL_PROJECTION); glPopMatrix (); glFlush(); // revert to render mode, get the picking results and process them GLint hits; hits = glRenderMode(GL_RENDER); processHits2(hits, selectBuf); }