diff --git a/src/Gui/DlgSettingsViewColor.cpp b/src/Gui/DlgSettingsViewColor.cpp index 90a3ce9ec6..ba017d9c0b 100644 --- a/src/Gui/DlgSettingsViewColor.cpp +++ b/src/Gui/DlgSettingsViewColor.cpp @@ -64,6 +64,7 @@ void DlgSettingsViewColor::saveSettings() ui->backgroundColorMid->onSave(); ui->radioButtonSimple->onSave(); ui->radioButtonGradient->onSave(); + ui->rbRadialGradient->onSave(); ui->checkMidColor->onSave(); ui->checkBoxPreselection->onSave(); ui->checkBoxSelection->onSave(); @@ -81,6 +82,7 @@ void DlgSettingsViewColor::loadSettings() ui->backgroundColorMid->onRestore(); ui->radioButtonSimple->onRestore(); ui->radioButtonGradient->onRestore(); + ui->rbRadialGradient->onRestore(); ui->checkMidColor->onRestore(); ui->checkBoxPreselection->onRestore(); ui->checkBoxSelection->onRestore(); diff --git a/src/Gui/DlgSettingsViewColor.ui b/src/Gui/DlgSettingsViewColor.ui index 75b851b83b..398205dcbe 100644 --- a/src/Gui/DlgSettingsViewColor.ui +++ b/src/Gui/DlgSettingsViewColor.ui @@ -267,7 +267,7 @@ Background will have selected color gradient - Color gradient + Linear gradient true @@ -314,17 +314,23 @@ - - - Qt::Horizontal + + + Background will have selected color gradient - - - 40 - 20 - + + Radial gradient - + + false + + + RadialGradient + + + View + + @@ -586,6 +592,7 @@ SelectionColor_Background radioButtonGradient backgroundColorFrom + rbRadialGradient backgroundColorTo checkMidColor backgroundColorMid @@ -688,6 +695,38 @@ + + rbRadialGradient + toggled(bool) + backgroundColorFrom + setEnabled(bool) + + + 110 + 309 + + + 310 + 311 + + + + + rbRadialGradient + toggled(bool) + backgroundColorTo + setEnabled(bool) + + + 77 + 309 + + + 310 + 338 + + + radioButtonSimple toggled(bool) diff --git a/src/Gui/PreferencePackTemplates/Window_Colors.cfg b/src/Gui/PreferencePackTemplates/Window_Colors.cfg index ddb0281427..9314b8c492 100644 --- a/src/Gui/PreferencePackTemplates/Window_Colors.cfg +++ b/src/Gui/PreferencePackTemplates/Window_Colors.cfg @@ -16,6 +16,7 @@ + diff --git a/src/Gui/PreferencePacks/FreeCAD Classic Colors/FreeCAD Classic Colors.cfg b/src/Gui/PreferencePacks/FreeCAD Classic Colors/FreeCAD Classic Colors.cfg index 4f63a13e16..969289ae8e 100644 --- a/src/Gui/PreferencePacks/FreeCAD Classic Colors/FreeCAD Classic Colors.cfg +++ b/src/Gui/PreferencePacks/FreeCAD Classic Colors/FreeCAD Classic Colors.cfg @@ -119,6 +119,7 @@ + diff --git a/src/Gui/SoFCBackgroundGradient.cpp b/src/Gui/SoFCBackgroundGradient.cpp index 4f40eb7140..3009d662f9 100644 --- a/src/Gui/SoFCBackgroundGradient.cpp +++ b/src/Gui/SoFCBackgroundGradient.cpp @@ -23,6 +23,11 @@ #include "PreCompiled.h" #ifndef _PreComp_ +#include +#ifdef FC_OS_WIN32 + #define _USE_MATH_DEFINES +#endif +#include #ifdef FC_OS_MACOSX #include #else @@ -32,6 +37,16 @@ #include "SoFCBackgroundGradient.h" +static const std::array big_circle = []{ + std::array result; int c = 0; + for (GLfloat i = 0; i < 2*M_PI; i += 2*M_PI / 32, c++){ + result[c][0] = M_SQRT2*cosf(i); result[c][1] = M_SQRT2*sinf(i); } + return result; }(); +static const std::array small_oval = []{ + std::array result; int c = 0; + for (GLfloat i = 0; i < 2*M_PI; i += 2*M_PI / 32, c++){ + result[c][0] = 0.3*M_SQRT2*cosf(i); result[c][1] = M_SQRT1_2*sinf(i); } + return result; }(); using namespace Gui; @@ -51,6 +66,7 @@ SoFCBackgroundGradient::SoFCBackgroundGradient() fCol.setValue(0.5f, 0.5f, 0.8f); tCol.setValue(0.7f, 0.7f, 0.9f); mCol.setValue(1.0f, 1.0f, 1.0f); + radial = false; } /*! @@ -80,6 +96,7 @@ void SoFCBackgroundGradient::GLRender (SoGLRenderAction * /*action*/) glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); + if(!radial){ // linear gradient glBegin(GL_TRIANGLE_STRIP); if (mCol[0] < 0) { glColor3f(fCol[0],fCol[1],fCol[2]); glVertex2f(-1, 1); @@ -99,6 +116,31 @@ void SoFCBackgroundGradient::GLRender (SoGLRenderAction * /*action*/) glColor3f(mCol[0],mCol[1],mCol[2]); glVertex2f( 1, 0); glColor3f(tCol[0],tCol[1],tCol[2]); glVertex2f( 1,-1); } + } else { // radial gradient + glBegin(GL_TRIANGLE_FAN); + glColor3f(fCol[0], fCol[1], fCol[2]); glVertex2f(0.0f, 0.0f); + + if (mCol[0] < 0) { // simple radial gradient + glColor3f(tCol[0], tCol[1], tCol[2]); + for (const GLfloat *vertex : big_circle) + glVertex2fv( vertex ); + glVertex2fv( big_circle.front() ); + } else { + glColor3f(mCol[0], mCol[1], mCol[2]); + for (const GLfloat *vertex : small_oval) + glVertex2fv( vertex ); + glVertex2fv( small_oval.front() ); + glEnd(); + + glBegin(GL_TRIANGLE_STRIP); + for (std::size_t i = 0; i < small_oval.size(); i++){ + glColor3f(mCol[0], mCol[1], mCol[2]); glVertex2fv( small_oval[i] ); + glColor3f(tCol[0], tCol[1], tCol[2]); glVertex2fv( big_circle[i] ); } + + glColor3f(mCol[0], mCol[1], mCol[2]); glVertex2fv( small_oval.front() ); + glColor3f(tCol[0], tCol[1], tCol[2]); glVertex2fv( big_circle.front() ); + } + } // end of radial gradient glEnd(); glPopAttrib(); @@ -109,18 +151,22 @@ void SoFCBackgroundGradient::GLRender (SoGLRenderAction * /*action*/) } void SoFCBackgroundGradient::setColorGradient(const SbColor& fromColor, - const SbColor& toColor) + const SbColor& toColor, + bool isRadial) { fCol = fromColor; tCol = toColor; mCol[0] = -1.0f; + radial = isRadial; } void SoFCBackgroundGradient::setColorGradient(const SbColor& fromColor, const SbColor& toColor, - const SbColor& midColor) + const SbColor& midColor, + bool isRadial) { fCol = fromColor; tCol = toColor; mCol = midColor; + radial = isRadial; } diff --git a/src/Gui/SoFCBackgroundGradient.h b/src/Gui/SoFCBackgroundGradient.h index 2ebd7de091..febc83516f 100644 --- a/src/Gui/SoFCBackgroundGradient.h +++ b/src/Gui/SoFCBackgroundGradient.h @@ -44,8 +44,11 @@ public: SoFCBackgroundGradient(); void GLRender (SoGLRenderAction *action); - void setColorGradient(const SbColor& fromColor, const SbColor& toColor); - void setColorGradient(const SbColor& fromColor, const SbColor& toColor, const SbColor& midColor); + void setColorGradient(const SbColor& fromColor, const SbColor& toColor, bool isRadial); + void setColorGradient(const SbColor& fromColor, const SbColor& toColor, const SbColor& midColor, bool isRadial); + +private: + bool radial; protected: virtual ~SoFCBackgroundGradient(); diff --git a/src/Gui/SplitView3DInventor.cpp b/src/Gui/SplitView3DInventor.cpp index 76a33b4f7b..ff52ed8b13 100644 --- a/src/Gui/SplitView3DInventor.cpp +++ b/src/Gui/SplitView3DInventor.cpp @@ -109,6 +109,7 @@ void AbstractSplitView::setupSettings() OnChange(*hGrp,"CornerCoordSystemSize"); OnChange(*hGrp,"UseAutoRotation"); OnChange(*hGrp,"Gradient"); + OnChange(*hGrp,"RadialGradient"); OnChange(*hGrp,"BackgroundColor"); OnChange(*hGrp,"BackgroundColor2"); OnChange(*hGrp,"BackgroundColor3"); @@ -263,9 +264,9 @@ void AbstractSplitView::OnChange(ParameterGrp::SubjectType &rCaller,ParameterGrp for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) (*it)->setAnimationEnabled(rGrp.GetBool("UseAutoRotation",false)); } - else if (strcmp(Reason,"Gradient") == 0) { + else if ( strcmp(Reason,"Gradient") == 0 || strcmp(Reason, "RadialGradient") == 0 ) { for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) - (*it)->setGradientBackground((rGrp.GetBool("Gradient",true))); + (*it)->setGradientBackground(rGrp.GetBool("Gradient", true) || rGrp.GetBool("RadialGradient", true)); } else if (strcmp(Reason,"ShowFPS") == 0) { for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) @@ -305,9 +306,11 @@ void AbstractSplitView::OnChange(ParameterGrp::SubjectType &rCaller,ParameterGrp for (std::vector::iterator it = _viewer.begin(); it != _viewer.end(); ++it) { (*it)->setBackgroundColor(QColor::fromRgbF(r1, g1, b1)); if (!rGrp.GetBool("UseBackgroundColorMid",false)) - (*it)->setGradientBackgroundColor(SbColor(r2, g2, b2), SbColor(r3, g3, b3)); + (*it)->setGradientBackgroundColor(SbColor(r2, g2, b2), SbColor(r3, g3, b3), + rGrp.GetBool("RadialGradient", false) ); else - (*it)->setGradientBackgroundColor(SbColor(r2, g2, b2), SbColor(r3, g3, b3), SbColor(r4, g4, b4)); + (*it)->setGradientBackgroundColor(SbColor(r2, g2, b2), SbColor(r3, g3, b3), SbColor(r4, g4, b4), + rGrp.GetBool("RadialGradient", false) ); } } } diff --git a/src/Gui/View3DInventorViewer.cpp b/src/Gui/View3DInventorViewer.cpp index 80fe8cbb3f..6bbf447709 100644 --- a/src/Gui/View3DInventorViewer.cpp +++ b/src/Gui/View3DInventorViewer.cpp @@ -1084,16 +1084,18 @@ bool View3DInventorViewer::hasGradientBackground() const } void View3DInventorViewer::setGradientBackgroundColor(const SbColor& fromColor, - const SbColor& toColor) + const SbColor& toColor, + bool isRadial) { - pcBackGround->setColorGradient(fromColor, toColor); + pcBackGround->setColorGradient(fromColor, toColor, isRadial); } void View3DInventorViewer::setGradientBackgroundColor(const SbColor& fromColor, const SbColor& toColor, - const SbColor& midColor) + const SbColor& midColor, + bool isRadial) { - pcBackGround->setColorGradient(fromColor, toColor, midColor); + pcBackGround->setColorGradient(fromColor, toColor, midColor, isRadial); } void View3DInventorViewer::setEnabledFPSCounter(bool on) diff --git a/src/Gui/View3DInventorViewer.h b/src/Gui/View3DInventorViewer.h index 27a30ca380..1d1e03a75c 100644 --- a/src/Gui/View3DInventorViewer.h +++ b/src/Gui/View3DInventorViewer.h @@ -373,10 +373,12 @@ public: void setGradientBackground(bool b); bool hasGradientBackground() const; void setGradientBackgroundColor(const SbColor& fromColor, - const SbColor& toColor); + const SbColor& toColor, + bool isRadial); void setGradientBackgroundColor(const SbColor& fromColor, const SbColor& toColor, - const SbColor& midColor); + const SbColor& midColor, + bool isRadial); void setNavigationType(Base::Type); void setAxisCross(bool b); diff --git a/src/Gui/View3DSettings.cpp b/src/Gui/View3DSettings.cpp index ed18471c95..f42f86f56c 100644 --- a/src/Gui/View3DSettings.cpp +++ b/src/Gui/View3DSettings.cpp @@ -68,6 +68,7 @@ void View3DSettings::applySettings() OnChange(*hGrp,"ShowAxisCross"); OnChange(*hGrp,"UseAutoRotation"); OnChange(*hGrp,"Gradient"); + OnChange(*hGrp,"RadialGradient"); OnChange(*hGrp,"BackgroundColor"); OnChange(*hGrp,"BackgroundColor2"); OnChange(*hGrp,"BackgroundColor3"); @@ -233,8 +234,8 @@ void View3DSettings::OnChange(ParameterGrp::SubjectType &rCaller,ParameterGrp::M else if (strcmp(Reason,"UseAutoRotation") == 0) { _viewer->setAnimationEnabled(rGrp.GetBool("UseAutoRotation", false)); } - else if (strcmp(Reason,"Gradient") == 0) { - _viewer->setGradientBackground((rGrp.GetBool("Gradient", true))); + else if (strcmp(Reason,"Gradient") == 0 || strcmp(Reason,"RadialGradient") == 0) { + _viewer->setGradientBackground(rGrp.GetBool("Gradient", true) || rGrp.GetBool("RadialGradient", true)); } else if (strcmp(Reason,"ShowFPS") == 0) { _viewer->setEnabledFPSCounter(rGrp.GetBool("ShowFPS", false)); @@ -299,9 +300,9 @@ void View3DSettings::OnChange(ParameterGrp::SubjectType &rCaller,ParameterGrp::M r4 = ((col4 >> 24) & 0xff) / 255.0; g4 = ((col4 >> 16) & 0xff) / 255.0; b4 = ((col4 >> 8) & 0xff) / 255.0; _viewer->setBackgroundColor(QColor::fromRgbF(r1, g1, b1)); if (!rGrp.GetBool("UseBackgroundColorMid",false)) - _viewer->setGradientBackgroundColor(SbColor(r2, g2, b2), SbColor(r3, g3, b3)); + _viewer->setGradientBackgroundColor(SbColor(r2, g2, b2), SbColor(r3, g3, b3), rGrp.GetBool("RadialGradient", false)); else - _viewer->setGradientBackgroundColor(SbColor(r2, g2, b2), SbColor(r3, g3, b3), SbColor(r4, g4, b4)); + _viewer->setGradientBackgroundColor(SbColor(r2, g2, b2), SbColor(r3, g3, b3), SbColor(r4, g4, b4), rGrp.GetBool("RadialGradient", false)); } } diff --git a/src/Gui/View3DViewerPy.cpp b/src/Gui/View3DViewerPy.cpp index b958f22b03..7fe65d5463 100644 --- a/src/Gui/View3DViewerPy.cpp +++ b/src/Gui/View3DViewerPy.cpp @@ -437,7 +437,7 @@ Py::Object View3DInventorViewerPy::setBackgroundColor(const Py::Tuple& args) } try { SbColor col(r,g,b); - _viewer->setGradientBackgroundColor(col,col); + _viewer->setGradientBackgroundColor(col, col, false); return Py::None(); } catch (const Base::Exception& e) {