QGIS API Documentation 4.1.0-Master (64dc32379c2)
Loading...
Searching...
No Matches
qgsgoochmaterial.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsgoochmaterial.cpp
3 --------------------------------------
4 Date : April 2026
5 Copyright : (C) 2026 by Dominik Cindrić
6 Email : viper dot miniq 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
16#include "qgsgoochmaterial.h"
17
18#include "qgs3dutils.h"
19
20#include <QString>
21#include <QUrl>
22#include <Qt3DRender/QEffect>
23#include <Qt3DRender/QFilterKey>
24#include <Qt3DRender/QGraphicsApiFilter>
25#include <Qt3DRender/QParameter>
26#include <Qt3DRender/QRenderPass>
27#include <Qt3DRender/QShaderProgram>
28#include <Qt3DRender/QTechnique>
29
30#include "moc_qgsgoochmaterial.cpp"
31
32using namespace Qt::StringLiterals;
33
35QgsGoochMaterial::QgsGoochMaterial( QNode *parent )
36 : QgsMaterial( parent )
37 , mDiffuseParameter( new Qt3DRender::QParameter( u"kd"_s, QVariant() ) )
38 , mSpecularParameter( new Qt3DRender::QParameter( u"ks"_s, QVariant() ) )
39 , mWarmParameter( new Qt3DRender::QParameter( u"kyellow"_s, QVariant() ) )
40 , mCoolParameter( new Qt3DRender::QParameter( u"kblue"_s, QVariant() ) )
41 , mShininessParameter( new Qt3DRender::QParameter( u"shininess"_s, 100.0f ) )
42 , mAlphaParameter( new Qt3DRender::QParameter( u"alpha"_s, 0.25f ) )
43 , mBetaParameter( new Qt3DRender::QParameter( u"beta"_s, 0.5f ) )
44{
45 setDiffuse( QColor::fromRgbF( 0.7f, 0.7f, 0.7f, 1.0f ) );
46 setSpecular( QColor::fromRgbF( 1.0f, 1.0f, 1.0f, 1.0f ) );
47 setWarm( QColor::fromRgbF( 0.42f, 0.0f, 0.42f, 1.0f ) );
48 setCool( QColor::fromRgbF( 1.0f, 0.51f, 0.0f, 1.0f ) );
49 init();
50}
51
52QgsGoochMaterial::~QgsGoochMaterial() = default;
53
54void QgsGoochMaterial::init()
55{
56 Qt3DRender::QEffect *effect = new Qt3DRender::QEffect();
57 effect->addParameter( mDiffuseParameter );
58 effect->addParameter( mSpecularParameter );
59 effect->addParameter( mWarmParameter );
60 effect->addParameter( mCoolParameter );
61 effect->addParameter( mShininessParameter );
62 effect->addParameter( mAlphaParameter );
63 effect->addParameter( mBetaParameter );
64
65 mShaderProgram = new Qt3DRender::QShaderProgram();
66
67 Qt3DRender::QRenderPass *renderPass = new Qt3DRender::QRenderPass();
68 renderPass->setShaderProgram( mShaderProgram );
69
70 Qt3DRender::QFilterKey *filterKey = new Qt3DRender::QFilterKey();
71 filterKey->setName( u"renderingStyle"_s );
72 filterKey->setValue( u"forward"_s );
73
74 Qt3DRender::QTechnique *technique = new Qt3DRender::QTechnique();
75 technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
76 technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
77 technique->graphicsApiFilter()->setMajorVersion( 3 );
78 technique->graphicsApiFilter()->setMinorVersion( 3 );
79 technique->addFilterKey( filterKey );
80 technique->addRenderPass( renderPass );
81
82 effect->addTechnique( technique );
83 setEffect( effect );
84
85 updateShaders();
86}
87
88void QgsGoochMaterial::updateShaders()
89{
90 const QByteArray fragCode = Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/gooch.frag"_s ) );
91
92 if ( mDataDefinedEnabled )
93 {
94 mShaderProgram->setShaderCode( Qt3DRender::QShaderProgram::Vertex, Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/goochDataDefined.vert"_s ) ) );
95 mShaderProgram->setFragmentShaderCode( Qgs3DUtils::addDefinesToShaderCode( fragCode, QStringList( { u"DATA_DEFINED"_s } ) ) );
96 }
97 else
98 {
99 mShaderProgram->setShaderCode( Qt3DRender::QShaderProgram::Vertex, Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/default.vert"_s ) ) );
100 mShaderProgram->setFragmentShaderCode( fragCode );
101 }
102}
103
104void QgsGoochMaterial::setDataDefinedEnabled( bool enabled )
105{
106 if ( enabled != mDataDefinedEnabled )
107 {
108 mDataDefinedEnabled = enabled;
109 updateShaders();
110 }
111}
112
113void QgsGoochMaterial::setDiffuse( const QColor &diffuse )
114{
115 mDiffuseParameter->setValue( Qgs3DUtils::srgbToLinear( diffuse ) );
116}
117
118void QgsGoochMaterial::setSpecular( const QColor &specular )
119{
120 mSpecularParameter->setValue( Qgs3DUtils::srgbToLinear( specular ) );
121}
122
123void QgsGoochMaterial::setWarm( const QColor &warm )
124{
125 mWarmParameter->setValue( Qgs3DUtils::srgbToLinear( warm ) );
126}
127
128void QgsGoochMaterial::setCool( const QColor &cool )
129{
130 mCoolParameter->setValue( Qgs3DUtils::srgbToLinear( cool ) );
131}
132
133void QgsGoochMaterial::setShininess( float shininess )
134{
135 mShininessParameter->setValue( shininess );
136}
137
138void QgsGoochMaterial::setAlpha( float alpha )
139{
140 mAlphaParameter->setValue( alpha );
141}
142
143void QgsGoochMaterial::setBeta( float beta )
144{
145 mBetaParameter->setValue( beta );
146}
147
static QByteArray addDefinesToShaderCode(const QByteArray &shaderCode, const QStringList &defines)
Inserts some define macros into a shader source code.
static QColor srgbToLinear(const QColor &color)
Converts a SRGB color to a linear color.
Base class for all materials used within QGIS 3D views.
Definition qgsmaterial.h:40