float -> GLdouble for better compliance...

This commit is contained in:
Paolo Cignoni 2013-12-12 21:09:22 +00:00
parent 88c8bcb293
commit 94540d3ca6
1 changed files with 74 additions and 74 deletions

View File

@ -67,91 +67,91 @@ namespace vcg
template <class TO_PICK_CONT_TYPE> template <class TO_PICK_CONT_TYPE>
int Pick( const int & x, const int &y, int Pick( const int & x, const int &y,
TO_PICK_CONT_TYPE &m, TO_PICK_CONT_TYPE &m,
std::vector<typename TO_PICK_CONT_TYPE::value_type*> &result, std::vector<typename TO_PICK_CONT_TYPE::value_type*> &result,
void (draw_func)(typename TO_PICK_CONT_TYPE::value_type &), void (draw_func)(typename TO_PICK_CONT_TYPE::value_type &),
int width=4, int width=4,
int height=4) int height=4)
{ {
result.clear(); result.clear();
long hits; long hits;
int sz = int(m.size())*5; int sz = int(m.size())*5;
GLuint *selectBuf =new GLuint[sz]; GLuint *selectBuf =new GLuint[sz];
glSelectBuffer(sz, selectBuf); glSelectBuffer(sz, selectBuf);
glRenderMode(GL_SELECT); glRenderMode(GL_SELECT);
glInitNames(); glInitNames();
/* Because LoadName() won't work with no names on the stack */ /* Because LoadName() won't work with no names on the stack */
glPushName(-1); glPushName(-1);
double mp[16]; double mp[16];
GLint viewport[4]; GLint viewport[4];
glGetIntegerv(GL_VIEWPORT,viewport); glGetIntegerv(GL_VIEWPORT,viewport);
glPushAttrib(GL_TRANSFORM_BIT); glPushAttrib(GL_TRANSFORM_BIT);
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glGetDoublev(GL_PROJECTION_MATRIX ,mp); glGetDoublev(GL_PROJECTION_MATRIX ,mp);
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();
//gluPickMatrix(x, viewport[3]-y, 4, 4, viewport); //gluPickMatrix(x, viewport[3]-y, 4, 4, viewport);
gluPickMatrix(x, y, width, height, viewport); gluPickMatrix(x, y, width, height, viewport);
glMultMatrixd(mp); glMultMatrixd(mp);
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glPushMatrix(); glPushMatrix();
int cnt=0; int cnt=0;
typename TO_PICK_CONT_TYPE::iterator ei; typename TO_PICK_CONT_TYPE::iterator ei;
for(ei=m.begin();ei!=m.end();++ei) for(ei=m.begin();ei!=m.end();++ei)
{ {
glLoadName(cnt); glLoadName(cnt);
draw_func(*ei); draw_func(*ei);
cnt++; cnt++;
} }
glPopMatrix(); glPopMatrix();
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glPopMatrix(); glPopMatrix();
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
hits = glRenderMode(GL_RENDER); hits = glRenderMode(GL_RENDER);
if (hits <= 0) return 0; if (hits <= 0) return 0;
std::vector< std::pair<double,unsigned int> > H; std::vector< std::pair<double,unsigned int> > H;
for(int ii=0;ii<hits;ii++){ for(int ii=0;ii<hits;ii++){
H.push_back( std::pair<double,unsigned int>(selectBuf[ii*4+1]/4294967295.0,selectBuf[ii*4+3])); H.push_back( std::pair<double,unsigned int>(selectBuf[ii*4+1]/4294967295.0,selectBuf[ii*4+3]));
} }
std::sort(H.begin(),H.end()); std::sort(H.begin(),H.end());
result.resize(H.size()); result.resize(H.size());
for(int ii=0;ii<hits;ii++){ for(int ii=0;ii<hits;ii++){
typename TO_PICK_CONT_TYPE::iterator ei=m.begin(); typename TO_PICK_CONT_TYPE::iterator ei=m.begin();
std::advance(ei ,H[ii].second); std::advance(ei ,H[ii].second);
result[ii]=&*ei; result[ii]=&*ei;
} }
glPopAttrib(); glPopAttrib();
delete [] selectBuf; delete [] selectBuf;
return int(result.size()); return int(result.size());
} }
// 10/2/06 Slightly changed the interface. // 10/2/06 Slightly changed the interface.
// Return value is used to determine if the picked point was against the far plane // Return value is used to determine if the picked point was against the far plane
// (and therefore nothing was picked) // (and therefore nothing was picked)
template <class PointType> template <class PointType>
bool Pick(const int & x, const int &y, PointType &pp){ bool Pick(const int & x, const int &y, PointType &pp){
double res[3]; GLdouble res[3];
GLdouble mm[16],pm[16]; GLint vp[4]; GLdouble mm[16],pm[16]; GLint vp[4];
glGetDoublev(GL_MODELVIEW_MATRIX,mm); glGetDoublev(GL_MODELVIEW_MATRIX,mm);
glGetDoublev(GL_PROJECTION_MATRIX,pm); glGetDoublev(GL_PROJECTION_MATRIX,pm);
glGetIntegerv(GL_VIEWPORT,vp); glGetIntegerv(GL_VIEWPORT,vp);
float pix; GLfloat pix;
glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&pix); glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&pix);
GLfloat depthrange[2]={0,0}; GLfloat depthrange[2]={0,0};
glGetFloatv(GL_DEPTH_RANGE,depthrange); glGetFloatv(GL_DEPTH_RANGE,depthrange);
if(pix==depthrange[1]) return false; if(pix==depthrange[1]) return false;
gluUnProject(x,y,pix,mm,pm,vp,&res[0],&res[1],&res[2]); gluUnProject(x,y,pix,mm,pm,vp,&res[0],&res[1],&res[2]);
pp=PointType (res[0],res[1],res[2]); pp=PointType (res[0],res[1],res[2]);
return true; return true;
} }
} // end namespace } // end namespace