From 03f41fd1175ead7f1a9751323641e9474159e1e0 Mon Sep 17 00:00:00 2001 From: nico Date: Mon, 23 Jan 2017 16:20:22 +0100 Subject: [PATCH] restructured a bit the code --- wrap/gl/gl_field.h | 110 ++++++++++++++++++++++++++++----------------- 1 file changed, 69 insertions(+), 41 deletions(-) diff --git a/wrap/gl/gl_field.h b/wrap/gl/gl_field.h index 121d9ae4..f48f0530 100644 --- a/wrap/gl/gl_field.h +++ b/wrap/gl/gl_field.h @@ -18,59 +18,86 @@ class GLField public: static void GLDrawField(CoordType dir[4], - CoordType center, - ScalarType &size, - bool onlyPD1=false, - bool oneside=false) - { - ScalarType size1=size; - ScalarType size2=size; - if (oneside)size2=0; + const CoordType ¢er, + const ScalarType &size, + const ScalarType &Width0, + const ScalarType &Width1, + const vcg::Color4b &Color0, + const vcg::Color4b &Color1, + bool oneside, + bool onlyPD1) + { + CoordType dirN[4]; + for (size_t i=0;i<4;i++) + { + dirN[i]=dir[i]; + dirN[i].Normalize(); + } - glLineWidth(2); - //vcg::glColor(vcg::Color4b(0,0,255,255)); - vcg::glColor(vcg::Color4b(0,0,0,255)); + ScalarType size1=size; + if (oneside)size1=0; + + glLineWidth(Width0); + vcg::glColor(Color0); glBegin(GL_LINES); - glVertex(center+dir[0]*size1); - glVertex(center-dir[0]*size2); + glVertex(center+dirN[0]*size); + glVertex(center+dirN[2]*size1); glEnd(); if (onlyPD1)return; - glLineWidth(2); - //vcg::glColor(vcg::Color4b(0,255,0,255)); - vcg::glColor(vcg::Color4b(0,0,0,255)); + + glLineWidth(Width1); + vcg::glColor(Color1); glBegin(GL_LINES); - glVertex(center+dir[1]*size1); - glVertex(center-dir[1]*size2); + glVertex(center+dirN[1]*size); + glVertex(center+dirN[3]*size1); glEnd(); } - ///draw the cross field of a given face in a given position - static void GLDrawSingleFaceField(const FaceType &f, - CoordType pos, - ScalarType &size, - bool onlyPD1=false, - bool oneside=false) - { - CoordType center=pos; - CoordType normal=f.cN(); - CoordType dir[4]; - vcg::tri::CrossField::CrossVector(f,dir); - GLDrawField(dir,center,size,onlyPD1,oneside); - } +// ///draw the cross field of a given face in a given position +// static void GLDrawSingleFaceField(const FaceType &f, +// CoordType pos, +// ScalarType &size, +// bool onlyPD1, +// bool oneside) +// { +// CoordType center=pos; +// CoordType normal=f.cN(); +// CoordType dir[4]; +// vcg::tri::CrossField::CrossVector(f,dir); +// GLDrawField(dir,center,size,onlyPD1,oneside); +// } ///draw the cross field of a given face static void GLDrawSingleFaceField(const FaceType &f, - ScalarType &size, - bool onlyPD1=false, - bool oneside=false) + const ScalarType &size, + const bool oneside, + const bool onlyPD1, + const ScalarType maxN) { CoordType center=(f.cP(0)+f.cP(1)+f.cP(2))/3; CoordType normal=f.cN(); CoordType dir[4]; vcg::tri::CrossField::CrossVector(f,dir); - GLDrawField(dir,center,size,onlyPD1,oneside); + + if (maxN<=0) + GLDrawField(dir,center,size,2,2,vcg::Color4b(0,0,0,255),vcg::Color4b(0,0,0,255),oneside,onlyPD1); + else + { + ScalarType Norm0=dir[0].Norm(); + ScalarType Norm1=dir[1].Norm(); + ScalarType MaxW=6; + ScalarType MinW=0.5; + ScalarType IntervW=MaxW-MinW; + if (Norm0>maxN)Norm0=maxN; + if (Norm1>maxN)Norm1=maxN; + vcg::Color4b Col0=vcg::Color4b::ColorRamp(0,maxN,Norm0); + vcg::Color4b Col1=vcg::Color4b::ColorRamp(0,maxN,Norm1); + ScalarType W0=(Norm0/maxN)*IntervW+MinW; + ScalarType W1=(Norm1/maxN)*IntervW+MinW; + GLDrawField(dir,center,size,W0,W1,Col0,Col1,oneside,onlyPD1); + } } // static void GLDrawFaceSeams(const FaceType &f, @@ -97,14 +124,15 @@ public: CoordType normal=v.cN(); CoordType dir[4]; vcg::tri::CrossField::CrossVector(v,dir); - GLDrawField(dir,center,size); + GLDrawField(dir,center,size,2,2,vcg::Color4b(0,0,0,255),vcg::Color4b(0,0,0,255),false,false); } static void GLDrawFaceField(const MeshType &mesh, - bool onlyPD1=false, - bool oneside=false, - ScalarType scale=0.002) + bool onlyPD1, + bool oneside, + ScalarType GlobalScale=0.002, + const ScalarType maxN=0) { glPushAttrib(GL_ALL_ATTRIB_BITS); @@ -112,11 +140,11 @@ public: glEnable(GL_COLOR_MATERIAL); glDisable(GL_LIGHTING); glDisable(GL_BLEND); - ScalarType size=mesh.bbox.Diag()*scale; + ScalarType size=mesh.bbox.Diag()*GlobalScale; for (unsigned int i=0;i