From 44fa0efe414cac066aee5e256cf6c0288ae64bc7 Mon Sep 17 00:00:00 2001 From: Paolo Cignoni cignoni Date: Sun, 2 May 2010 02:15:26 +0000 Subject: [PATCH] Colorize plugin Quality->Color was working only for vertex quality, not for face. I split the quality mapper plugin in two components: face and vertex. Also, I needed to correct the interface.h cehckRequirements which IGNORED requirements expressed for face quality. --- src/common/interfaces.h | 4 +- src/common/meshmodel.h | 78 ++--- .../filter_colorize/meshcolorize.cpp | 299 +++++++++--------- .../filter_colorize/meshcolorize.h | 3 +- 4 files changed, 186 insertions(+), 198 deletions(-) diff --git a/src/common/interfaces.h b/src/common/interfaces.h index 73ef83eaf..86de454d6 100644 --- a/src/common/interfaces.h +++ b/src/common/interfaces.h @@ -315,6 +315,9 @@ public: if (preMask & MeshModel::MM_VERTQUALITY && !m.hasDataMask(MeshModel::MM_VERTQUALITY)) MissingItems.push_back("Vertex Quality"); + if (preMask & MeshModel::MM_FACEQUALITY && !m.hasDataMask(MeshModel::MM_FACEQUALITY)) + MissingItems.push_back("Face Quality"); + if (preMask & MeshModel::MM_WEDGTEXCOORD && !m.hasDataMask(MeshModel::MM_WEDGTEXCOORD)) MissingItems.push_back("Per Wedge Texture Coords"); @@ -499,7 +502,6 @@ public: assert(NULL != md.mm()); return (StartEdit(*(md.mm()), parent)); } - // Called when the user press the second time the button virtual void EndEdit(MeshModel &/*m*/, GLArea * /*parent*/){}; diff --git a/src/common/meshmodel.h b/src/common/meshmodel.h index e97e3a7ad..11222b774 100644 --- a/src/common/meshmodel.h +++ b/src/common/meshmodel.h @@ -148,51 +148,51 @@ public: - to know what elements are required by a filter and therefore should be made ready before starting the filter (e.g. if a - to know what elements are changed by a filter and therefore should be saved/restored in case of dynamic filters with a preview */ - enum MeshElement { - MM_NONE = 0x00000000, - MM_VERTCOORD = 0x00000001, - MM_VERTNORMAL = 0x00000002, - MM_VERTFLAG = 0x00000004, - MM_VERTCOLOR = 0x00000008, - MM_VERTQUALITY = 0x00000010, - MM_VERTMARK = 0x00000020, - MM_VERTFACETOPO = 0x00000040, - MM_VERTCURV = 0x00000080, - MM_VERTCURVDIR = 0x00000100, - MM_VERTRADIUS = 0x00000200, - MM_VERTTEXCOORD = 0x00000400, - MM_VERTNUMBER = 0x00000800, + enum MeshElement{ + MM_NONE = 0x00000000, + MM_VERTCOORD = 0x00000001, + MM_VERTNORMAL = 0x00000002, + MM_VERTFLAG = 0x00000004, + MM_VERTCOLOR = 0x00000008, + MM_VERTQUALITY = 0x00000010, + MM_VERTMARK = 0x00000020, + MM_VERTFACETOPO = 0x00000040, + MM_VERTCURV = 0x00000080, + MM_VERTCURVDIR = 0x00000100, + MM_VERTRADIUS = 0x00000200, + MM_VERTTEXCOORD = 0x00000400, + MM_VERTNUMBER = 0x00000800, - MM_FACEVERT = 0x00001000, - MM_FACENORMAL = 0x00002000, - MM_FACEFLAG = 0x00004000, - MM_FACECOLOR = 0x00008000, - MM_FACEQUALITY = 0x00010000, - MM_FACEMARK = 0x00020000, - MM_FACEFACETOPO = 0x00040000, - MM_FACENUMBER = 0x00080000, + MM_FACEVERT = 0x00001000, + MM_FACENORMAL = 0x00002000, + MM_FACEFLAG = 0x00004000, + MM_FACECOLOR = 0x00008000, + MM_FACEQUALITY = 0x00010000, + MM_FACEMARK = 0x00020000, + MM_FACEFACETOPO = 0x00040000, + MM_FACENUMBER = 0x00080000, - MM_WEDGTEXCOORD = 0x00100000, - MM_WEDGNORMAL = 0x00200000, - MM_WEDGCOLOR = 0x00400000, + MM_WEDGTEXCOORD = 0x00100000, + MM_WEDGNORMAL = 0x00200000, + MM_WEDGCOLOR = 0x00400000, + + MM_UNKNOWN = 0x00800000, - MM_UNKNOWN = 0x00800000, + // SubParts of bits + MM_VERTFLAGSELECT = 0x01000000, + MM_FACEFLAGSELECT = 0x02000000, + // This part should be deprecated. + MM_VERTFLAGBORDER = 0x04000000, + MM_FACEFLAGBORDER = 0x08000000, - // SubParts of bits - MM_VERTFLAGSELECT = 0x01000000, - MM_FACEFLAGSELECT = 0x02000000, - // This part should be deprecated. - MM_VERTFLAGBORDER = 0x04000000, - MM_FACEFLAGBORDER = 0x08000000, - - // Per Mesh Stuff.... - MM_CAMERA = 0x10000000, - MM_TRANSFMATRIX = 0x20000000, - MM_COLOR = 0x40000000, - MM_POLYGONAL = 0x80000000, - MM_ALL = 0xffffffff + // Per Mesh Stuff.... + MM_CAMERA = 0x10000000, + MM_TRANSFMATRIX = 0x20000000, + MM_COLOR = 0x40000000, + MM_POLYGONAL = 0x80000000, + MM_ALL = 0xffffffff }; diff --git a/src/meshlabplugins/filter_colorize/meshcolorize.cpp b/src/meshlabplugins/filter_colorize/meshcolorize.cpp index 1a9cc728e..68a9d160d 100644 --- a/src/meshlabplugins/filter_colorize/meshcolorize.cpp +++ b/src/meshlabplugins/filter_colorize/meshcolorize.cpp @@ -49,7 +49,8 @@ using namespace vcg; ExtraMeshColorizePlugin::ExtraMeshColorizePlugin() { typeList << CP_CLAMP_QUALITY << - CP_MAP_QUALITY_INTO_COLOR << + CP_MAP_VQUALITY_INTO_COLOR << + CP_MAP_FQUALITY_INTO_COLOR << CP_DISCRETE_CURVATURE << CP_TRIANGLE_QUALITY << CP_VERTEX_SMOOTH << @@ -65,118 +66,115 @@ ExtraMeshColorizePlugin::ExtraMeshColorizePlugin() { } QString ExtraMeshColorizePlugin::filterName(FilterIDType c) const{ - switch(c) - { - case CP_CLAMP_QUALITY: return QString("Clamp vertex quality"); - case CP_MAP_QUALITY_INTO_COLOR: return QString("Colorize by Quality"); - case CP_DISCRETE_CURVATURE: return QString("Discrete Curvatures"); - case CP_TRIANGLE_QUALITY: return QString("Per Face Quality according to Triangle shape and aspect ratio"); - case CP_COLOR_NON_TOPO_COHERENT: return QString("Color edges topologically non coherent"); - case CP_VERTEX_SMOOTH: return QString("Smooth: Laplacian Vertex Color"); - case CP_FACE_SMOOTH: return QString("Smooth: Laplacian Face Color"); - case CP_VERTEX_TO_FACE: return QString("Transfer Color: Vertex to Face"); - case CP_FACE_TO_VERTEX: return QString("Transfer Color: Face to Vertex"); - case CP_TEXTURE_TO_VERTEX: return QString("Transfer Color: Texture to Vertex"); - case CP_RANDOM_FACE: return QString("Random Face Color"); - - default: assert(0); + switch(c){ + case CP_CLAMP_QUALITY: return QString("Clamp vertex quality"); + case CP_MAP_VQUALITY_INTO_COLOR: return QString("Colorize by vertex Quality"); + case CP_MAP_FQUALITY_INTO_COLOR: return QString("Colorize by face Quality"); + case CP_DISCRETE_CURVATURE: return QString("Discrete Curvatures"); + case CP_TRIANGLE_QUALITY: return QString("Per Face Quality according to Triangle shape and aspect ratio"); + case CP_COLOR_NON_TOPO_COHERENT: return QString("Color edges topologically non coherent"); + case CP_VERTEX_SMOOTH: return QString("Smooth: Laplacian Vertex Color"); + case CP_FACE_SMOOTH: return QString("Smooth: Laplacian Face Color"); + case CP_VERTEX_TO_FACE: return QString("Transfer Color: Vertex to Face"); + case CP_FACE_TO_VERTEX: return QString("Transfer Color: Face to Vertex"); + case CP_TEXTURE_TO_VERTEX: return QString("Transfer Color: Texture to Vertex"); + case CP_RANDOM_FACE: return QString("Random Face Color"); + default: assert(0); } return QString("error!"); } QString ExtraMeshColorizePlugin::filterInfo(FilterIDType filterId) const { - switch(filterId) - { - case CP_CLAMP_QUALITY: return tr("Clamp quality vertex values to a given range according to specific values or to percentiles"); - case CP_MAP_QUALITY_INTO_COLOR : return tr("Colorize vertex and faces depending on quality field (manually equalized)."); - case CP_DISCRETE_CURVATURE : return tr("Colorize according to various discrete curvature computed as described in:
" - "'Discrete Differential-Geometry Operators for Triangulated 2-Manifolds'
" - "M. Meyer, M. Desbrun, P. Schroder, A. H. Barr"); - case CP_TRIANGLE_QUALITY: return tr("Compute a quality and colorize faces depending on triangle quality:
1: minimum ratio height/edge among the edges
2: ratio between radii of incenter and circumcenter
3: 2*sqrt(a, b)/(a+b), a, b the eigenvalues of M^tM, M transform triangle into equilateral"); - case CP_VERTEX_SMOOTH: return QString("Laplacian Smooth Vertex Color"); - case CP_FACE_SMOOTH: return QString("Laplacian Smooth Face Color"); - case CP_VERTEX_TO_FACE: return QString("Vertex to Face color transfer"); - case CP_FACE_TO_VERTEX: return QString("Face to Vertex color transfer"); - case CP_TEXTURE_TO_VERTEX: return QString("Texture to Vertex color transfer"); - case CP_COLOR_NON_TOPO_COHERENT :return tr("Color edges topologically non coherent."); - case CP_RANDOM_FACE: return QString("Colorize Faces randomly. If internal edges are present they are used"); - - default: assert(0); + switch(filterId){ + case CP_CLAMP_QUALITY: return QString("Clamp quality vertex values to a given range according to specific values or to percentiles"); + case CP_MAP_VQUALITY_INTO_COLOR : return QString("Color vertices depending on their quality field (manually equalized)."); + case CP_MAP_FQUALITY_INTO_COLOR : return QString("Color faces depending on their quality field (manually equalized)."); + case CP_DISCRETE_CURVATURE : return QString("Colorize according to various discrete curvature computed as described in:
" + "'Discrete Differential-Geometry Operators for Triangulated 2-Manifolds'
" + "M. Meyer, M. Desbrun, P. Schroder, A. H. Barr"); + case CP_TRIANGLE_QUALITY: return QString("Compute a quality and colorize faces depending on triangle quality:
" + "1: minimum ratio height/edge among the edges
" + "2: ratio between radii of incenter and circumcenter
" + "3: 2*sqrt(a, b)/(a+b), a, b the eigenvalues of M^tM, M transform triangle into equilateral"); + case CP_VERTEX_SMOOTH: return QString("Laplacian Smooth Vertex Color"); + case CP_FACE_SMOOTH: return QString("Laplacian Smooth Face Color"); + case CP_VERTEX_TO_FACE: return QString("Vertex to Face color transfer"); + case CP_FACE_TO_VERTEX: return QString("Face to Vertex color transfer"); + case CP_TEXTURE_TO_VERTEX: return QString("Texture to Vertex color transfer"); + case CP_COLOR_NON_TOPO_COHERENT : return QString("Color edges topologically non coherent."); + case CP_RANDOM_FACE: return QString("Colorize Faces randomly. If internal edges are present they are used"); + default: assert(0); } - return QString(); } -int ExtraMeshColorizePlugin::getRequirements(QAction *action) -{ - switch(ID(action)) - { - case CP_DISCRETE_CURVATURE: return MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER | MeshModel::MM_VERTCURV; - case CP_TRIANGLE_QUALITY: return MeshModel::MM_FACECOLOR | MeshModel::MM_FACEQUALITY; - case CP_RANDOM_FACE: return MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACECOLOR; - case CP_CLAMP_QUALITY: return 0; - case CP_MAP_QUALITY_INTO_COLOR: return 0; - case CP_VERTEX_SMOOTH: return 0; - case CP_FACE_SMOOTH: return MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACECOLOR ; - case CP_VERTEX_TO_FACE: return MeshModel::MM_FACECOLOR; - case CP_FACE_TO_VERTEX: return MeshModel::MM_VERTCOLOR; - case CP_TEXTURE_TO_VERTEX: return MeshModel::MM_FACECOLOR; - - default: assert(0); +int ExtraMeshColorizePlugin::getRequirements(QAction *action){ + switch(ID(action)){ + case CP_DISCRETE_CURVATURE: return MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACEFLAGBORDER | MeshModel::MM_VERTCURV; + case CP_TRIANGLE_QUALITY: return MeshModel::MM_FACECOLOR | MeshModel::MM_FACEQUALITY; + case CP_RANDOM_FACE: return MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACECOLOR; + case CP_CLAMP_QUALITY: return 0; // TODO: split clamp on vertex & faces and add requirements + case CP_MAP_VQUALITY_INTO_COLOR: return MeshModel::MM_VERTQUALITY; + case CP_MAP_FQUALITY_INTO_COLOR: return MeshModel::MM_FACEQUALITY; + case CP_VERTEX_SMOOTH: return 0; // TODO: should it be MM_NONE? + case CP_FACE_SMOOTH: return MeshModel::MM_FACEFACETOPO | MeshModel::MM_FACECOLOR ; + case CP_VERTEX_TO_FACE: return MeshModel::MM_FACECOLOR; + case CP_FACE_TO_VERTEX: return MeshModel::MM_VERTCOLOR; + case CP_TEXTURE_TO_VERTEX: return MeshModel::MM_FACECOLOR; + default: assert(0); } return 0; } +void ExtraMeshColorizePlugin::initParameterSet(QAction *a, MeshModel &m, RichParameterSet & par){ + // variables cannot be defined within switch statement + QStringList metrics; + QStringList curvNameList; + pair minmax; -void ExtraMeshColorizePlugin::initParameterSet(QAction *a,MeshModel &m, RichParameterSet & par) -{ - switch(ID(a)) - { - case CP_FACE_SMOOTH: - case CP_VERTEX_SMOOTH: - //par.addInt("iteration",1,tr("Iteration"),tr("the number ofiteration of the smoothing algorithm")); - par.addParam(new RichInt("iteration",1,tr("Iteration"),tr("the number ofiteration of the smoothing algorithm"))); - break; - case CP_TRIANGLE_QUALITY: { - QStringList metrics; - metrics.push_back("area/max side"); + switch(ID(a)){ + case CP_FACE_SMOOTH: + case CP_VERTEX_SMOOTH: + par.addParam(new RichInt("iteration",1,QString("Iteration"),QString("the number ofiteration of the smoothing algorithm"))); + break; + case CP_TRIANGLE_QUALITY: + metrics.push_back("area/max side"); metrics.push_back("inradius/circumradius"); metrics.push_back("mean ratio"); par.addParam(new RichEnum("Metric", 0, metrics, tr("Metric:"), tr("Choose a metric to compute triangle quality."))); break; - } - case CP_DISCRETE_CURVATURE: { - QStringList curvNameList; + case CP_DISCRETE_CURVATURE: curvNameList.push_back("Mean Curvature"); curvNameList.push_back("Gaussian Curvature"); curvNameList.push_back("RMS Curvature"); curvNameList.push_back("ABS Curvature"); - par.addParam(new RichEnum("CurvatureType", 0, curvNameList, tr("Type:"), tr("Choose the curvatures. Mean and Gaussian curvature are computed according the technique described in the Desbrun et al. paper.
" - "Absolute curvature is defined as |H|+|K| and RMS curvature as sqrt(4* H^2 - 2K) as explained in
Improved curvature estimation for watershed segmentation of 3-dimensional meshes by S. Pulla, A. Razdan, G. Farin. "))); - break; - } + par.addParam(new RichEnum("CurvatureType", 0, curvNameList, tr("Type:"), + QString("Choose the curvatures. Mean and Gaussian curvature are computed according the technique described in the Desbrun et al. paper.
" + "Absolute curvature is defined as |H|+|K| and RMS curvature as sqrt(4* H^2 - 2K) as explained in
Improved curvature estimation" + "for watershed segmentation of 3-dimensional meshes by S. Pulla, A. Razdan, G. Farin. "))); + break; case CP_CLAMP_QUALITY: - case CP_MAP_QUALITY_INTO_COLOR : - { - pair minmax = tri::Stat::ComputePerVertexQualityMinMax(m.cm); - + case CP_MAP_VQUALITY_INTO_COLOR: + minmax = tri::Stat::ComputePerVertexQualityMinMax(m.cm); par.addParam(new RichFloat("minVal",minmax.first,"Min","The value that will be mapped with the lower end of the scale (blue)")); par.addParam(new RichFloat("maxVal",minmax.second,"Max","The value that will be mapped with the upper end of the scale (red)")); par.addParam(new RichDynamicFloat("perc",0,0,100,"Percentile Crop [0..100]","If not zero this value will be used for a percentile cropping of the quality values.
If this parameter is set to P the value V for which P% of the vertices have a quality lower(greater) than V is used as min (max) value.

The automated percentile cropping is very useful for automatically discarding outliers.")); par.addParam(new RichBool("zeroSym",false,"Zero Simmetric","If true the min max range will be enlarged to be symmertic (so that green is always Zero)")); - } - break; - - default: break; // do not add any parameter for the other filters + break; + case CP_MAP_FQUALITY_INTO_COLOR: + minmax = tri::Stat::ComputePerFaceQualityMinMax(m.cm); + par.addParam(new RichFloat("minVal",minmax.first,"Min","The value that will be mapped with the lower end of the scale (blue)")); + par.addParam(new RichFloat("maxVal",minmax.second,"Max","The value that will be mapped with the upper end of the scale (red)")); + par.addParam(new RichDynamicFloat("perc",0,0,100,"Percentile Crop [0..100]","If not zero this value will be used for a percentile cropping of the quality values.
If this parameter is set to P the value V for which P% of the vertices have a quality lower(greater) than V is used as min (max) value.

The automated percentile cropping is very useful for automatically discarding outliers.")); + par.addParam(new RichBool("zeroSym",false,"Zero Simmetric","If true the min max range will be enlarged to be symmertic (so that green is always Zero)")); + break; } } -bool ExtraMeshColorizePlugin::applyFilter(QAction *filter, MeshDocument &md, RichParameterSet & par, vcg::CallBackPos *cb) -{ +bool ExtraMeshColorizePlugin::applyFilter(QAction *filter, MeshDocument &md, RichParameterSet & par, vcg::CallBackPos *cb){ MeshModel &m=*(md.mm()); switch(ID(filter)) { case CP_CLAMP_QUALITY: - case CP_MAP_QUALITY_INTO_COLOR : - { + case CP_MAP_VQUALITY_INTO_COLOR:{ float RangeMin = par.getFloat("minVal"); float RangeMax = par.getFloat("maxVal"); bool usePerc = par.getDynamicFloat("perc")>0; @@ -310,92 +308,79 @@ bool ExtraMeshColorizePlugin::applyFilter(QAction *filter, MeshDocument &md, Ric return true; } -MeshFilterInterface::FilterClass ExtraMeshColorizePlugin::getClass(QAction *a) -{ - switch(ID(a)) - { - case CP_CLAMP_QUALITY: - return MeshFilterInterface::Quality; - case CP_MAP_QUALITY_INTO_COLOR: - case CP_DISCRETE_CURVATURE: - case CP_COLOR_NON_TOPO_COHERENT: - case CP_VERTEX_SMOOTH: - case CP_FACE_TO_VERTEX: - return MeshFilterInterface::VertexColoring; +MeshFilterInterface::FilterClass ExtraMeshColorizePlugin::getClass(QAction *a){ + switch(ID(a)){ + case CP_CLAMP_QUALITY: + return MeshFilterInterface::Quality; - case CP_TEXTURE_TO_VERTEX: - return MeshFilterInterface::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: + case CP_TEXTURE_TO_VERTEX: + return MeshFilterInterface::VertexColoring; - case CP_TRIANGLE_QUALITY: - return FilterClass(Quality + FaceColoring); + case CP_TRIANGLE_QUALITY: + return FilterClass(Quality + FaceColoring); - case CP_RANDOM_FACE: - case CP_FACE_SMOOTH: - case CP_VERTEX_TO_FACE: - return MeshFilterInterface::FaceColoring; - default: assert(0); - return MeshFilterInterface::Generic; + case CP_RANDOM_FACE: + case CP_FACE_SMOOTH: + case CP_VERTEX_TO_FACE: + case CP_MAP_FQUALITY_INTO_COLOR: + return MeshFilterInterface::FaceColoring; + + default: + assert(0); } } -int ExtraMeshColorizePlugin::getPreConditions(QAction *a) const -{ - switch(ID(a)) - { - case CP_TRIANGLE_QUALITY: - case CP_RANDOM_FACE: - case CP_DISCRETE_CURVATURE: - case CP_COLOR_NON_TOPO_COHERENT: - return MeshModel::MM_FACENUMBER; - - case CP_CLAMP_QUALITY: - case CP_MAP_QUALITY_INTO_COLOR: - return MeshModel::MM_VERTQUALITY; - - case CP_FACE_TO_VERTEX: - case CP_FACE_SMOOTH: - return MeshModel::MM_FACECOLOR; - - case CP_VERTEX_SMOOTH: - case CP_VERTEX_TO_FACE: - return MeshModel::MM_VERTCOLOR; - - case CP_TEXTURE_TO_VERTEX: - - default: assert(0); - } - return MeshModel::MM_NONE; +int ExtraMeshColorizePlugin::getPreConditions(QAction *a) const{ + switch(ID(a)){ + case CP_TRIANGLE_QUALITY: + case CP_RANDOM_FACE: + case CP_DISCRETE_CURVATURE: + case CP_COLOR_NON_TOPO_COHERENT: + return MeshModel::MM_FACENUMBER; + case CP_CLAMP_QUALITY: + case CP_MAP_VQUALITY_INTO_COLOR: + return MeshModel::MM_VERTQUALITY; + case CP_MAP_FQUALITY_INTO_COLOR: + return MeshModel::MM_FACEQUALITY; + case CP_FACE_TO_VERTEX: + case CP_FACE_SMOOTH: + return MeshModel::MM_FACECOLOR; + case CP_VERTEX_SMOOTH: + case CP_VERTEX_TO_FACE: + return MeshModel::MM_VERTCOLOR; + case CP_TEXTURE_TO_VERTEX: + return MeshModel::MM_NONE; // TODO: wrong? compare with original + default: assert(0); + } } -int ExtraMeshColorizePlugin::postCondition( QAction* a ) const -{ - switch(ID(a)) - { - case CP_TRIANGLE_QUALITY: - return MeshModel::MM_FACECOLOR | MeshModel::MM_FACEQUALITY; - - case CP_RANDOM_FACE: - case CP_COLOR_NON_TOPO_COHERENT: - case CP_FACE_SMOOTH: - case CP_VERTEX_TO_FACE: - return MeshModel::MM_FACECOLOR; - case CP_MAP_QUALITY_INTO_COLOR: - case CP_FACE_TO_VERTEX: - case CP_VERTEX_SMOOTH: - case CP_TEXTURE_TO_VERTEX: - return MeshModel::MM_VERTCOLOR; - - case CP_DISCRETE_CURVATURE: - return MeshModel::MM_VERTCOLOR | MeshModel::MM_VERTQUALITY | MeshModel::MM_VERTNUMBER; - - case CP_CLAMP_QUALITY: - return MeshModel::MM_VERTQUALITY; - - default: assert(0); +int ExtraMeshColorizePlugin::postCondition( QAction* a ) const{ + switch(ID(a)){ + case CP_TRIANGLE_QUALITY: + return MeshModel::MM_FACECOLOR | MeshModel::MM_FACEQUALITY; + case CP_RANDOM_FACE: + case CP_COLOR_NON_TOPO_COHERENT: + case CP_FACE_SMOOTH: + case CP_VERTEX_TO_FACE: + case CP_MAP_FQUALITY_INTO_COLOR: + return MeshModel::MM_FACECOLOR; + case CP_MAP_VQUALITY_INTO_COLOR: + case CP_FACE_TO_VERTEX: + case CP_VERTEX_SMOOTH: + case CP_TEXTURE_TO_VERTEX: + return MeshModel::MM_VERTCOLOR; + case CP_DISCRETE_CURVATURE: + return MeshModel::MM_VERTCOLOR | MeshModel::MM_VERTQUALITY | MeshModel::MM_VERTNUMBER; + case CP_CLAMP_QUALITY: + return MeshModel::MM_VERTQUALITY; + default: assert(0); } - return MeshModel::MM_UNKNOWN; } - Q_EXPORT_PLUGIN(ExtraMeshColorizePlugin) diff --git a/src/meshlabplugins/filter_colorize/meshcolorize.h b/src/meshlabplugins/filter_colorize/meshcolorize.h index ebee4f621..d67b73ebd 100644 --- a/src/meshlabplugins/filter_colorize/meshcolorize.h +++ b/src/meshlabplugins/filter_colorize/meshcolorize.h @@ -98,7 +98,8 @@ public: enum { CP_CLAMP_QUALITY, - CP_MAP_QUALITY_INTO_COLOR, + CP_MAP_VQUALITY_INTO_COLOR, + CP_MAP_FQUALITY_INTO_COLOR, CP_DISCRETE_CURVATURE, CP_TRIANGLE_QUALITY, CP_VERTEX_SMOOTH,