20#include <Qt3DRender/QAbstractTexture>
21#include <Qt3DRender/QGraphicsApiFilter>
22#include <Qt3DRender/QParameter>
23#include <Qt3DRender/QRenderPass>
24#include <Qt3DRender/QShaderProgramBuilder>
25#include <Qt3DRender/QTechnique>
26#include <Qt3DRender/QTexture>
28#include "moc_qgsmetalroughmaterial.cpp"
31QgsMetalRoughMaterial::QgsMetalRoughMaterial( QNode *parent )
33 , mBaseColorParameter( new
Qt3DRender::QParameter( QStringLiteral(
"baseColor" ), QColor(
"grey" ), this ) )
34 , mMetalnessParameter( new
Qt3DRender::QParameter( QStringLiteral(
"metalness" ), 0.0f, this ) )
35 , mRoughnessParameter( new
Qt3DRender::QParameter( QStringLiteral(
"roughness" ), 0.0f, this ) )
36 , mBaseColorMapParameter( new
Qt3DRender::QParameter( QStringLiteral(
"baseColorMap" ), QVariant(), this ) )
37 , mMetalnessMapParameter( new
Qt3DRender::QParameter( QStringLiteral(
"metalnessMap" ), QVariant(), this ) )
38 , mRoughnessMapParameter( new
Qt3DRender::QParameter( QStringLiteral(
"roughnessMap" ), QVariant(), this ) )
39 , mAmbientOcclusionMapParameter( new
Qt3DRender::QParameter( QStringLiteral(
"ambientOcclusionMap" ), QVariant(), this ) )
40 , mNormalMapParameter( new
Qt3DRender::QParameter( QStringLiteral(
"normalMap" ), QVariant(), this ) )
41 , mTextureScaleParameter( new
Qt3DRender::QParameter( QStringLiteral(
"texCoordScale" ), 1.0f, this ) )
42 , mMetalRoughEffect( new
Qt3DRender::QEffect( this ) )
43 , mMetalRoughGL3Technique( new
Qt3DRender::QTechnique( this ) )
44 , mMetalRoughGL3RenderPass( new
Qt3DRender::QRenderPass( this ) )
45 , mMetalRoughGL3Shader( new
Qt3DRender::QShaderProgram( this ) )
46 , mFilterKey( new
Qt3DRender::QFilterKey( this ) )
51QgsMetalRoughMaterial::~QgsMetalRoughMaterial() =
default;
53QVariant QgsMetalRoughMaterial::baseColor()
const
55 return mBaseColorParameter->value();
58QVariant QgsMetalRoughMaterial::metalness()
const
60 return mMetalnessParameter->value();
63QVariant QgsMetalRoughMaterial::roughness()
const
65 return mRoughnessParameter->value();
68QVariant QgsMetalRoughMaterial::ambientOcclusion()
const
70 return mAmbientOcclusionMapParameter->value();
73QVariant QgsMetalRoughMaterial::normal()
const
75 return mNormalMapParameter->value();
78float QgsMetalRoughMaterial::textureScale()
const
80 return mTextureScaleParameter->value().toFloat();
83void QgsMetalRoughMaterial::setBaseColor(
const QVariant &baseColor )
85 mBaseColorParameter->setValue( baseColor );
86 mBaseColorMapParameter->setValue( baseColor );
87 bool oldUsingBaseColorMap = mUsingBaseColorMap;
89 if ( baseColor.value<Qt3DRender::QAbstractTexture *>() )
91 mUsingBaseColorMap =
true;
92 mMetalRoughEffect->addParameter( mBaseColorMapParameter );
93 if ( mMetalRoughEffect->parameters().contains( mBaseColorParameter ) )
94 mMetalRoughEffect->removeParameter( mBaseColorParameter );
98 mUsingBaseColorMap =
false;
99 if ( mMetalRoughEffect->parameters().contains( mBaseColorMapParameter ) )
100 mMetalRoughEffect->removeParameter( mBaseColorMapParameter );
101 mMetalRoughEffect->addParameter( mBaseColorParameter );
104 if ( oldUsingBaseColorMap != mUsingBaseColorMap )
105 updateFragmentShader();
108void QgsMetalRoughMaterial::setMetalness(
const QVariant &metalness )
110 mMetalnessParameter->setValue( metalness );
111 mMetalnessMapParameter->setValue( metalness );
112 bool oldUsingMetalnessMap = mUsingMetalnessMap;
114 if ( metalness.value<Qt3DRender::QAbstractTexture *>() )
116 mUsingMetalnessMap =
true;
117 mMetalRoughEffect->addParameter( mMetalnessMapParameter );
118 if ( mMetalRoughEffect->parameters().contains( mMetalnessParameter ) )
119 mMetalRoughEffect->removeParameter( mMetalnessParameter );
123 mUsingMetalnessMap =
false;
124 if ( mMetalRoughEffect->parameters().contains( mMetalnessMapParameter ) )
125 mMetalRoughEffect->removeParameter( mMetalnessMapParameter );
126 mMetalRoughEffect->addParameter( mMetalnessParameter );
129 if ( oldUsingMetalnessMap != mUsingMetalnessMap )
130 updateFragmentShader();
133void QgsMetalRoughMaterial::setRoughness(
const QVariant &roughness )
135 mRoughnessParameter->setValue( roughness );
136 mRoughnessMapParameter->setValue( roughness );
137 bool oldUsingRoughnessMap = mUsingRoughnessMap;
139 if ( roughness.value<Qt3DRender::QAbstractTexture *>() )
141 mUsingRoughnessMap =
true;
142 mMetalRoughEffect->addParameter( mRoughnessMapParameter );
143 if ( mMetalRoughEffect->parameters().contains( mRoughnessParameter ) )
144 mMetalRoughEffect->removeParameter( mRoughnessParameter );
148 mUsingRoughnessMap =
false;
149 if ( mMetalRoughEffect->parameters().contains( mRoughnessMapParameter ) )
150 mMetalRoughEffect->removeParameter( mRoughnessMapParameter );
151 mMetalRoughEffect->addParameter( mRoughnessParameter );
154 if ( oldUsingRoughnessMap != mUsingRoughnessMap )
155 updateFragmentShader();
158void QgsMetalRoughMaterial::setAmbientOcclusion(
const QVariant &ambientOcclusion )
160 mAmbientOcclusionMapParameter->setValue( ambientOcclusion );
161 bool oldUsingAmbientOcclusionMap = mUsingAmbientOcclusionMap;
163 if ( ambientOcclusion.value<Qt3DRender::QAbstractTexture *>() )
165 mUsingAmbientOcclusionMap =
true;
166 mMetalRoughEffect->addParameter( mAmbientOcclusionMapParameter );
170 mUsingAmbientOcclusionMap =
false;
171 if ( mMetalRoughEffect->parameters().contains( mAmbientOcclusionMapParameter ) )
172 mMetalRoughEffect->removeParameter( mAmbientOcclusionMapParameter );
175 if ( oldUsingAmbientOcclusionMap != mUsingAmbientOcclusionMap )
176 updateFragmentShader();
179void QgsMetalRoughMaterial::setNormal(
const QVariant &normal )
181 mNormalMapParameter->setValue( normal );
182 bool oldUsingNormalMap = mUsingNormalMap;
184 if ( normal.value<Qt3DRender::QAbstractTexture *>() )
186 mUsingNormalMap =
true;
187 mMetalRoughEffect->addParameter( mNormalMapParameter );
191 mUsingNormalMap =
false;
192 if ( mMetalRoughEffect->parameters().contains( mNormalMapParameter ) )
193 mMetalRoughEffect->removeParameter( mNormalMapParameter );
196 if ( oldUsingNormalMap != mUsingNormalMap )
197 updateFragmentShader();
200void QgsMetalRoughMaterial::setTextureScale(
float textureScale )
202 mTextureScaleParameter->setValue( textureScale );
205void QgsMetalRoughMaterial::init()
207 QObject::connect( mBaseColorParameter, &Qt3DRender::QParameter::valueChanged,
this, &QgsMetalRoughMaterial::baseColorChanged );
208 QObject::connect( mMetalnessParameter, &Qt3DRender::QParameter::valueChanged,
this, &QgsMetalRoughMaterial::metalnessChanged );
209 QObject::connect( mRoughnessParameter, &Qt3DRender::QParameter::valueChanged,
this, &QgsMetalRoughMaterial::roughnessChanged );
210 QObject::connect( mAmbientOcclusionMapParameter, &Qt3DRender::QParameter::valueChanged,
this, &QgsMetalRoughMaterial::ambientOcclusionChanged );
211 QObject::connect( mNormalMapParameter, &Qt3DRender::QParameter::valueChanged,
this, &QgsMetalRoughMaterial::normalChanged );
212 connect( mTextureScaleParameter, &Qt3DRender::QParameter::valueChanged,
this, &QgsMetalRoughMaterial::handleTextureScaleChanged );
214 mMetalRoughGL3Shader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( QStringLiteral(
"qrc:/shaders/default.vert" ) ) ) );
216 updateFragmentShader();
218 mMetalRoughGL3Technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
219 mMetalRoughGL3Technique->graphicsApiFilter()->setMajorVersion( 3 );
220 mMetalRoughGL3Technique->graphicsApiFilter()->setMinorVersion( 1 );
221 mMetalRoughGL3Technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
223 mFilterKey->setParent(
this );
224 mFilterKey->setName( QStringLiteral(
"renderingStyle" ) );
225 mFilterKey->setValue( QStringLiteral(
"forward" ) );
227 mMetalRoughGL3Technique->addFilterKey( mFilterKey );
228 mMetalRoughGL3RenderPass->setShaderProgram( mMetalRoughGL3Shader );
229 mMetalRoughGL3Technique->addRenderPass( mMetalRoughGL3RenderPass );
230 mMetalRoughEffect->addTechnique( mMetalRoughGL3Technique );
233 mBaseColorMapParameter->setParent( mMetalRoughEffect );
234 mMetalnessMapParameter->setParent( mMetalRoughEffect );
235 mRoughnessMapParameter->setParent( mMetalRoughEffect );
237 mMetalRoughEffect->addParameter( mBaseColorParameter );
238 mMetalRoughEffect->addParameter( mMetalnessParameter );
239 mMetalRoughEffect->addParameter( mRoughnessParameter );
240 mMetalRoughEffect->addParameter( mTextureScaleParameter );
242 setEffect( mMetalRoughEffect );
245void QgsMetalRoughMaterial::updateFragmentShader()
248 QByteArray fragmentShaderCode = Qt3DRender::QShaderProgram::loadSource( QUrl( QStringLiteral(
"qrc:/shaders/metalrough.frag" ) ) );
250 if ( mUsingBaseColorMap )
251 defines +=
"BASE_COLOR_MAP";
252 if ( mUsingMetalnessMap )
253 defines +=
"METALNESS_MAP";
254 if ( mUsingRoughnessMap )
255 defines +=
"ROUGHNESS_MAP";
256 if ( mUsingAmbientOcclusionMap )
257 defines +=
"AMBIENT_OCCLUSION_MAP";
258 if ( mUsingNormalMap )
259 defines +=
"NORMAL_MAP";
262 defines +=
"FLAT_SHADING";
265 mMetalRoughGL3Shader->setFragmentShaderCode( finalShaderCode );
268void QgsMetalRoughMaterial::handleTextureScaleChanged(
const QVariant &var )
270 emit textureScaleChanged( var.toFloat() );
273bool QgsMetalRoughMaterial::flatShadingEnabled()
const
278void QgsMetalRoughMaterial::setFlatShadingEnabled(
bool enabled )
280 if ( enabled != mFlatShading )
282 mFlatShading = enabled;
283 updateFragmentShader();
static QByteArray addDefinesToShaderCode(const QByteArray &shaderCode, const QStringList &defines)
Inserts some define macros into a shader source code.
Base class for all materials used within QGIS 3D views.