diff --git a/vcg/complex/algorithms/update/color.h b/vcg/complex/algorithms/update/color.h index e2ed646c..d2b53d4e 100644 --- a/vcg/complex/algorithms/update/color.h +++ b/vcg/complex/algorithms/update/color.h @@ -184,6 +184,27 @@ public: (*vi).C().SetColorRamp(minq,maxq,(*vi).Q()); } + + /*! \brief This function colores all the faces of a mesh with a hue color shade dependent on the quality. + + If no range of quality is passed it is automatically computed. + */ + static void PerVertexQualityRampParula(MeshType &m, float minq=0, float maxq=0) + { + RequirePerVertexQuality(m); + RequirePerVertexColor(m); + + if(minq==maxq) + { + std::pair minmax = Stat::ComputePerVertexQualityMinMax(m); + minq=minmax.first; + maxq=minmax.second; + } + for(VertexIterator vi=m.vert.begin();vi!=m.vert.end();++vi) + if(!(*vi).IsD()) + (*vi).C().SetColorRampParula(minq,maxq,(*vi).Q()); + } + /*! \brief This function colores all the faces of a mesh with a hue color shade dependent on the quality. If no range of quality is passed it is automatically computed. diff --git a/vcg/space/color4.h b/vcg/space/color4.h index 8a184a99..f64bf571 100644 --- a/vcg/space/color4.h +++ b/vcg/space/color4.h @@ -71,6 +71,7 @@ public: inline Color4 ( const Point4 &c) :Point4(c) {} inline Color4 (){} inline Color4 (ColorConstant cc); + inline Color4 (unsigned int cc); template inline void Import(const Color4 & b ) @@ -147,6 +148,27 @@ public: *this= Color4(Color4::Blue); } + inline void SetColorRampParula(const float &minf,const float &maxf ,float v) + { + if(minf>maxf) { SetColorRampParula(maxf,minf,maxf+(minf-v)); return; } + SetColorRampParula((v-minf)/(maxf-minf)); + } + + inline void SetColorRampParula(float v) + { + if(v<0) v=0; + else if(v>1) v=1; + + unsigned int ParuVal[9]={0xff801627, 0xffe16303, 0xffd48514, + 0xffc6a706, 0xff9eb938, 0xff73bf92, + 0xff56bad9, 0xff2ecefc, 0xff0afaff}; + int ind = int(floor(v*8.0f)); + float div = (v*8.0f - ind); + if(div<0) div=0; + else if(div>1) div=1; + lerp(Color4(ParuVal[ind]), Color4(ParuVal[ind+1]), div); + } + void SetHSVColor( float h, float s, float v) { float r,g,b; @@ -185,7 +207,10 @@ public: inline static Color4 GrayShade(float f) { - return Color4(f,f,f,1); + if(f<0) f=0.0f; + else if(f>1) f=1.0f; + + return Color4(f,f,f,1); } inline void SetGrayShade(float f) @@ -301,6 +326,18 @@ inline Color4::Color4(Color4::ColorConstant cc) Import(Color4((Color4::ColorConstant)cc)); } +template<> +inline Color4::Color4(unsigned int cc) +{ + *((int *)this )= cc; +} + +template<> +inline Color4::Color4(unsigned int cc) +{ + Import(Color4(cc)); +} + inline Color4 Clamp(Color4 &c) { c[0]=math::Clamp(c[0],0.0f,1.0f);