From 2b0a88ca7d922f2121c6275ddd01148f0047b302 Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 16 Apr 2024 19:37:46 +0200 Subject: [PATCH] Gui: Read material colors from settings --- src/Gui/ViewProviderGeometryObject.cpp | 86 +++++++++++++++--------- src/Gui/ViewProviderGeometryObject.h | 6 +- src/Mod/Material/App/MaterialManager.cpp | 47 +++++++++---- src/Mod/Material/App/PreCompiled.h | 1 + 4 files changed, 97 insertions(+), 43 deletions(-) diff --git a/src/Gui/ViewProviderGeometryObject.cpp b/src/Gui/ViewProviderGeometryObject.cpp index 6aa19ea99f..a5820c48dd 100644 --- a/src/Gui/ViewProviderGeometryObject.cpp +++ b/src/Gui/ViewProviderGeometryObject.cpp @@ -23,6 +23,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ +#include #include #include #include @@ -70,10 +71,8 @@ const App::PropertyIntegerConstraint::Constraints intPercent = {0, 100, 5}; ViewProviderGeometryObject::ViewProviderGeometryObject() { - ParameterGrp::handle hGrp = - App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/View"); - - int initialTransparency = hGrp->GetInt("DefaultShapeTransparency", 0); + App::Material mat = getDefaultMaterial(); + long initialTransparency = toPercent(mat.transparency); static const char* dogroup = "Display Options"; static const char* sgroup = "Selection"; @@ -86,28 +85,6 @@ ViewProviderGeometryObject::ViewProviderGeometryObject() "Set object transparency"); Transparency.setConstraints(&intPercent); - App::Material mat(App::Material::DEFAULT); - // This is handled in the material code when using the object appearance - bool randomColor = hGrp->GetBool("RandomColor", false); - float red {}; - float green {}; - float blue {}; - - if (randomColor) { - auto fMax = (float)RAND_MAX; - red = (float)rand() / fMax; - green = (float)rand() / fMax; - blue = (float)rand() / fMax; - } - else { - // Color = (204, 204, 230) - unsigned long shcol = hGrp->GetUnsigned("DefaultShapeColor", 3435980543UL); - red = ((shcol >> 24) & 0xff) / 255.0F; - green = ((shcol >> 16) & 0xff) / 255.0F; - blue = ((shcol >> 8) & 0xff) / 255.0F; - } - mat.diffuseColor = App::Color(red, green, blue); - ADD_PROPERTY_TYPE(ShapeAppearance, (mat), osgroup, App::Prop_None, "Shape appearrance"); ADD_PROPERTY_TYPE(BoundingBox, (false), dogroup, App::Prop_None, "Display object bounding box"); ADD_PROPERTY_TYPE(Selectable, @@ -116,8 +93,7 @@ ViewProviderGeometryObject::ViewProviderGeometryObject() App::Prop_None, "Set if the object is selectable in the 3d view"); - bool enableSel = hGrp->GetBool("EnableSelection", true); - Selectable.setValue(enableSel); + Selectable.setValue(isSelectionEnabled()); pcShapeMaterial = new SoMaterial; setSoMaterial(mat); @@ -139,6 +115,56 @@ ViewProviderGeometryObject::~ViewProviderGeometryObject() pcBoundColor->unref(); } +App::Material ViewProviderGeometryObject::getDefaultMaterial() const +{ + ParameterGrp::handle hGrp = + App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/View"); + + auto getColor = [hGrp](const char* parameter, App::Color& color) { + uint32_t packed = color.getPackedRGB(); + packed = hGrp->GetUnsigned(parameter, packed); + color.setPackedRGB(packed); + }; + auto intRandom = [] (int min, int max) -> int { + static std::mt19937 generator; + std::uniform_int_distribution distribution(min, max); + return distribution(generator); + }; + + App::Material mat(App::Material::DEFAULT); + mat.transparency = fromPercent(hGrp->GetInt("DefaultShapeTransparency", 0)); + long shininess = toPercent(mat.shininess); + mat.shininess = fromPercent(hGrp->GetInt("DefaultShapeShininess", shininess)); + + // This is handled in the material code when using the object appearance + bool randomColor = hGrp->GetBool("RandomColor", false); + + // diffuse color + if (randomColor) { + float red = static_cast(intRandom(0, 255)) / 255.0F; + float green = static_cast(intRandom(0, 255)) / 255.0F; + float blue = static_cast(intRandom(0, 255)) / 255.0F; + mat.diffuseColor = App::Color(red, green, blue); + } + else { + // Color = (204, 204, 230) = 3435980543UL + getColor("DefaultShapeColor", mat.diffuseColor); + } + + getColor("DefaultAmbientColor", mat.ambientColor); + getColor("DefaultEmissiveColor", mat.emissiveColor); + getColor("DefaultSpecularColor", mat.specularColor); + + return mat; +} + +bool ViewProviderGeometryObject::isSelectionEnabled() const +{ + ParameterGrp::handle hGrp = + App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/View"); + return hGrp->GetBool("EnableSelection", true); +} + void ViewProviderGeometryObject::onChanged(const App::Property* prop) { // Actually, the properties 'ShapeColor' and 'Transparency' are part of the property @@ -257,8 +283,8 @@ unsigned long ViewProviderGeometryObject::getBoundColor() const { ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/View"); - unsigned long bbcol = - hGrp->GetUnsigned("BoundingBoxColor", 4294967295UL); // white (255,255,255) + // white (255,255,255) + unsigned long bbcol = hGrp->GetUnsigned("BoundingBoxColor", 4294967295UL); return bbcol; } diff --git a/src/Gui/ViewProviderGeometryObject.h b/src/Gui/ViewProviderGeometryObject.h index f968301d62..6b2d745c31 100644 --- a/src/Gui/ViewProviderGeometryObject.h +++ b/src/Gui/ViewProviderGeometryObject.h @@ -104,11 +104,15 @@ protected: virtual unsigned long getBoundColor() const; - void setSoMaterial(const App::Material& source); void handleChangedPropertyName(Base::XMLReader& reader, const char* TypeName, const char* PropName) override; +private: + void setSoMaterial(const App::Material& source); + App::Material getDefaultMaterial() const; + bool isSelectionEnabled() const; + protected: SoMaterial* pcShapeMaterial {nullptr}; SoFCBoundingBox* pcBoundingBox {nullptr}; diff --git a/src/Mod/Material/App/MaterialManager.cpp b/src/Mod/Material/App/MaterialManager.cpp index b4986bc38d..6e03f2720c 100644 --- a/src/Mod/Material/App/MaterialManager.cpp +++ b/src/Mod/Material/App/MaterialManager.cpp @@ -21,6 +21,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ +#include #endif #include @@ -116,30 +117,52 @@ std::shared_ptr MaterialManager::defaultMaterial() ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/View"); + + auto getColor = [hGrp](const char* parameter, App::Color& color) { + uint32_t packed = color.getPackedRGB(); + packed = hGrp->GetUnsigned(parameter, packed); + color.setPackedRGB(packed); + }; + auto intRandom = [] (int min, int max) -> int { + static std::mt19937 generator; + std::uniform_int_distribution distribution(min, max); + return distribution(generator); + }; + + App::Material mat(App::Material::DEFAULT); bool randomColor = hGrp->GetBool("RandomColor", false); - float r, g, b; if (randomColor) { - auto fMax = (float)RAND_MAX; - r = (float)rand() / fMax; - g = (float)rand() / fMax; - b = (float)rand() / fMax; + float red = static_cast(intRandom(0, 255)) / 255.0F; + float green = static_cast(intRandom(0, 255)) / 255.0F; + float blue = static_cast(intRandom(0, 255)) / 255.0F; + mat.diffuseColor = App::Color(red, green, blue); } else { - unsigned long shcol = hGrp->GetUnsigned("DefaultShapeColor", 3435980543UL); - r = ((shcol >> 24) & 0xff) / 255.0; - g = ((shcol >> 16) & 0xff) / 255.0; - b = ((shcol >> 8) & 0xff) / 255.0; + getColor("DefaultShapeColor", mat.diffuseColor); } - int initialTransparency = hGrp->GetInt("DefaultShapeTransparency", 0); + getColor("DefaultAmbientColor", mat.ambientColor); + getColor("DefaultEmissiveColor", mat.emissiveColor); + getColor("DefaultSpecularColor", mat.specularColor); + + long initialTransparency = hGrp->GetInt("DefaultShapeTransparency", 0); + long initialShininess = hGrp->GetInt("DefaultShapeShininess", 90); auto material = manager.getMaterial(defaultMaterialUUID()); if (material->hasAppearanceModel(ModelUUIDs::ModelUUID_Rendering_Basic)) { material->getAppearanceProperty(QString::fromLatin1("DiffuseColor")) - ->setColor(App::Color(r, g, b)); + ->setColor(mat.diffuseColor); + material->getAppearanceProperty(QString::fromLatin1("AmbientColor")) + ->setColor(mat.ambientColor); + material->getAppearanceProperty(QString::fromLatin1("EmissiveColor")) + ->setColor(mat.emissiveColor); + material->getAppearanceProperty(QString::fromLatin1("SpecularColor")) + ->setColor(mat.specularColor); material->getAppearanceProperty(QString::fromLatin1("Transparency")) - ->setFloat((float)initialTransparency / 100.0f); + ->setFloat((float)initialTransparency / 100.0F); + material->getAppearanceProperty(QString::fromLatin1("Shininess")) + ->setFloat((float)initialShininess / 100.0F); } return material; diff --git a/src/Mod/Material/App/PreCompiled.h b/src/Mod/Material/App/PreCompiled.h index e991f90cda..085b2d5ca4 100644 --- a/src/Mod/Material/App/PreCompiled.h +++ b/src/Mod/Material/App/PreCompiled.h @@ -50,6 +50,7 @@ #include #include #include +#include #include #include #include