diff --git a/src/meshlabplugins/filter_colorize/meshcolorize.cpp b/src/meshlabplugins/filter_colorize/meshcolorize.cpp index fef462bd4..b0b5458c8 100644 --- a/src/meshlabplugins/filter_colorize/meshcolorize.cpp +++ b/src/meshlabplugins/filter_colorize/meshcolorize.cpp @@ -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::FaceBorderFromFF(m.cm); + { + m.updateDataMask(MeshModel::MM_FACEFACETOPO | MeshModel::MM_VERTCURV); + m.updateDataMask(MeshModel::MM_VERTCOLOR | MeshModel::MM_VERTQUALITY); + tri::UpdateFlags::FaceBorderFromFF(m.cm); - if ( tri::Clean::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::RemoveUnreferencedVertex(m.cm); - if(delvert) Log("Pre-Curvature Cleaning: Removed %d unreferenced vertices",delvert); - tri::Allocator::CompactVertexVector(m.cm); - tri::UpdateCurvature::MeanAndGaussian(m.cm); - int curvType = par.getEnum("CurvatureType"); - - switch(curvType){ - case 0: tri::UpdateQuality::VertexFromMeanCurvature(m.cm); Log( "Computed Mean Curvature"); break; - case 1: tri::UpdateQuality::VertexFromGaussianCurvature(m.cm); Log( "Computed Gaussian Curvature"); break; - case 2: tri::UpdateQuality::VertexFromRMSCurvature(m.cm); Log( "Computed RMS Curvature"); break; - case 3: tri::UpdateQuality::VertexFromAbsoluteCurvature(m.cm); Log( "Computed ABS Curvature"); break; - default : assert(0); - } - - Histogramf H; - tri::Stat::ComputePerVertexQualityHistogram(m.cm,H); - tri::UpdateColor::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::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::RemoveUnreferencedVertex(m.cm); + if(delvert) Log("Pre-Curvature Cleaning: Removed %d unreferenced vertices",delvert); + tri::Allocator::CompactVertexVector(m.cm); + tri::UpdateCurvature::MeanAndGaussian(m.cm); + int curvType = par.getEnum("CurvatureType"); + + switch(curvType){ + case 0: tri::UpdateQuality::VertexFromMeanCurvatureHG(m.cm); Log( "Computed Mean Curvature"); break; + case 1: tri::UpdateQuality::VertexFromGaussianCurvatureHG(m.cm); Log( "Computed Gaussian Curvature"); break; + case 2: tri::UpdateQuality::VertexFromRMSCurvature(m.cm); Log( "Computed RMS Curvature"); break; + case 3: tri::UpdateQuality::VertexFromAbsoluteCurvature(m.cm); Log( "Computed ABS Curvature"); break; + default : assert(0); + } + + Histogramf H; + tri::Stat::ComputePerVertexQualityHistogram(m.cm,H); + tri::UpdateColor::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: diff --git a/src/meshlabplugins/filter_meshing/meshfilter.cpp b/src/meshlabplugins/filter_meshing/meshfilter.cpp index 1719bf480..74d476bfe 100644 --- a/src/meshlabplugins/filter_meshing/meshfilter.cpp +++ b/src/meshlabplugins/filter_meshing/meshfilter.cpp @@ -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::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::NormalizePerVertex(m.cm); - if(par.getBool("Autoclean")){ - int delvert=tri::Clean::RemoveUnreferencedVertex(m.cm); - tri::Allocator::CompactVertexVector(m.cm); - Log( "Removed %d unreferenced vertices",delvert); - } - switch(par.getEnum("Method")){ - case 0: tri::UpdateCurvature::PrincipalDirections(m.cm); break; - case 1: tri::UpdateCurvature::PrincipalDirectionsPCA(m.cm,m.cm.bbox.Diag()/20.0,true,cb); break; - case 2: tri::UpdateCurvature::PrincipalDirectionsNormalCycle(m.cm); break; - case 3: tri::UpdateCurvatureFitting::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::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::NormalizePerVertex(m.cm); + if(par.getBool("Autoclean")){ + int delvert=tri::Clean::RemoveUnreferencedVertex(m.cm); + tri::Allocator::CompactVertexVector(m.cm); + Log( "Removed %d unreferenced vertices",delvert); + } + switch(par.getEnum("Method")){ + case 0: tri::UpdateCurvature::PrincipalDirections(m.cm); break; + case 1: tri::UpdateCurvature::PrincipalDirectionsPCA(m.cm,m.cm.bbox.Diag()/20.0,true,cb); break; + case 2: tri::UpdateCurvature::PrincipalDirectionsNormalCycle(m.cm); break; + case 3: tri::UpdateCurvatureFitting::computeCurvature(m.cm); break; + default:assert(0);break; + } + switch(par.getEnum("CurvatureType")) + { + case 0: tri::UpdateQuality::VertexFromMeanCurvatureDir (m.cm); break; + case 1: tri::UpdateQuality::VertexFromGaussianCurvatureDir(m.cm); break; + case 2: tri::UpdateQuality::VertexFromGaussianCurvatureDir(m.cm); break; + } + + Histogramf H; + tri::Stat::ComputePerVertexQualityHistogram(m.cm,H); + if(par.getEnum("CurvatureType")!=2) + tri::UpdateColor::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: {