Added PickVertSW to offer an alternative for selection for hw that does not support opengl selection

This commit is contained in:
Paolo Cignoni 2014-04-07 12:32:21 +00:00
parent b87832a022
commit adfa6dde12
1 changed files with 273 additions and 225 deletions

View File

@ -60,6 +60,54 @@ public:
fi=NULL;
return false;
}
static Point3f Proj(const Eigen::Matrix4f &M, const float * viewport, Point3f &p)
{
const float vx=viewport[0];
const float vy=viewport[1];
const float vw2=viewport[2]/2.0f;
const float vh2=viewport[3]/2.0f;
Eigen::Vector4f vp(p[0],p[1],p[2],1.0f);
Eigen::Vector4f vpp = M*vp;
Eigen::Vector4f ndc = vpp/vpp[3];
Point3f sc(
vw2*ndc[0] + vx+vw2,
vh2*ndc[1] + vy+vh2,
ndc[2]
);
return sc;
}
static int PickVertSW(int x, int y, MESH_TYPE &m, std::vector<VertexPointer> &result, int width=4, int height=4,bool sorted=true)
{
result.clear();
Eigen::Matrix4d mp,mm;
Eigen::Matrix4f M;
GLint viewport[4];
Box2f reg;
reg.Add(Point2f(x-width/2.0f,y-height/2.0f));
reg.Add(Point2f(x+width/2.0f,y+height/2.0f));
glGetIntegerv(GL_VIEWPORT,viewport);
float viewportF[4];
for(int i=0;i<4;++i) viewportF[i]=viewport[i];
glGetDoublev(GL_PROJECTION_MATRIX ,mp.data());
glGetDoublev(GL_MODELVIEW_MATRIX,mm.data());
M = (mp*mm).cast<float>();
for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi)if(!vi->IsD())
{
Point3f pp = Proj(M,viewportF,vi->P());
if(pp[0]<reg.min[0]) continue;
if(pp[0]>reg.max[0]) continue;
if(pp[1]<reg.min[1]) continue;
if(pp[1]>reg.max[1]) continue;
result.push_back(&*vi);
}
return result.size();
}
static int PickVert(int x, int y, MESH_TYPE &m, std::vector<VertexPointer> &result, int width=4, int height=4,bool sorted=true)
{
result.clear();