[GUI] Radial gradient implementation

This commit implements radial gradient as background and adds the option
to settings. It also renames "Color gradient" as "Linear gradient",
keeping Linear gradient default. Internally, it remains unchanged for
compatibility.

Radio gradient is more suitable for CAD, since it gives a more balanced
color distribution across the screen, improving visibility of model and
sketches with a halo-like effect.
This commit is contained in:
xtemp09
2023-04-01 13:34:55 +07:00
parent 181c7ba5eb
commit 414c803ff3
11 changed files with 129 additions and 29 deletions

View File

@@ -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();

View File

@@ -267,7 +267,7 @@
<string>Background will have selected color gradient</string>
</property>
<property name="text">
<string>Color gradient</string>
<string>Linear gradient</string>
</property>
<property name="checked">
<bool>true</bool>
@@ -314,17 +314,23 @@
</widget>
</item>
<item row="2" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<widget class="Gui::PrefRadioButton" name="rbRadialGradient">
<property name="toolTip">
<string>Background will have selected color gradient</string>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
<property name="text">
<string>Radial gradient</string>
</property>
</spacer>
<property name="checked">
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>RadialGradient</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>View</cstring>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="Gui::PrefColorButton" name="backgroundColorTo">
@@ -586,6 +592,7 @@
<tabstop>SelectionColor_Background</tabstop>
<tabstop>radioButtonGradient</tabstop>
<tabstop>backgroundColorFrom</tabstop>
<tabstop>rbRadialGradient</tabstop>
<tabstop>backgroundColorTo</tabstop>
<tabstop>checkMidColor</tabstop>
<tabstop>backgroundColorMid</tabstop>
@@ -688,6 +695,38 @@
</hint>
</hints>
</connection>
<connection>
<sender>rbRadialGradient</sender>
<signal>toggled(bool)</signal>
<receiver>backgroundColorFrom</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>110</x>
<y>309</y>
</hint>
<hint type="destinationlabel">
<x>310</x>
<y>311</y>
</hint>
</hints>
</connection>
<connection>
<sender>rbRadialGradient</sender>
<signal>toggled(bool)</signal>
<receiver>backgroundColorTo</receiver>
<slot>setEnabled(bool)</slot>
<hints>
<hint type="sourcelabel">
<x>77</x>
<y>309</y>
</hint>
<hint type="destinationlabel">
<x>310</x>
<y>338</y>
</hint>
</hints>
</connection>
<connection>
<sender>radioButtonSimple</sender>
<signal>toggled(bool)</signal>

View File

@@ -16,6 +16,7 @@
<FCInt Name="DefaultShapeTransparency" Value="0"/>
<FCBool Name="EnableBacklight" Value="0"/>
<FCBool Name="Gradient" Value="1"/>
<FCBool Name="RadialGradient" Value="0"/>
<FCUInt Name="HighlightColor" Value="4294907903"/>
<FCBool Name="RandomColor" Value="0"/>
<FCUInt Name="SelectionColor" Value="704588287"/>

View File

@@ -119,6 +119,7 @@
<FCUInt Name="CreateLineColor" Value="3435973887"/>
<FCBool Name="Simple" Value="0"/>
<FCBool Name="Gradient" Value="1"/>
<FCBool Name="RadialGradient" Value="0"/>
<FCBool Name="UseBackgroundColorMid" Value="0"/>
<FCBool Name="RandomColor" Value="0"/>
<FCUInt Name="BacklightColor" Value="4294967295"/>

View File

@@ -23,6 +23,11 @@
#include "PreCompiled.h"
#ifndef _PreComp_
#include <array>
#ifdef FC_OS_WIN32
#define _USE_MATH_DEFINES
#endif
#include <cmath>
#ifdef FC_OS_MACOSX
#include <OpenGL/gl.h>
#else
@@ -32,6 +37,16 @@
#include "SoFCBackgroundGradient.h"
static const std::array <GLfloat[2], 32> big_circle = []{
std::array <GLfloat[2], 32> 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 <GLfloat[2], 32> small_oval = []{
std::array <GLfloat[2], 32> 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;
}

View File

@@ -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();

View File

@@ -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<View3DInventorViewer*>::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<View3DInventorViewer*>::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<View3DInventorViewer*>::iterator it = _viewer.begin(); it != _viewer.end(); ++it)
@@ -305,9 +306,11 @@ void AbstractSplitView::OnChange(ParameterGrp::SubjectType &rCaller,ParameterGrp
for (std::vector<View3DInventorViewer*>::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) );
}
}
}

View File

@@ -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)

View File

@@ -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);

View File

@@ -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));
}
}

View File

@@ -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) {