float -> GLdouble for better compliance...
This commit is contained in:
parent
88c8bcb293
commit
94540d3ca6
|
@ -1,4 +1,4 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* VCGLib o o *
|
* VCGLib o o *
|
||||||
* Visual and Computer Graphics Library o o *
|
* Visual and Computer Graphics Library o o *
|
||||||
|
@ -9,7 +9,7 @@
|
||||||
* \ *
|
* \ *
|
||||||
* All rights reserved. *
|
* All rights reserved. *
|
||||||
* *
|
* *
|
||||||
* This program is free software; you can redistribute it and/or modify *
|
* This program is free software; you can redistribute it and/or modify *
|
||||||
* it under the terms of the GNU General Public License as published by *
|
* it under the terms of the GNU General Public License as published by *
|
||||||
* the Free Software Foundation; either version 2 of the License, or *
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
* (at your option) any later version. *
|
* (at your option) any later version. *
|
||||||
|
@ -66,92 +66,92 @@ 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;
|
|
||||||
std::vector< std::pair<double,unsigned int> > H;
|
|
||||||
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]));
|
|
||||||
}
|
|
||||||
std::sort(H.begin(),H.end());
|
|
||||||
|
|
||||||
result.resize(H.size());
|
if (hits <= 0) return 0;
|
||||||
for(int ii=0;ii<hits;ii++){
|
std::vector< std::pair<double,unsigned int> > H;
|
||||||
typename TO_PICK_CONT_TYPE::iterator ei=m.begin();
|
for(int ii=0;ii<hits;ii++){
|
||||||
std::advance(ei ,H[ii].second);
|
H.push_back( std::pair<double,unsigned int>(selectBuf[ii*4+1]/4294967295.0,selectBuf[ii*4+3]));
|
||||||
result[ii]=&*ei;
|
}
|
||||||
}
|
std::sort(H.begin(),H.end());
|
||||||
glPopAttrib();
|
|
||||||
delete [] selectBuf;
|
|
||||||
return int(result.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
// 10/2/06 Slightly changed the interface.
|
result.resize(H.size());
|
||||||
// Return value is used to determine if the picked point was against the far plane
|
for(int ii=0;ii<hits;ii++){
|
||||||
|
typename TO_PICK_CONT_TYPE::iterator ei=m.begin();
|
||||||
|
std::advance(ei ,H[ii].second);
|
||||||
|
result[ii]=&*ei;
|
||||||
|
}
|
||||||
|
glPopAttrib();
|
||||||
|
delete [] selectBuf;
|
||||||
|
return int(result.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 10/2/06 Slightly changed the interface.
|
||||||
|
// 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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue