QGIS API Documentation 3.99.0-Master (09f76ad7019)
Loading...
Searching...
No Matches
qgsphongtexturedmaterial.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsphongtexturedmaterial.cpp
3 --------------------------------------
4 Date : August 2024
5 Copyright : (C) 2024 by Jean Felder
6 Email : jean dot felder at oslandia 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 <QString>
19#include <QUrl>
20#include <Qt3DRender/QEffect>
21#include <Qt3DRender/QGraphicsApiFilter>
22#include <Qt3DRender/QParameter>
23#include <Qt3DRender/QTechnique>
24
25#include "moc_qgsphongtexturedmaterial.cpp"
26
27using namespace Qt::StringLiterals;
28
30QgsPhongTexturedMaterial::QgsPhongTexturedMaterial( QNode *parent )
31 : QgsMaterial( parent )
32 , mAmbientParameter( new Qt3DRender::QParameter( u"ambientColor"_s, QColor::fromRgbF( 0.05f, 0.05f, 0.05f, 1.0f ) ) )
33 , mDiffuseTextureParameter( new Qt3DRender::QParameter( u"diffuseTexture"_s, QVariant() ) )
34 , mDiffuseTextureScaleParameter( new Qt3DRender::QParameter( u"texCoordScale"_s, 1.0f ) )
35 , mSpecularParameter( new Qt3DRender::QParameter( u"specularColor"_s, QColor::fromRgbF( 0.01f, 0.01f, 0.01f, 1.0f ) ) )
36 , mShininessParameter( new Qt3DRender::QParameter( u"shininess"_s, 150.0f ) )
37 , mOpacityParameter( new Qt3DRender::QParameter( u"opacity"_s, 1.0f ) )
38{
39 init();
40}
41
42QgsPhongTexturedMaterial::~QgsPhongTexturedMaterial() = default;
43
44
45void QgsPhongTexturedMaterial::init()
46{
47 connect( mAmbientParameter, &Qt3DRender::QParameter::valueChanged, this, &QgsPhongTexturedMaterial::handleAmbientChanged );
48 connect( mDiffuseTextureParameter, &Qt3DRender::QParameter::valueChanged, this, &QgsPhongTexturedMaterial::handleDiffuseTextureChanged );
49 connect( mDiffuseTextureScaleParameter, &Qt3DRender::QParameter::valueChanged, this, &QgsPhongTexturedMaterial::handleDiffuseTextureScaleChanged );
50 connect( mSpecularParameter, &Qt3DRender::QParameter::valueChanged, this, &QgsPhongTexturedMaterial::handleSpecularChanged );
51 connect( mShininessParameter, &Qt3DRender::QParameter::valueChanged, this, &QgsPhongTexturedMaterial::handleShininessChanged );
52 connect( mOpacityParameter, &Qt3DRender::QParameter::valueChanged, this, &QgsPhongTexturedMaterial::handleOpacityChanged );
53
54 Qt3DRender::QEffect *effect = new Qt3DRender::QEffect();
55 effect->addParameter( mAmbientParameter );
56 effect->addParameter( mDiffuseTextureParameter );
57 effect->addParameter( mDiffuseTextureScaleParameter );
58 effect->addParameter( mSpecularParameter );
59 effect->addParameter( mShininessParameter );
60 effect->addParameter( mOpacityParameter );
61
62 Qt3DRender::QShaderProgram *gL3Shader = new Qt3DRender::QShaderProgram();
63 gL3Shader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/default.vert"_s ) ) );
64 gL3Shader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/diffuseSpecular.frag"_s ) ) );
65
66 Qt3DRender::QTechnique *gL3Technique = new Qt3DRender::QTechnique();
67 gL3Technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
68 gL3Technique->graphicsApiFilter()->setMajorVersion( 3 );
69 gL3Technique->graphicsApiFilter()->setMinorVersion( 1 );
70 gL3Technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
71
72 Qt3DRender::QFilterKey *filterKey = new Qt3DRender::QFilterKey( this );
73 filterKey->setName( u"renderingStyle"_s );
74 filterKey->setValue( u"forward"_s );
75
76 gL3Technique->addFilterKey( filterKey );
77
78 Qt3DRender::QRenderPass *gL3RenderPass = new Qt3DRender::QRenderPass();
79 gL3RenderPass->setShaderProgram( gL3Shader );
80 gL3Technique->addRenderPass( gL3RenderPass );
81 effect->addTechnique( gL3Technique );
82
83 setEffect( effect );
84}
85
86void QgsPhongTexturedMaterial::setAmbient( const QColor &ambient )
87{
88 mAmbientParameter->setValue( ambient );
89}
90
91void QgsPhongTexturedMaterial::setDiffuseTexture( Qt3DRender::QAbstractTexture *diffuseTexture )
92{
93 mDiffuseTextureParameter->setValue( QVariant::fromValue( diffuseTexture ) );
94}
95
96void QgsPhongTexturedMaterial::setDiffuseTextureScale( float diffuseTextureScale )
97{
98 mDiffuseTextureScaleParameter->setValue( diffuseTextureScale );
99}
100
101void QgsPhongTexturedMaterial::setSpecular( const QColor &specular )
102{
103 mSpecularParameter->setValue( specular );
104}
105
106void QgsPhongTexturedMaterial::setShininess( float shininess )
107{
108 mShininessParameter->setValue( shininess );
109}
110
111void QgsPhongTexturedMaterial::setOpacity( float opacity )
112{
113 mOpacityParameter->setValue( opacity );
114}
115
116QColor QgsPhongTexturedMaterial::ambient() const
117{
118 return mAmbientParameter->value().value<QColor>();
119}
120
121Qt3DRender::QAbstractTexture *QgsPhongTexturedMaterial::diffuseTexture() const
122{
123 return mDiffuseTextureParameter->value().value<Qt3DRender::QAbstractTexture *>();
124}
125
126float QgsPhongTexturedMaterial::diffuseTextureScale() const
127{
128 return mDiffuseTextureScaleParameter->value().toFloat();
129}
130
131QColor QgsPhongTexturedMaterial::specular() const
132{
133 return mSpecularParameter->value().value<QColor>();
134}
135
136float QgsPhongTexturedMaterial::shininess() const
137{
138 return mShininessParameter->value().toFloat();
139}
140
141float QgsPhongTexturedMaterial::opacity() const
142{
143 return mOpacityParameter->value().toFloat();
144}
145
146void QgsPhongTexturedMaterial::handleAmbientChanged( const QVariant &var )
147{
148 emit ambientChanged( var.value<QColor>() );
149}
150
151void QgsPhongTexturedMaterial::handleDiffuseTextureChanged( const QVariant &var )
152{
153 emit diffuseTextureChanged( var.value<Qt3DRender::QAbstractTexture *>() );
154}
155
156void QgsPhongTexturedMaterial::handleDiffuseTextureScaleChanged( const QVariant &var )
157{
158 emit diffuseTextureScaleChanged( var.toFloat() );
159}
160
161void QgsPhongTexturedMaterial::handleSpecularChanged( const QVariant &var )
162{
163 emit specularChanged( var.value<QColor>() );
164}
165
166void QgsPhongTexturedMaterial::handleShininessChanged( const QVariant &var )
167{
168 emit shininessChanged( var.toFloat() );
169}
170
171void QgsPhongTexturedMaterial::handleOpacityChanged( const QVariant &var )
172{
173 emit opacityChanged( var.toFloat() );
174}
175
Base class for all materials used within QGIS 3D views.
Definition qgsmaterial.h:39