diff --git a/wrap/gl/pick.h b/wrap/gl/pick.h index 17de430d..339f9e08 100644 --- a/wrap/gl/pick.h +++ b/wrap/gl/pick.h @@ -42,7 +42,7 @@ static bool PickNearestTetra(int x, int y,TETRA_MESH_TYPE &m, TetraIterator &ti, { std::vector<TetraPointer> result; int val=PickTetra(x,y,m,result,width,height); - if(val) + if(val!=0) { ti=result[0]; return true; @@ -128,5 +128,97 @@ static int PickTetra(int x, int y, TETRA_MESH_TYPE &m, std::vector<TetraPointer> return result.size(); } +static bool PickNearestTetraFace(int x, int y,TETRA_MESH_TYPE &m, TetraIterator &ti,int &face,int width=4, int height=4) +{ + std::vector<std::pair<TetraPointer,int> > result; + int val=PickTetraFace(x,y,m,result,width,height); + if(val!=0) + { + ti=result[0].first; + face=result[0].second; + return true; + } + ti=0; + face=-1; + return false; +} + +static int PickTetraFace(int x, int y, TETRA_MESH_TYPE &m, std::vector<std::pair<TetraPointer,int> > &result, int width=4, int height=4) +{ + result.clear(); + long hits; + int sz=(m.tetra.size()*4)*5; + unsigned int *selectBuf =new unsigned int[sz]; + // static unsigned int selectBuf[16384]; + glSelectBuffer(sz, selectBuf); + glRenderMode(GL_SELECT); + glInitNames(); + + /* Because LoadName() won't work with no names on the stack */ + glPushName(-1); + double mp[16]; + + int viewport[4]; + glGetIntegerv(GL_VIEWPORT,viewport); + glMatrixMode(GL_PROJECTION); + glGetDoublev(GL_PROJECTION_MATRIX ,mp); + glPushMatrix(); + glLoadIdentity(); + //gluPickMatrix(x, viewport[3]-y, 4, 4, viewport); + gluPickMatrix(x, y, width, height, viewport); + glMultMatrixd(mp); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + int tetracnt=0; + TetraIterator ti; + VertexType *v0; + VertexType *v1; + VertexType *v2; + int face; + for(ti=m.tetra.begin();ti!=m.tetra.end();++ti) + { + if(!(*ti).IsD()) + { + for (face=0;face<4;face++){ + v0=ti->V(Tetra::VofF(face,0)); + v1=ti->V(Tetra::VofF(face,1)); + v2=ti->V(Tetra::VofF(face,2)); + glLoadName(tetracnt); + glBegin(GL_TRIANGLES); + glVertex(v0->P()); + glVertex(v1->P()); + glVertex(v2->P()); + glEnd(); + tetracnt++; + } + } + } + + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + hits = glRenderMode(GL_RENDER); + //xstring buf; + //if (hits <= 0) return 0; + std::vector< std::pair<double,unsigned int> > H; + for(int ii=0;ii<hits;ii++){ + //TRACE("%ui %ui %ui %ui\n",selectBuf[ii*4],selectBuf[ii*4+1],selectBuf[ii*4+2],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()); +// if(H.size()>0) TRACE("\n Closest is %i\n",H[0].second); + result.resize(H.size()); + for(ii=0;ii<hits;ii++){ + TetraIterator ti=m.tetra.begin(); + int index=H[ii].second; + advance(ti ,(int)(index/4)); + result[ii]=std::pair<TetraPointer,int>(&*ti,index%4); + } + + delete [] selectBuf; + return result.size(); +} + }; }