//----------------------------------------------------------------------------- // pick() -- Perform for select/pick operation; returns the selected (picked) // graphic or zero(0) if nothing was selected. // // 1) When item == 0, returns nearest (by depth buffer) selected entry. // 2) When item < 0, returns furthest (by depth buffer) selected entry. // 3) When item > 0, returns the item'th selected entry or the first entry if // there are less than 'item' entries // 4) Returns zero(0) when there are no entries in the select buffer or if the // Graphic for the select ID is not found. //----------------------------------------------------------------------------- BasicGL::Graphic* GlutDisplay::pick(const int item) { GLint viewport[4]; glGetIntegerv(GL_VIEWPORT,viewport); // make sure we are starting at 0, 0 int xm = 0, ym = 0; getMouse(&xm,&ym); int x = xm; int y = viewport[3] - ym; glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluPickMatrix(x, y, getPickWidth(), getPickHeight(), viewport); // Get our ortho parameters GLdouble oLeft(0), oRight(0), oBottom(0), oTop(0), oNear(0), oFar(0); getOrtho(oLeft, oRight, oBottom, oTop, oNear, oFar); glOrtho(oLeft, oRight, oBottom, oTop, oNear, oFar); glMatrixMode(GL_MODELVIEW); if (getDisplayOrientation() != NORMAL) { glPushMatrix(); if (getDisplayOrientation() == CW90) glRotated(-90.0, 0.0, 0.0, 1.0); else if (getDisplayOrientation() == CCW90) glRotated(90.0, 0.0, 0.0, 1.0); else glRotated(180.0, 0.0, 0.0, 1.0); } static const unsigned int MAX_BUFF_SIZE = 1024; GLuint sbuff[MAX_BUFF_SIZE]; clearSelectBuffer(sbuff,MAX_BUFF_SIZE); glSelectBuffer(MAX_BUFF_SIZE, sbuff); glRenderMode(GL_SELECT); glInitNames(); draw(); GLint hits = glRenderMode(GL_RENDER); if (getDisplayOrientation() != NORMAL) glPopMatrix(); Graphic* selected = findSelected(hits, sbuff, item); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); return selected; }
BasicGL::Graphic* FoxDisplay::pick(const int mouseX, const int mouseY, const int item) { GLint viewport[4]; // get our canvas and make it current getCanvas()->makeCurrent(); //glGetIntegerv(GL_VIEWPORT,viewport); getViewport(&viewport[0], &viewport[1], &viewport[2], &viewport[3]); int x = mouseX; int y = mouseY; glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluPickMatrix(x, y, 10, 10, viewport); GLdouble tl = 0, tr = 0, tb = 0, tt = 0, tn = 0, tf = 0; getOrtho(tl, tr, tb, tt, tn, tf); glOrtho(tl, tr, tb, tt, tn, tf); //std::cout << "viewport is " << viewport[2] << " " << viewport[3] << std::endl; glMatrixMode(GL_MODELVIEW); GLuint sbuff[100]; clearSelectBuffer(sbuff,100); glSelectBuffer(100, sbuff); glRenderMode(GL_SELECT); draw(); glRenderMode(GL_RENDER); printSelectBuffer(sbuff,100); Graphic* selected = findSelected(sbuff,100,item); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); getCanvas()->makeNonCurrent(); return selected; }