QGIS API Documentation 4.1.0-Master (31622b25bb0)
Loading...
Searching...
No Matches
qgsgoochmaterialsettings.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsgoochmaterialsettings.cpp
3 --------------------------------------
4 Date : July 2020
5 Copyright : (C) 2020 by Nyall Dawson
6 Email : nyall dot dawson at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgscolorutils.h"
19
20#include <QString>
21#include <QUrl>
22
23using namespace Qt::StringLiterals;
24
26{
27 return u"gooch"_s;
28}
29
34
53
58
60{
61 const QgsGoochMaterialSettings *otherGooch = dynamic_cast<const QgsGoochMaterialSettings *>( other );
62 if ( !otherGooch )
63 return false;
64
65 return *this == *otherGooch;
66}
67
69{
70 const double kDiffuse = 0.8;
71 const double kSpecular = 0.2;
72
73 double red = 0.5 * kDiffuse * ( ( mCool.redF() + mAlpha * mDiffuse.redF() ) + ( mWarm.redF() + mBeta * mDiffuse.redF() ) ) + kSpecular * mSpecular.redF();
74 double green = 0.5 * kDiffuse * ( ( mCool.greenF() + mAlpha * mDiffuse.greenF() ) + ( mWarm.greenF() + mBeta * mDiffuse.greenF() ) ) + kSpecular * mSpecular.greenF();
75 double blue = 0.5 * kDiffuse * ( ( mCool.blueF() + mAlpha * mDiffuse.blueF() ) + ( mWarm.blueF() + mBeta * mDiffuse.blueF() ) ) + kSpecular * mSpecular.blueF();
76
77 red = std::clamp( red, 0.0, 1.0 );
78 green = std::clamp( green, 0.0, 1.0 );
79 blue = std::clamp( blue, 0.0, 1.0 );
80
81 return QColor::fromRgbF( static_cast<float>( red ), static_cast<float>( green ), static_cast<float>( blue ) );
82}
83
84void QgsGoochMaterialSettings::setColorsFromBase( const QColor &baseColor, double alpha, double beta )
85{
86 mAlpha = std::clamp( alpha, 0.0, 1.0 );
87 mBeta = std::clamp( beta, 0.0, 1.0 );
88
89 const float alphaF = static_cast<float>( mAlpha );
90 const float betaF = static_cast<float>( mBeta );
91
92 // Cool color: linear interpolation between baseColor and blue
93 // with the alpha parameter
94 mCool.setRedF( baseColor.redF() * ( 1.0f - alphaF ) );
95 mCool.setGreenF( baseColor.greenF() * ( 1.0f - alphaF ) );
96 mCool.setBlueF( baseColor.blueF() * ( 1.0f - alphaF ) + alphaF );
97
98 // Warm color: linear interpolation between baseColor and yellow
99 // with the beta parameter
100 mWarm.setRedF( baseColor.redF() * ( 1.0f - betaF ) + betaF );
101 mWarm.setGreenF( baseColor.greenF() * ( 1.0f - betaF ) + betaF );
102 mWarm.setBlueF( baseColor.blueF() * ( 1.0f - betaF ) );
103
104 // Diffuse color: mid-range between warm and cool
105 mDiffuse.setRedF( 0.5f * ( mWarm.redF() + mCool.redF() ) );
106 mDiffuse.setGreenF( 0.5f * ( mWarm.greenF() + mCool.greenF() ) );
107 mDiffuse.setBlueF( 0.5f * ( mWarm.blueF() + mCool.blueF() ) );
108
109 // Specular: soft highlight
110 mSpecular = QColor::fromRgbF( 0.4f, 0.4f, 0.4f );
111}
112
113void QgsGoochMaterialSettings::setColorsFromBase( const QColor &baseColor )
114{
115 return setColorsFromBase( baseColor, mAlpha, mBeta );
116}
117
118void QgsGoochMaterialSettings::readXml( const QDomElement &elem, const QgsReadWriteContext &context )
119{
120 mWarm = QgsColorUtils::colorFromString( elem.attribute( u"warm"_s, u"107,0,107"_s ) );
121 mCool = QgsColorUtils::colorFromString( elem.attribute( u"cool"_s, u"255,130,0"_s ) );
122 mDiffuse = QgsColorUtils::colorFromString( elem.attribute( u"diffuse"_s, u"178,178,178"_s ) );
123 mSpecular = QgsColorUtils::colorFromString( elem.attribute( u"specular"_s ) );
124 mShininess = elem.attribute( u"shininess2"_s, u"100"_s ).toDouble();
125 mAlpha = elem.attribute( u"alpha"_s, u"0.25"_s ).toDouble();
126 mBeta = elem.attribute( u"beta"_s, u"0.5"_s ).toDouble();
127
129}
130
131void QgsGoochMaterialSettings::writeXml( QDomElement &elem, const QgsReadWriteContext &context ) const
132{
133 elem.setAttribute( u"warm"_s, QgsColorUtils::colorToString( mWarm ) );
134 elem.setAttribute( u"cool"_s, QgsColorUtils::colorToString( mCool ) );
135 elem.setAttribute( u"diffuse"_s, QgsColorUtils::colorToString( mDiffuse ) );
136 elem.setAttribute( u"specular"_s, QgsColorUtils::colorToString( mSpecular ) );
137 elem.setAttribute( u"shininess2"_s, mShininess );
138 elem.setAttribute( u"alpha"_s, mAlpha );
139 elem.setAttribute( u"beta"_s, mBeta );
140
142}
MaterialRenderingTechnique
Material rendering techniques.
Definition qgis.h:4342
@ Points
Point based rendering, requires point data.
Definition qgis.h:4346
@ Triangles
Triangle based rendering (default).
Definition qgis.h:4343
@ TrianglesFromModel
Triangle based rendering, using a model object source.
Definition qgis.h:4348
@ Lines
Line based rendering, requires line data.
Definition qgis.h:4344
@ Billboards
Flat billboard rendering.
Definition qgis.h:4350
@ TrianglesDataDefined
Triangle based rendering with possibility of datadefined color.
Definition qgis.h:4349
@ InstancedPoints
Instanced based rendering, requiring triangles and point data.
Definition qgis.h:4345
@ TrianglesWithFixedTexture
Triangle based rendering, using a fixed, non-user-configurable texture (e.g. for terrain rendering).
Definition qgis.h:4347
Abstract base class for material settings.
virtual void writeXml(QDomElement &element, const QgsReadWriteContext &) const
Writes settings to a DOM element.
virtual void readXml(const QDomElement &element, const QgsReadWriteContext &)
Reads settings from a DOM element.
static QColor colorFromString(const QString &string)
Decodes a string into a color value.
static QString colorToString(const QColor &color)
Encodes a color into a string value.
QgsGoochMaterialSettings * clone() const override
Clones the material settings.
QColor averageColor() const override
Returns an approximate color representing the blended material color.
double alpha() const
Returns the alpha value.
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const override
Writes settings to a DOM element.
bool equals(const QgsAbstractMaterialSettings *other) const override
Returns true if this settings exactly matches an other settings.
void setColorsFromBase(const QColor &baseColor, double alpha, double beta)
Decomposes an average color into Gooch material components, and sets the material colors accordingly.
QString type() const override
Returns the unique type name for the material.
double beta() const
Returns the beta value.
QgsGoochMaterialSettings()=default
static bool supportsTechnique(Qgis::MaterialRenderingTechnique technique)
Returns true if the specified technique is supported by the Gooch material.
static QgsAbstractMaterialSettings * create()
Returns a new instance of QgsGoochMaterialSettings.
void readXml(const QDomElement &elem, const QgsReadWriteContext &context) override
Reads settings from a DOM element.
A container for the context for various read/write operations on objects.