#ifndef GL_FIELD #define GL_FIELD #include namespace vcg{ template class GLField { typedef typename MeshType::FaceType FaceType; typedef typename MeshType::VertexType VertexType; typedef typename MeshType::CoordType CoordType; typedef typename MeshType::ScalarType ScalarType; static void GLDrawField(CoordType dir[4], CoordType center, ScalarType &size, bool oneside=false) { ScalarType size1=size; ScalarType size2=size; if (oneside)size2=0; glLineWidth(2); vcg::glColor(vcg::Color4b(0,0,255,255)); glBegin(GL_LINES); glVertex(center+dir[0]*size1); glVertex(center-dir[0]*size2); glEnd(); glLineWidth(2); vcg::glColor(vcg::Color4b(0,255,0,255)); glBegin(GL_LINES); glVertex(center+dir[1]*size1); glVertex(center-dir[1]*size2); glEnd(); } ///draw the cross field of a given face static void GLDrawFaceField(const FaceType &f, ScalarType &size, bool oneside=false) { CoordType center=(f.cP0(0)+f.cP0(1)+f.cP0(2))/3; CoordType normal=f.cN(); CoordType dir[4]; vcg::tri::CrossField::CrossVector(f,dir); GLDrawField(dir,center,size,oneside); } // static void GLDrawFaceSeams(const FaceType &f, // vcg::Point3 seams, // vcg::Color4b seamCol[3]) // { // glLineWidth(2); // glBegin(GL_LINES); // for (int i=0;i<3;i++) // { // if (!seams[i])continue; // vcg::glColor(seamCol[i]); // glVertex(f.V0(i)->P()); // glVertex(f.V1(i)->P()); // } // glEnd(); // } static void GLDrawVertField(const MeshType &mesh, const VertexType &v, ScalarType &size) { CoordType center=v.cP(); CoordType normal=v.cN(); CoordType dir[4]; vcg::tri::CrossField::CrossVector(v,dir); GLDrawField(dir,center,size); } public: static void GLDrawFaceField(const MeshType &mesh, ScalarType scale=0.002, bool oneside=false) { glPushAttrib(GL_ALL_ATTRIB_BITS); glDepthRange(0.0,0.9999); glEnable(GL_COLOR_MATERIAL); glDisable(GL_LIGHTING); glDisable(GL_BLEND); ScalarType size=mesh.bbox.Diag()*scale; for (unsigned int i=0;i