From 5fe0a63201291abf860f77485f45d07cb6a80073 Mon Sep 17 00:00:00 2001 From: wmayer Date: Fri, 1 Apr 2022 08:38:27 +0200 Subject: [PATCH] App: handle option 'outside invisible' directly in ColorGradient --- src/App/ColorModel.cpp | 92 ++++++++++++++++++------------------------ src/App/ColorModel.h | 80 +++++++++++++++++++++++++++--------- 2 files changed, 100 insertions(+), 72 deletions(-) diff --git a/src/App/ColorModel.cpp b/src/App/ColorModel.cpp index 4be0e60808..15625fbf3b 100644 --- a/src/App/ColorModel.cpp +++ b/src/App/ColorModel.cpp @@ -90,13 +90,13 @@ ColorField::ColorField (const ColorModel &rclModel, float fMin, float fMax, std: } ColorField::ColorField (const ColorField &rclCF) - : colorModel(rclCF.colorModel), - fMin(rclCF.fMin), - fMax(rclCF.fMax), - fAscent(rclCF.fAscent), - fConstant(rclCF.fConstant), - ctColors(rclCF.ctColors), - colorField(rclCF.colorField) + : colorModel(rclCF.colorModel) + , fMin(rclCF.fMin) + , fMax(rclCF.fMax) + , fAscent(rclCF.fAscent) + , fConstant(rclCF.fConstant) + , ctColors(rclCF.ctColors) + , colorField(rclCF.colorField) { } @@ -128,15 +128,12 @@ void ColorField::setColorModel (const ColorModel &rclModel) void ColorField::rebuild () { - std::size_t usInd1, usInd2, usStep, i; - colorField.resize(ctColors); - - usStep = std::min(ctColors / (colorModel.getCountColors() - 1), ctColors - 1); - usInd1 = 0; - usInd2 = usStep; - for (i = 0; i < (colorModel.getCountColors() - 1); i++) { + std::size_t usStep = std::min(ctColors / (colorModel.getCountColors() - 1), ctColors - 1); + std::size_t usInd1 = 0; + std::size_t usInd2 = usStep; + for (std::size_t i = 0; i < (colorModel.getCountColors() - 1); i++) { interpolate(colorModel.colors[i], usInd1, colorModel.colors[i+1], usInd2); usInd1 = usInd2; if ((i + 1) == (colorModel.getCountColors() - 2)) @@ -152,21 +149,19 @@ void ColorField::rebuild () // fuellt das Array von Farbe 1, Index 1 bis Farbe 2, Index 2 void ColorField::interpolate (Color clCol1, std::size_t usInd1, Color clCol2, std::size_t usInd2) { - std::size_t i; - float ucR, ucG, ucB; - float fR, fG, fB, fStep = 1.0f, fLen = float(usInd2 - usInd1); + float fStep = 1.0f, fLen = float(usInd2 - usInd1); colorField[usInd1] = clCol1; colorField[usInd2] = clCol2; - fR = (float(clCol2.r) - float(clCol1.r)) / fLen; - fG = (float(clCol2.g) - float(clCol1.g)) / fLen; - fB = (float(clCol2.b) - float(clCol1.b)) / fLen; + float fR = (float(clCol2.r) - float(clCol1.r)) / fLen; + float fG = (float(clCol2.g) - float(clCol1.g)) / fLen; + float fB = (float(clCol2.b) - float(clCol1.b)) / fLen; - for (i = (usInd1 + 1); i < usInd2; i++) { - ucR = clCol1.r + fR * fStep; - ucG = clCol1.g + fG * fStep; - ucB = clCol1.b + fB * fStep; + for (std::size_t i = (usInd1 + 1); i < usInd2; i++) { + float ucR = clCol1.r + fR * fStep; + float ucG = clCol1.g + fG * fStep; + float ucB = clCol1.b + fB * fStep; colorField[i] = Color(ucR, ucG, ucB); fStep += 1.0f; } @@ -174,23 +169,23 @@ void ColorField::interpolate (Color clCol1, std::size_t usInd1, Color clCol2, st ColorGradient::ColorGradient () -: tStyle(ZERO_BASED), - outsideGrayed(false), - tColorModel(0) + : tStyle(ZERO_BASED) + , visibility(Visibility::Default) + , tColorModel(0) { createStandardPacks(); setColorModel(); - set(-1.0f, 1.0f, 13, ZERO_BASED, false); + set(-1.0f, 1.0f, 13, ZERO_BASED, Visibility::Default); } -ColorGradient::ColorGradient (float fMin, float fMax, std::size_t usCtColors, TStyle tS, bool bOG) -: tStyle(tS), - outsideGrayed(false), - tColorModel(0) +ColorGradient::ColorGradient (float fMin, float fMax, std::size_t usCtColors, TStyle tS, VisibilityFlags flags) + : tStyle(tS) + , visibility(Visibility::Default) + , tColorModel(0) { createStandardPacks(); setColorModel(); - set(fMin, fMax, usCtColors, tS, bOG); + set(fMin, fMax, usCtColors, tS, flags); } void ColorGradient::createStandardPacks() @@ -211,7 +206,7 @@ std::vector ColorGradient::getColorModelNames() const return names; } -void ColorGradient::set (float fMin, float fMax, std::size_t usCt, TStyle tS, bool bOG) +void ColorGradient::set (float fMin, float fMax, std::size_t usCt, TStyle tS, VisibilityFlags flags) { auto bounds = std::minmax(fMin, fMax); if (bounds.second <= bounds.first) { @@ -222,7 +217,7 @@ void ColorGradient::set (float fMin, float fMax, std::size_t usCt, TStyle tS, bo _fMax = bounds.second; ctColors = std::max(usCt, getMinColors()); tStyle = tS; - outsideGrayed = bOG; + visibility = flags; rebuild(); } @@ -298,7 +293,7 @@ void ColorGradient::setColorModel () } ColorLegend::ColorLegend () -: outsideGrayed(false) + : outsideGrayed(false) { // default blue, green, red colorFields.emplace_back(0, 0, 1); @@ -415,8 +410,7 @@ std::size_t ColorLegend::addMax (const std::string &rclName) bool ColorLegend::remove (std::size_t ulPos) { - if (ulPos < colorFields.size()) - { + if (ulPos < colorFields.size()) { colorFields.erase(colorFields.begin() + ulPos); names.erase(names.begin() + ulPos); values.erase(values.begin() + ulPos); @@ -429,8 +423,7 @@ bool ColorLegend::remove (std::size_t ulPos) void ColorLegend::removeFirst () { - if (colorFields.size() > 0) - { + if (colorFields.size() > 0) { colorFields.erase(colorFields.begin()); names.erase(names.begin()); values.erase(values.begin()); @@ -439,8 +432,7 @@ void ColorLegend::removeFirst () void ColorLegend::removeLast () { - if (colorFields.size() > 0) - { + if (colorFields.size() > 0) { colorFields.erase(colorFields.end()-1); names.erase(names.end()-1); values.erase(values.end()-1); @@ -452,14 +444,12 @@ void ColorLegend::resize (std::size_t ulCt) if ((ulCt < 2) || (ulCt == colorFields.size())) return; - if (ulCt > colorFields.size()) - { + if (ulCt > colorFields.size()) { int k = ulCt - colorFields.size(); for (int i = 0; i < k; i++) addMin("new"); } - else - { + else { int k = colorFields.size() - ulCt; for (int i = 0; i < k; i++) removeLast(); @@ -468,13 +458,12 @@ void ColorLegend::resize (std::size_t ulCt) bool ColorLegend::setColor (std::size_t ulPos, float ucRed, float ucGreen, float ucBlue) { - if (ulPos < names.size()) - { + if (ulPos < names.size()) { colorFields[ulPos] = Color(ucRed, ucGreen, ucBlue); return true; } - else - return false; + + return false; } // color as 0x00rrggbb @@ -488,8 +477,7 @@ bool ColorLegend::setColor (std::size_t ulPos, unsigned long ulColor) bool ColorLegend::setText (std::size_t ulPos, const std::string &rclName) { - if (ulPos < names.size()) - { + if (ulPos < names.size()) { names[ulPos] = rclName; return true; } diff --git a/src/App/ColorModel.h b/src/App/ColorModel.h index 99124e6bb5..f4f151241b 100644 --- a/src/App/ColorModel.h +++ b/src/App/ColorModel.h @@ -25,6 +25,7 @@ #define APP_COLORMODEL_H #include "Material.h" +#include #include #include @@ -32,6 +33,21 @@ #include +namespace App +{ + +enum class Visibility { + Default, + Grayed, + Invisible +}; + +using VisibilityFlags = Base::Flags; + +} + +ENABLE_BITMASK_OPERATORS(App::Visibility) + namespace App { @@ -62,7 +78,7 @@ public: std::size_t getCountColors() const { return colors.size(); } - std::vector colors; + std::vector colors; }; class AppExport ColorModelBlueGreenRed : public ColorModel @@ -301,7 +317,7 @@ inline Color ColorField::getColor (float fVal) const float r = (float)(i+1)/(float)ct; if (t < r) { // calculate the exact position in the subrange - float s = t * (float)ct - (float)i; + float s = t * float(ct) - float(i); Color c1 = colorModel.colors[i]; Color c2 = colorModel.colors[i+1]; col.r = (1.0f-s) * c1.r + s * c2.r; @@ -316,7 +332,7 @@ inline Color ColorField::getColor (float fVal) const inline std::size_t ColorField::getColorIndex (float fVal) const { - return (std::size_t)(std::min(std::max(int(fConstant + fAscent * fVal), 0), int(ctColors - 1))); + return std::size_t(std::min(std::max(int(fConstant + fAscent * fVal), 0), int(ctColors - 1))); } @@ -326,35 +342,44 @@ public: enum TStyle { FLOW, ZERO_BASED }; ColorGradient (); - ColorGradient (float fMin, float fMax, std::size_t usCtColors, TStyle tS, bool bOG = false); + ColorGradient (float fMin, float fMax, std::size_t usCtColors, TStyle tS, VisibilityFlags fl = Visibility::Default); ColorGradient (const ColorGradient &) = default; ColorGradient& operator = (const ColorGradient &) = default; - void set (float fMin, float fMax, std::size_t usCt, TStyle tS, bool bOG); + void set (float fMin, float fMax, std::size_t usCt, TStyle tS, VisibilityFlags fl); void setRange (float fMin, float fMax) { - set(fMin, fMax, ctColors, tStyle, outsideGrayed); + set(fMin, fMax, ctColors, tStyle, visibility); } void getRange (float &rfMin, float &rfMax) const { rfMin = _fMin; rfMax = _fMax; } + bool isOutOfRange(float fVal) const { + return ((fVal < _fMin) || (fVal > _fMax)); + } std::size_t getCountColors () const { return ctColors; } void setCountColors (std::size_t usCt) { - set(_fMin, _fMax, usCt, tStyle, outsideGrayed); + set(_fMin, _fMax, usCt, tStyle, visibility); } void setStyle (TStyle tS) { - set(_fMin, _fMax, ctColors, tS, outsideGrayed); + set(_fMin, _fMax, ctColors, tS, visibility); } std::size_t getMinColors () const; TStyle getStyle () const { return tStyle; } - void setOutsideGrayed (bool bGrayed) { - outsideGrayed = bGrayed; + void setOutsideGrayed (bool value) { + visibility.setFlag(Visibility::Grayed, value); } bool isOutsideGrayed () const { - return outsideGrayed; + return visibility.testFlag(Visibility::Grayed); + } + void setOutsideInvisible (bool value) { + visibility.setFlag(Visibility::Invisible, value); + } + bool isOutsideInvisible () const { + return visibility.testFlag(Visibility::Invisible); } void setColorModel (std::size_t tModel); std::size_t getColorModelType () const { @@ -372,6 +397,9 @@ public: inline Color getColor (float fVal) const; inline std::size_t getColorIndex (float fVal) const; +private: + inline Color _getColor (float fVal) const; + protected: void createStandardPacks(); @@ -380,7 +408,7 @@ protected: TStyle tStyle; float _fMin, _fMax; std::size_t ctColors; - bool outsideGrayed; + VisibilityFlags visibility; std::size_t tColorModel; ColorModelPack currentModelPack; std::vector modelPacks; @@ -491,8 +519,19 @@ inline float ColorLegend::getMaxValue () const inline Color ColorGradient::getColor (float fVal) const { - if (outsideGrayed) { - if ((fVal < _fMin) || (fVal > _fMax)) + Color color = _getColor(fVal); + if (isOutsideInvisible()) { + if (isOutOfRange(fVal)) + color.a = 0.8f; + } + + return color; +} + +inline Color ColorGradient::_getColor (float fVal) const +{ + if (isOutsideGrayed()) { + if (isOutOfRange(fVal)) return Color(0.5f, 0.5f, 0.5f); } @@ -505,8 +544,9 @@ inline Color ColorGradient::getColor (float fVal) const else return colorField2.getColor(fVal); } - else + else { return colorField1.getColor(fVal); + } } default: @@ -526,10 +566,11 @@ inline std::size_t ColorGradient::getColorIndex (float fVal) const if (fVal < 0.0f) return colorField1.getColorIndex(fVal); else - return (std::size_t)(colorField1.getCountColors() + colorField2.getColorIndex(fVal)); + return std::size_t(colorField1.getCountColors() + colorField2.getColorIndex(fVal)); } - else + else { return colorField1.getColorIndex(fVal); + } } default: @@ -550,9 +591,8 @@ inline const ColorModel& ColorGradient::getColorModel () const else return currentModelPack.totalModel; } - else { - return currentModelPack.totalModel; - } + + return currentModelPack.totalModel; } } // namespace App