Added Colorizing to principal curvature filter

This commit is contained in:
Paolo Cignoni cignoni 2012-12-10 09:54:26 +00:00
parent 986bd8395e
commit 2bf2a13398
2 changed files with 78 additions and 58 deletions

View File

@ -231,36 +231,36 @@ break;
}
case CP_DISCRETE_CURVATURE:
{
m.updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_VERTCURV);
m.updateDataMask(MeshModel::MM_VERTCOLOR | MeshModel::MM_VERTQUALITY);
tri::UpdateFlags<CMeshO>::FaceBorderFromFF(m.cm);
{
m.updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_VERTCURV);
m.updateDataMask(MeshModel::MM_VERTCOLOR | MeshModel::MM_VERTQUALITY);
tri::UpdateFlags<CMeshO>::FaceBorderFromFF(m.cm);
if ( tri::Clean<CMeshO>::CountNonManifoldEdgeFF(m.cm) > 0) {
errorMessage = "Mesh has some not 2-manifold faces, Curvature computation requires manifoldness"; // text
return false; // can't continue, mesh can't be processed
}
int delvert=tri::Clean<CMeshO>::RemoveUnreferencedVertex(m.cm);
if(delvert) Log("Pre-Curvature Cleaning: Removed %d unreferenced vertices",delvert);
tri::Allocator<CMeshO>::CompactVertexVector(m.cm);
tri::UpdateCurvature<CMeshO>::MeanAndGaussian(m.cm);
int curvType = par.getEnum("CurvatureType");
switch(curvType){
case 0: tri::UpdateQuality<CMeshO>::VertexFromMeanCurvature(m.cm); Log( "Computed Mean Curvature"); break;
case 1: tri::UpdateQuality<CMeshO>::VertexFromGaussianCurvature(m.cm); Log( "Computed Gaussian Curvature"); break;
case 2: tri::UpdateQuality<CMeshO>::VertexFromRMSCurvature(m.cm); Log( "Computed RMS Curvature"); break;
case 3: tri::UpdateQuality<CMeshO>::VertexFromAbsoluteCurvature(m.cm); Log( "Computed ABS Curvature"); break;
default : assert(0);
}
Histogramf H;
tri::Stat<CMeshO>::ComputePerVertexQualityHistogram(m.cm,H);
tri::UpdateColor<CMeshO>::PerVertexQualityRamp(m.cm,H.Percentile(0.1f),H.Percentile(0.9f));
Log( "Curvature Range: %f %f (Used 90 percentile %f %f) ",H.MinV(),H.MaxV(),H.Percentile(0.1f),H.Percentile(0.9f));
break;
}
if ( tri::Clean<CMeshO>::CountNonManifoldEdgeFF(m.cm) > 0) {
errorMessage = "Mesh has some not 2-manifold faces, Curvature computation requires manifoldness"; // text
return false; // can't continue, mesh can't be processed
}
int delvert=tri::Clean<CMeshO>::RemoveUnreferencedVertex(m.cm);
if(delvert) Log("Pre-Curvature Cleaning: Removed %d unreferenced vertices",delvert);
tri::Allocator<CMeshO>::CompactVertexVector(m.cm);
tri::UpdateCurvature<CMeshO>::MeanAndGaussian(m.cm);
int curvType = par.getEnum("CurvatureType");
switch(curvType){
case 0: tri::UpdateQuality<CMeshO>::VertexFromMeanCurvatureHG(m.cm); Log( "Computed Mean Curvature"); break;
case 1: tri::UpdateQuality<CMeshO>::VertexFromGaussianCurvatureHG(m.cm); Log( "Computed Gaussian Curvature"); break;
case 2: tri::UpdateQuality<CMeshO>::VertexFromRMSCurvature(m.cm); Log( "Computed RMS Curvature"); break;
case 3: tri::UpdateQuality<CMeshO>::VertexFromAbsoluteCurvature(m.cm); Log( "Computed ABS Curvature"); break;
default : assert(0);
}
Histogramf H;
tri::Stat<CMeshO>::ComputePerVertexQualityHistogram(m.cm,H);
tri::UpdateColor<CMeshO>::PerVertexQualityRamp(m.cm,H.Percentile(0.1f),H.Percentile(0.9f));
Log( "Curvature Range: %f %f (Used 90 percentile %f %f) ",H.MinV(),H.MaxV(),H.Percentile(0.1f),H.Percentile(0.9f));
break;
}
case CP_TRIANGLE_QUALITY:
{
m.updateDataMask(MeshModel::MM_FACECOLOR | MeshModel::MM_FACEQUALITY);
@ -402,9 +402,10 @@ MeshFilterInterface::FilterClass ExtraMeshColorizePlugin::getClass(QAction *a){
case CP_SATURATE_QUALITY:
case CP_CLAMP_QUALITY:
return MeshFilterInterface::Quality;
case CP_DISCRETE_CURVATURE:
return FilterClass(Normal + VertexColoring);
case CP_MAP_VQUALITY_INTO_COLOR:
case CP_DISCRETE_CURVATURE:
case CP_COLOR_NON_TOPO_COHERENT:
case CP_VERTEX_SMOOTH:
case CP_FACE_TO_VERTEX:

View File

@ -107,7 +107,7 @@ ExtraMeshFilterPlugin::FilterClass ExtraMeshFilterPlugin::getClass(QAction * a)
case FP_REMOVE_UNREFERENCED_VERTEX :
case FP_REMOVE_DUPLICATED_VERTEX :return MeshFilterInterface::Cleaning;
case FP_SELECT_FACES_BY_AREA :
case FP_SELECT_FACES_BY_EDGE : return MeshFilterInterface::FilterClass(MeshFilterInterface::Cleaning + MeshFilterInterface::Selection);
case FP_SELECT_FACES_BY_EDGE : return FilterClass(Cleaning + Selection);
case FP_BUTTERFLY_SS :
case FP_LOOP_SS :
@ -123,14 +123,13 @@ ExtraMeshFilterPlugin::FilterClass ExtraMeshFilterPlugin::getClass(QAction * a)
case FP_REFINE_HALF_CATMULL :
case FP_QUAD_DOMINANT :
case FP_MAKE_PURE_TRI :
case FP_QUAD_PAIRING :return MeshFilterInterface::FilterClass(MeshFilterInterface::Remeshing+MeshFilterInterface::Polygonal);
case FP_QUAD_PAIRING :return FilterClass(Remeshing+Polygonal);
case FP_NORMAL_EXTRAPOLATION : return MeshFilterInterface::FilterClass( MeshFilterInterface::Normal + MeshFilterInterface::PointSet );
case FP_NORMAL_SMOOTH_POINTCLOUD : return MeshFilterInterface::FilterClass( MeshFilterInterface::Normal + MeshFilterInterface::PointSet );
case FP_NORMAL_EXTRAPOLATION : return FilterClass( Normal + PointSet );
case FP_NORMAL_SMOOTH_POINTCLOUD : return FilterClass( Normal + PointSet );
case FP_INVERT_FACES :
case FP_REORIENT :
case FP_COMPUTE_PRINC_CURV_DIR :
case FP_ROTATE :
case FP_ROTATE_FIT :
case FP_CENTER :
@ -138,8 +137,10 @@ ExtraMeshFilterPlugin::FilterClass ExtraMeshFilterPlugin::getClass(QAction * a)
case FP_PRINCIPAL_AXIS :
case FP_FLIP_AND_SWAP : return MeshFilterInterface::Normal;
case FP_COMPUTE_PRINC_CURV_DIR : return FilterClass( Normal + VertexColoring );
case FP_FREEZE_TRANSFORM :
case FP_RESET_TRANSFORM : return FilterClass(MeshFilterInterface::Normal + MeshFilterInterface::Layer);
case FP_RESET_TRANSFORM : return FilterClass(Normal + Layer);
case FP_SLICE_WITH_A_PLANE : return MeshFilterInterface::Measure;
case FP_CYLINDER_UNWRAP : return MeshFilterInterface::Smoothing;
@ -328,7 +329,10 @@ void ExtraMeshFilterPlugin::initParameterSet(QAction * action, MeshModel & m, Ri
methods.push_back("Normal Cycles");
methods.push_back("Pseudoinverse Quadric Fitting");
parlst.addParam(new RichEnum("Method", 3, methods, tr("Method:"), tr("Choose a method")));
parlst.addParam(new RichEnum("CurvatureType", 0, QStringList()<<"Mean Curvature"<<"Gaussian Curvature"<<"None", tr("Color Mapping"),
QString("Choose the curvature that is mapped into quality and visualized as per vertex color.")));
parlst.addParam(new RichBool("Autoclean",true,"Remove Unreferenced Vertices","If selected, before starting the filter will remove anyy unreference vertex (for which curvature values are not defined)"));
break;
case FP_QUADRIC_SIMPLIFICATION:
@ -1207,28 +1211,43 @@ bool ExtraMeshFilterPlugin::applyFilter(QAction * filter, MeshDocument & md, Ric
} break;
case FP_COMPUTE_PRINC_CURV_DIR:
{
m.updateDataMask(MeshModel::MM_VERTFACETOPO | MeshModel::MM_FACEFACETOPO);
m.updateDataMask(MeshModel::MM_VERTCURV | MeshModel::MM_VERTCURVDIR);
if ( tri::Clean<CMeshO>::CountNonManifoldEdgeFF(m.cm) >0 ) {
errorMessage = "Mesh has some not 2-manifold faces, cannot compute principal curvature directions"; // text
return false; // can't continue, mesh can't be processed
}
tri::UpdateNormal<CMeshO>::NormalizePerVertex(m.cm);
if(par.getBool("Autoclean")){
int delvert=tri::Clean<CMeshO>::RemoveUnreferencedVertex(m.cm);
tri::Allocator<CMeshO>::CompactVertexVector(m.cm);
Log( "Removed %d unreferenced vertices",delvert);
}
switch(par.getEnum("Method")){
case 0: tri::UpdateCurvature<CMeshO>::PrincipalDirections(m.cm); break;
case 1: tri::UpdateCurvature<CMeshO>::PrincipalDirectionsPCA(m.cm,m.cm.bbox.Diag()/20.0,true,cb); break;
case 2: tri::UpdateCurvature<CMeshO>::PrincipalDirectionsNormalCycle(m.cm); break;
case 3: tri::UpdateCurvatureFitting<CMeshO>::computeCurvature(m.cm); break;
default:assert(0);break;
}
} break;
case FP_COMPUTE_PRINC_CURV_DIR:
{
m.updateDataMask(MeshModel::MM_VERTFACETOPO | MeshModel::MM_FACEFACETOPO);
m.updateDataMask(MeshModel::MM_VERTCURV | MeshModel::MM_VERTCURVDIR);
m.updateDataMask(MeshModel::MM_VERTCOLOR | MeshModel::MM_VERTQUALITY);
if ( tri::Clean<CMeshO>::CountNonManifoldEdgeFF(m.cm) >0 ) {
errorMessage = "Mesh has some not 2-manifold faces, cannot compute principal curvature directions"; // text
return false; // can't continue, mesh can't be processed
}
tri::UpdateNormal<CMeshO>::NormalizePerVertex(m.cm);
if(par.getBool("Autoclean")){
int delvert=tri::Clean<CMeshO>::RemoveUnreferencedVertex(m.cm);
tri::Allocator<CMeshO>::CompactVertexVector(m.cm);
Log( "Removed %d unreferenced vertices",delvert);
}
switch(par.getEnum("Method")){
case 0: tri::UpdateCurvature<CMeshO>::PrincipalDirections(m.cm); break;
case 1: tri::UpdateCurvature<CMeshO>::PrincipalDirectionsPCA(m.cm,m.cm.bbox.Diag()/20.0,true,cb); break;
case 2: tri::UpdateCurvature<CMeshO>::PrincipalDirectionsNormalCycle(m.cm); break;
case 3: tri::UpdateCurvatureFitting<CMeshO>::computeCurvature(m.cm); break;
default:assert(0);break;
}
switch(par.getEnum("CurvatureType"))
{
case 0: tri::UpdateQuality<CMeshO>::VertexFromMeanCurvatureDir (m.cm); break;
case 1: tri::UpdateQuality<CMeshO>::VertexFromGaussianCurvatureDir(m.cm); break;
case 2: tri::UpdateQuality<CMeshO>::VertexFromGaussianCurvatureDir(m.cm); break;
}
Histogramf H;
tri::Stat<CMeshO>::ComputePerVertexQualityHistogram(m.cm,H);
if(par.getEnum("CurvatureType")!=2)
tri::UpdateColor<CMeshO>::PerVertexQualityRamp(m.cm,H.Percentile(0.1f),H.Percentile(0.9f));
Log( "Curvature Range: %f %f (Used 90 percentile %f %f) ",H.MinV(),H.MaxV(),H.Percentile(0.1f),H.Percentile(0.9f));
} break;
case FP_CLOSE_HOLES:
{