minimal ply tetra importer and tetragl (immediate mode)

This commit is contained in:
T.Alderighi 2018-05-14 20:01:43 +02:00
parent fb0684974a
commit 85f3a5fad5
3 changed files with 984 additions and 1125 deletions

View File

@ -19,443 +19,455 @@
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * * GNU General Public License (http://www.gnu.org/licenses/gpl.txt) *
* for more details. * * for more details. *
* * * *
****************************************************************************/ ****************************************************************************/
#ifndef __GLWRAPTETRA__ #ifndef __GLWRAPTETRA__
#define __GLWRAPTETRA__ #define __GLWRAPTETRA__
#include <GL/glew.h> #include <GL/glew.h>
#include <GL/GL.h> #include <GL/GL.h>
#include <vcg/space/color4.h> #include <vcg/space/color4.h>
#include <vcg/space/tetra3.h> #include <vcg/space/tetra3.h>
#include <wrap/gui/view.h> #include <wrap/gui/view.h>
#include <wrap/gl/space.h> #include <wrap/gl/space.h>
#include <wrap/gl/math.h> #include <wrap/gl/math.h>
namespace vcg { namespace vcg {
namespace tetra { namespace tetra {
class GLW { class GLW {
public: public:
enum DrawMode {DMNone, DMSmallTetra,DMFlat,DMWire, DMHidden,DMTransparent,DMFlatWire} ; enum DrawMode {DMNone, DMSmallTetra,DMFlat,DMWire, DMHidden,DMTransparent,DMFlatWire} ;
enum NormalMode{NMFlat,NMSmooth, NMUser, NMPerMesh}; enum NormalMode{NMFlat,NMSmooth, NMUser, NMPerMesh};
enum ColorMode {CMNone, CMPerMesh,CMUser,CMPerTetraF,CMPerVertexF,CMPerVertex}; enum ColorMode {CMNone, CMPerMesh,CMUser,CMPerTetra,CMPerVertexF,CMPerVertex};
enum Hint {HShrinkFactor}; enum Hint {HShrinkFactor};
}; };
template <typename CONT_TETRA> template <typename CONT_TETRA>
class GlTetramesh:public GLW{ class GlTetramesh:public GLW{
public: public:
typedef typename CONT_TETRA::value_type TetraType; typedef typename CONT_TETRA::value_type TetraType;
typedef typename TetraType::VertexType VertexType; typedef typename TetraType::VertexType VertexType;
typedef typename VertexType::ScalarType ScalarType; typedef typename VertexType::ScalarType ScalarType;
typedef typename VertexType::CoordType Point3x; typedef typename VertexType::CoordType Point3x;
//subclass for clipping planes //subclass for clipping planes
class ClipPlane class ClipPlane
{ {
private: private:
Point3x D; Point3x D;
Point3x D0; Point3x D0;
GLdouble eqn[4]; GLdouble eqn[4];
vcg::Matrix44<float> TR; vcg::Matrix44<float> TR;
Point3x pp0; Point3x pp0;
Point3x pp1; Point3x pp1;
Point3x pp2; Point3x pp2;
Point3x pp3; Point3x pp3;
public: public:
bool active; bool active;
Point3x P; Point3x P;
ClipPlane (){active=false;} ClipPlane (){active=false;}
~ClipPlane (){} ~ClipPlane (){}
ClipPlane(Point3x p0, Point3x p1,Point3x p2) ClipPlane(Point3x p0, Point3x p1,Point3x p2)
{ {
Point3x N=((p1-p0)^(p2-p0)).Normalize(); Point3x N=((p1-p0)^(p2-p0)).Normalize();
N.Normalize(); N.Normalize();
D=N; D=N;
D0=D; D0=D;
P=(p0+p1+p2)/3.f; P=(p0+p1+p2)/3.f;
Point3x v0=N; Point3x v0=N;
Point3x v1=(P-p0); Point3x v1=(P-p0);
v1.Normalize(); v1.Normalize();
Point3x v2=(v0^v1); Point3x v2=(v0^v1);
v2.Normalize(); v2.Normalize();
v0=v0*2; v0=v0*2;
v1=v1*2; v1=v1*2;
v2=v2*2; v2=v2*2;
pp0=-v1-v2; pp0=-v1-v2;
pp1=-v1+v2; pp1=-v1+v2;
pp2=v1+v2; pp2=v1+v2;
pp3=v1-v2; pp3=v1-v2;
} }
//set normal of the clipping plane //set normal of the clipping plane
void SetD(Point3x d) void SetD(Point3x d)
{ {
D=d; D=d;
} }
//set the point of the clipping plane //set the point of the clipping plane
void SetP(Point3x p) void SetP(Point3x p)
{ {
P=p; P=p;
} }
bool IsClipped(Point3x p)
void GlClip() {
{ return D.V(0) * p.X() + D.V(1) * p.Y() + D.V(2) * p.Z() - vcg::Norm(P) < 0;
if (active){ }
GLdouble d=-(D.V(0)*P.V(0)+D.V(1)*P.V(1)+D.V(2)*P.V(2));
eqn[0]=-D.V(0); void GlClip()
eqn[1]=-D.V(1); {
eqn[2]=-D.V(2); if (active){
eqn[3]=-d; GLdouble d=-(D.V(0)*P.V(0)+D.V(1)*P.V(1)+D.V(2)*P.V(2));
glClipPlane(GL_CLIP_PLANE0, eqn); eqn[0]=-D.V(0);
glEnable(GL_CLIP_PLANE0); eqn[1]=-D.V(1);
} eqn[2]=-D.V(2);
} eqn[3]=-d;
glClipPlane(GL_CLIP_PLANE0, eqn);
void GlDraw() glEnable(GL_CLIP_PLANE0);
{ }
glPushMatrix(); }
glPushAttrib(0xffffffff);
glDisable(GL_CLIP_PLANE0); void GlDraw()
{
glEnable(GL_LIGHTING); glPushMatrix();
glEnable(GL_NORMALIZE); glPushAttrib(0xffffffff);
glDisable(GL_CLIP_PLANE0);
glTranslate(P);
glMultMatrix(TR); glEnable(GL_LIGHTING);
glLineWidth(0.5); glEnable(GL_NORMALIZE);
glColor3d(0.7,0,0.7);
glBegin(GL_LINE_LOOP); glTranslate(P);
glVertex(pp0); glMultMatrix(TR);
glVertex(pp1); glLineWidth(0.5);
glVertex(pp2); glColor3d(0.7,0,0.7);
glVertex(pp3); glBegin(GL_LINE_LOOP);
glEnd(); glVertex(pp0);
glVertex(pp1);
glPopAttrib(); glVertex(pp2);
glPopMatrix(); glVertex(pp3);
glEnd();
}
glPopAttrib();
void Transform(vcg::Matrix44<float> Tr) glPopMatrix();
{ }
//thath's for casting in case of trackball using
//float to double and vice-versa void Transform(vcg::Matrix44<float> Tr)
Point3f p=Point3f((float)D0.V(0),(float)D0.V(1),(float)D0.V(2)); {
TR=Tr; //thath's for casting in case of trackball using
p=TR*p; //float to double and vice-versa
D=Point3x((ScalarType) p.V(0),(ScalarType) p.V(1),(ScalarType) p.V(2)); Point3f p=Point3f((float)D0.V(0),(float)D0.V(1),(float)D0.V(2));
} TR=Tr;
p=TR*p;
void Translate(float L) D=Point3x((ScalarType) p.V(0),(ScalarType) p.V(1),(ScalarType) p.V(2));
{ }
Point3x D1=D*L;
P+=D1; void Translate(float L)
} {
Point3x D1=D*L;
P+=D1;
}; }
GlTetramesh(CONT_TETRA * _t):tetra(_t){}
GlTetramesh( ) {} };
CONT_TETRA * tetra; GlTetramesh(CONT_TETRA * _t):tetra(_t){}
ClipPlane section; GlTetramesh( ) {}
private: CONT_TETRA * tetra;
ScalarType shrink_factor; ClipPlane section;
private:
public: ScalarType shrink_factor = 0.95f;
void SetHint(Hint h, double value){
switch(h){ public:
case HShrinkFactor: shrink_factor = value; break;
} void SetHint(Hint h, double value){
} switch(h){
case HShrinkFactor: shrink_factor = value; break;
void AddClipSection(Point3x p0,Point3x p1,Point3x p2) }
{ }
section=ClipPlane(p0,p1,p2);
section.active=true; void AddClipSection(Point3x p0,Point3x p1,Point3x p2)
} {
section=ClipPlane(p0,p1,p2);
void ClearClipSection() section.active=true;
{ }
section.active=false;
} void ClearClipSection()
{
typedef Color4b (*color_func_vertex)(VertexType&v); section.active=false;
color_func_vertex color_vertex; }
typedef Color4b (*color_func_tetra)(TetraType&v); template <DrawMode dm,NormalMode nm,ColorMode cm >
color_func_tetra color_tetra; void Draw(){
switch (dm){
case DMNone: break;
template <DrawMode dm,NormalMode nm,ColorMode cm > case DMSmallTetra:_DrawSmallTetra<cm>();break;
case DMFlat:_DrawSurface<dm,nm,cm>();break;
void Draw(){ case DMWire:_DrawSurface<dm,nm,cm>();break;
switch (dm){ case DMHidden:_DrawSurface<dm,nm,cm>();break;
case DMNone: break; case DMFlatWire:_DrawFlatWire<nm,cm>(); break;
case DMSmallTetra:_DrawSmallTetra<cm>();break; case DMTransparent:break;
case DMFlat:_DrawSurface<dm,nm,cm>();break; }
case DMWire:_DrawSurface<dm,nm,cm>();break; }
case DMHidden:_DrawSurface<dm,nm,cm>();break;
case DMFlatWire:_DrawFlatWire<nm,cm>(); break; private:
case DMTransparent:break; template <ColorMode cm >
} void _DrawSmallTetra(){
} typename CONT_TETRA::iterator it;
private: // glPushAttrib(0xffff);
template <ColorMode cm > // glEnable(GL_COLOR_MATERIAL);
void _DrawSmallTetra(){ // glEnable(GL_NORMALIZE);
Point3x p[4],br; // glPolygonMode(GL_FRONT, GL_FILL);
typename CONT_TETRA::iterator it; // glLight(GL_LIGHT0, GL_DIFFUSE, vcg::Color4b::White);
glPushAttrib(0xffffffff); // glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL); // glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0); /*glBegin(GL_TRIANGLES);*/
glEnable(GL_LIGHTING); for( it = tetra->begin(); it != tetra->end(); ++it)
glEnable(GL_NORMALIZE); if((!it->IsD())&&(!(it->IsS()))) //draw as normal
glPolygonMode(GL_FRONT,GL_FILL); {
if (section.active) _DrawSmallTetra<cm>(*it);
{ }
section.GlClip(); else
section.GlDraw(); if((!it->IsD())&&((it->IsS())))//draw in selection mode
} {
/*glBegin(GL_TRIANGLES);*/ _DrawSelectedTetra(*it);
for( it = tetra->begin(); it != tetra->end(); ++it) }
if((!it->IsD())&&(!(it->IsS()))) //draw as normal //glEnd();
{ // glPopAttrib();
_DrawSmallTetra<cm>(*it); if (section.active)
} {
else // section.GlClip();
if((!it->IsD())&&((it->IsS())))//draw in selection mode section.GlDraw();
{ }
_DrawSelectedTetra(*it); }
}
//glEnd(); template <NormalMode nm,ColorMode cm >
glPopAttrib(); void _DrawFlatWire(){
} glPushAttrib(0xffff);
glEnable(GL_COLOR_MATERIAL);
template <NormalMode nm,ColorMode cm > glEnable(GL_DEPTH);
void _DrawFlatWire(){ glDepthRange(0.001,1.0);
glPushAttrib(0xffff); Draw<DMFlat,nm,cm>();
glEnable(GL_COLOR_MATERIAL); glDisable(GL_LIGHTING);
glEnable(GL_DEPTH); glColor3f(0.0,0.0,0.0);
glDepthRange(0.001,1.0); glDepthRange(0.0,0.999);
Draw<DMFlat,nm,cm>(); Draw<DMHidden,nm,cm>();
glDisable(GL_LIGHTING); glPopAttrib();
glColor3f(0.0,0.0,0.0); }
glDepthRange(0.0,0.999);
Draw<DMHidden,nm,cm>();
glPopAttrib(); template <DrawMode dm,NormalMode nm,ColorMode cm >
} void _DrawSurface(){
typename CONT_TETRA::iterator it;
template <DrawMode dm,NormalMode nm,ColorMode cm > glPushAttrib(0xffff);
void _DrawSurface(){ glEnable(GL_COLOR_MATERIAL);
typename CONT_TETRA::iterator it; if((dm == DMWire)||(dm ==DMHidden))
{
glPushAttrib(0xffff); glDisable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL); glDisable(GL_NORMALIZE);
if((dm == DMWire)||(dm ==DMHidden)) glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
{ }
glDisable(GL_LIGHTING); else
glDisable(GL_NORMALIZE); {
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glEnable(GL_LIGHT0);
} glEnable(GL_LIGHTING);
else glEnable(GL_NORMALIZE);
{ glPolygonMode(GL_FRONT,GL_FILL);
glEnable(GL_LIGHTING); }
glEnable(GL_NORMALIZE); //glBegin(GL_TRIANGLES);
glPolygonMode(GL_FRONT,GL_FILL); for( it = tetra->begin(); it != tetra->end(); ++it)
} _DrawTetra<dm,nm,cm>((*it));
//glBegin(GL_TRIANGLES); //glEnd();
for( it = tetra->begin(); it != tetra->end(); ++it) glPopAttrib();
_DrawTetra<dm,nm,cm>((*it)); }
//glEnd();
glPopAttrib();
} void _DrawSelectedTetra(TetraType &t)
{
glPushMatrix();
void _DrawSelectedTetra(TetraType &t) glPushAttrib(0xffff);
{ glDisable(GL_CLIP_PLANE0);
glPushMatrix(); glDisable(GL_BLEND);
glPushAttrib(0xffff); glDisable(GL_LIGHTING);
glDisable(GL_CLIP_PLANE0); glDisable(GL_NORMALIZE);
glDisable(GL_BLEND); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glDisable(GL_LIGHTING);
glDisable(GL_NORMALIZE); glColor3d(1,0,0);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glBegin(GL_TRIANGLES);
glColor3d(1,0,0); for (int face=0;face<4;face++)
{
glBegin(GL_TRIANGLES); glVertex(t.V(Tetra::VofF(face,0))->P());
for (int face=0;face<4;face++) glVertex(t.V(Tetra::VofF(face,1))->P());
{ glVertex(t.V(Tetra::VofF(face,2))->P());
glVertex(t.V(Tetra::VofF(face,0))->P()); }
glVertex(t.V(Tetra::VofF(face,1))->P()); glEnd();
glVertex(t.V(Tetra::VofF(face,2))->P());
} //end drawing
glEnd(); glPopAttrib();
glPopMatrix();
//end drawing }
glPopAttrib();
glPopMatrix(); template <DrawMode dm,NormalMode nm,ColorMode cm >
} void _DrawTetra(TetraType &t)
{
template <DrawMode dm,NormalMode nm,ColorMode cm > if((!t.IsD())&&(!t.IsS()))
void _DrawTetra(TetraType &t) {
{ if ((dm!=DMWire)&&(dm!=DMHidden))
if((!t.IsD())&&(!t.IsS())) _ChooseColorTetra<cm>(t);
{ for(int i = 0; i < 4; ++i){
if ((dm!=DMWire)&&(dm!=DMHidden)) if (dm == DMWire)
_ChooseColorTetra<cm>(t); _DrawFace<cm>(t,i);
for(int i = 0; i < 4; ++i){ else
if (dm == DMWire) {
_DrawFace<cm>(t,i); if (t.IsBorderF(i))
else {
{ if(nm==NMSmooth)
if (t.IsBorderF(i)) _DrawFaceSmooth<cm>(t,i);
{ else
if(nm==NMSmooth) if(nm==NMFlat)
_DrawFaceSmooth<cm>(t,i); _DrawFace<cm>(t,i);
else }
if(nm==NMFlat) }
_DrawFace<cm>(t,i); }
} }
} else
} if((!t.IsD())&&(t.IsS()))
} _DrawSelectedTetra(t);
else }
if((!t.IsD())&&(t.IsS()))
_DrawSelectedTetra(t); template <ColorMode cm >
} void _ChooseColorTetra(TetraType &t)
{
template <ColorMode cm > if (cm==CMNone)
void _ChooseColorTetra(TetraType &t) {
{ if (t.IsS())
if (cm==CMNone) glColor3d(1,0,0);
{ else
if (t.IsS()) glColor3d(0.8f,0.8f,0.8f);
glColor3d(1,0,0); }
else if (cm == CMPerTetra)
glColor3d(0.8f,0.8f,0.8f); vcg::glColor(t.C());
} // else
else // if(cm == CMPerTetraF)
if(cm == CMPerTetraF) // {
{ // Color4b c;
Color4b c; // c = color_tetra(t);
c = color_tetra(t); // GLint ic[4]; ic[0] = c[0];ic[1] = c[1];ic[2] = c[2];ic[3] = c[3];
GLint ic[4]; ic[0] = c[0];ic[1] = c[1];ic[2] = c[2];ic[3] = c[3]; // glMaterialiv(GL_FRONT,GL_DIFFUSE ,ic);
glMaterialiv(GL_FRONT,GL_DIFFUSE ,ic); // }
} }
}
template <ColorMode cm >
template <ColorMode cm > void _ChooseColorVertex(VertexType &v)
void _ChooseColorVertex(VertexType &v) {
{ if (cm!=CMNone)
if (cm!=CMNone) {
{ // if(cm == CMPerVertexF)
if(cm == CMPerVertexF) // {
{ // Color4b c;
Color4b c; // c = color_vertex(v);
c = color_vertex(v); // GLint ic[4]; ic[0] = c[0];ic[1] = c[1];ic[2] = c[2];ic[3] = c[3];
GLint ic[4]; ic[0] = c[0];ic[1] = c[1];ic[2] = c[2];ic[3] = c[3]; // glMaterialiv(GL_FRONT,GL_DIFFUSE ,ic);
glMaterialiv(GL_FRONT,GL_DIFFUSE ,ic); // }
} // else
else if(cm == CMPerVertex)
if(cm == CMPerVertex) vcg::glColor(v.C());
glColor3f(v.C()[0],v.C()[1],v.C()[2]); }
} }
}
template <ColorMode cm >
template <ColorMode cm > void _DrawFaceSmooth(TetraType &t,int face)
void _DrawFaceSmooth(TetraType &t,int face) {
{
VertexType *v0=t.V(Tetra::VofF(face,0));
VertexType *v0=t.V(Tetra::VofF(face,0)); VertexType *v1=t.V(Tetra::VofF(face,1));
VertexType *v1=t.V(Tetra::VofF(face,1)); VertexType *v2=t.V(Tetra::VofF(face,2));
VertexType *v2=t.V(Tetra::VofF(face,2));
glBegin(GL_TRIANGLES);
glBegin(GL_TRIANGLES); _ChooseColorVertex<cm>(*v0);
_ChooseColorVertex<cm>(*v0); glNormal(v0->N());
glNormal(v0->N()); glVertex(v0->P());
glVertex(v0->P()); _ChooseColorVertex<cm>(*v1);
_ChooseColorVertex<cm>(*v1); glNormal(v1->N());
glNormal(v1->N()); glVertex(v1->P());
glVertex(v1->P()); _ChooseColorVertex<cm>(*v2);
_ChooseColorVertex<cm>(*v2); glNormal(v2->N());
glNormal(v2->N()); glVertex(v2->P());
glVertex(v2->P()); glEnd();
glEnd(); }
}
template < ColorMode cm >
template <ColorMode cm > void _DrawFace(TetraType &t,int face)
void _DrawFace(TetraType &t,int face) {
{ glBegin(GL_TRIANGLES);
glBegin(GL_TRIANGLES); VertexType *v0=t.V(Tetra::VofF(face,0));
glNormal(t.N(face)); VertexType *v1=t.V(Tetra::VofF(face,1));
VertexType *v0=t.V(Tetra::VofF(face,0)); VertexType *v2=t.V(Tetra::VofF(face,2));
VertexType *v1=t.V(Tetra::VofF(face,1)); glNormal(vcg::Normal(v0->P(), v1->P(), v2->P()).normalized());
VertexType *v2=t.V(Tetra::VofF(face,2)); _ChooseColorVertex<cm>(*v0);
_ChooseColorVertex<cm>(*v0); glVertex(v0->P());
glVertex(v0->P()); _ChooseColorVertex<cm>(*v1);
_ChooseColorVertex<cm>(*v1); glVertex(v1->P());
glVertex(v1->P()); _ChooseColorVertex<cm>(*v2);
_ChooseColorVertex<cm>(*v2); glVertex(v2->P());
glVertex(v2->P()); glEnd();
glEnd(); }
}
template < ColorMode cm >
template <ColorMode cm > void _DrawSmallTetra(TetraType &t)
void _DrawSmallTetra(TetraType &t) {
{ Point3x p[4], br;
Tetra3<ScalarType> T=Tetra3<ScalarType>(); br = Tetra::Barycenter(t);
T.P0(0)=t.V(0)->cP(); if (section.IsClipped(br))
T.P1(0)=t.V(1)->cP(); return;
T.P2(0)=t.V(2)->cP(); bool border = false;
T.P3(0)=t.V(3)->cP(); bool clipBorder = false;
Point3x p[4], br; for (int i = 0; i < 4; ++i)
br=T.ComputeBarycenter(); {
for(int i = 0; i < 4; ++i) border = border || t.IsB(i);
p[i] = t.V(i)->P()* shrink_factor + br *(1- shrink_factor);
_ChooseColorTetra<cm>(t); Point3x br1 = Tetra::Barycenter(*t.TTp(i));
clipBorder = clipBorder || section.IsClipped(br1);
glBegin(GL_TRIANGLES); }
for(int i = 0; i < 4; ++i)
{ if (!border && !clipBorder)
glNormal(t.N(i)); return;
VertexType *v0=t.V(Tetra::VofF(i,0));
VertexType *v1=t.V(Tetra::VofF(i,1)); for(int i = 0; i < 4; ++i)
VertexType *v2=t.V(Tetra::VofF(i,2)); p[i] = t.V(i)->P() * shrink_factor + br * (1 - shrink_factor);
_ChooseColorVertex<cm>(*v0);
glVertex(p[Tetra::VofF(i,0)]);
_ChooseColorVertex<cm>(*v1); _ChooseColorTetra<cm>(t);
glVertex(p[Tetra::VofF(i,1)]);
_ChooseColorVertex<cm>(*v2); glBegin(GL_TRIANGLES);
glVertex(p[Tetra::VofF(i,2)]); for(int i = 0; i < 4; ++i)
} {
glEnd(); VertexType *v0=t.V(Tetra::VofF(i,0));
} VertexType *v1=t.V(Tetra::VofF(i,1));
VertexType *v2=t.V(Tetra::VofF(i,2));
};
glNormal(vcg::Normal(v0->P(), v1->P(), v2->P()).normalized());
} // end namespace tetra
} // end nemaspace tri _ChooseColorVertex<cm>(*v0);
#endif glVertex(p[Tetra::VofF(i,0)]);
_ChooseColorVertex<cm>(*v1);
glVertex(p[Tetra::VofF(i,1)]);
_ChooseColorVertex<cm>(*v2);
glVertex(p[Tetra::VofF(i,2)]);
}
glEnd();
}
};
} // end namespace tetra
} // end nemaspace tri
#endif

View File

@ -354,7 +354,7 @@ public:
fprintf(fpout,"%d ",vp->Flags()); fprintf(fpout,"%d ",vp->Flags());
if( HasPerVertexColor(m) && (pi.mask & Mask::IOM_VERTCOLOR) ) if( HasPerVertexColor(m) && (pi.mask & Mask::IOM_VERTCOLOR) )
fprintf(fpout,"%d %d %d %d ",vp->C()[0],vp->C()[1],vp->C()[2],vp->C()[3] ); fprintf(fpout,"%d %d %d %d ",vp->C()[0], vp->C()[1], vp->C()[2], vp->C()[3] );
if( HasPerVertexQuality(m) && (pi.mask & Mask::IOM_VERTQUALITY) ) if( HasPerVertexQuality(m) && (pi.mask & Mask::IOM_VERTQUALITY) )
fprintf(fpout,"%g ",vp->Q()); fprintf(fpout,"%g ",vp->Q());

File diff suppressed because it is too large Load Diff