QGIS API Documentation 4.1.0-Master (376402f9aeb)
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 "qgs3dutils.h"
19
20#include <QString>
21#include <QUrl>
22#include <Qt3DRender/QEffect>
23#include <Qt3DRender/QGraphicsApiFilter>
24#include <Qt3DRender/QParameter>
25#include <Qt3DRender/QTechnique>
26
27#include "moc_qgsphongtexturedmaterial.cpp"
28
29using namespace Qt::StringLiterals;
30
32QgsPhongTexturedMaterial::QgsPhongTexturedMaterial( QNode *parent )
33 : QgsMaterial( parent )
34 , mAmbientParameter( new Qt3DRender::QParameter( u"ambientColor"_s, QVariant() ) )
35 , mDiffuseTextureParameter( new Qt3DRender::QParameter( u"diffuseTexture"_s, QVariant() ) )
36 , mDiffuseTextureScaleParameter( new Qt3DRender::QParameter( u"texCoordScale"_s, 1.0f ) )
37 , mDiffuseTextureRotationParameter( new Qt3DRender::QParameter( u"texCoordRotation"_s, 0.0f ) )
38 , mSpecularParameter( new Qt3DRender::QParameter( u"specularColor"_s, QVariant() ) )
39 , mShininessParameter( new Qt3DRender::QParameter( u"shininess"_s, 150.0f ) )
40 , mOpacityParameter( new Qt3DRender::QParameter( u"opacity"_s, 1.0f ) )
41{
42 setAmbient( QColor::fromRgbF( 0.05f, 0.05f, 0.05f, 1.0f ) );
43 setSpecular( QColor::fromRgbF( 0.01f, 0.01f, 0.01f, 1.0f ) );
44 init();
45}
46
47QgsPhongTexturedMaterial::~QgsPhongTexturedMaterial() = default;
48
49
50void QgsPhongTexturedMaterial::init()
51{
52 Qt3DRender::QEffect *effect = new Qt3DRender::QEffect();
53 effect->addParameter( mAmbientParameter );
54 effect->addParameter( mDiffuseTextureParameter );
55 effect->addParameter( mDiffuseTextureScaleParameter );
56 effect->addParameter( mDiffuseTextureRotationParameter );
57 effect->addParameter( mSpecularParameter );
58 effect->addParameter( mShininessParameter );
59 effect->addParameter( mOpacityParameter );
60
61 Qt3DRender::QShaderProgram *gL3Shader = new Qt3DRender::QShaderProgram();
62
63 const QByteArray vertexShaderCode = Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/default.vert"_s ) );
64 const QByteArray finalVertexShaderCode = Qgs3DUtils::addDefinesToShaderCode( vertexShaderCode, QStringList( { "TEXTURE_ROTATION" } ) );
65 gL3Shader->setVertexShaderCode( finalVertexShaderCode );
66
67 gL3Shader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/diffuseSpecular.frag"_s ) ) );
68
69 Qt3DRender::QTechnique *gL3Technique = new Qt3DRender::QTechnique();
70 gL3Technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
71 gL3Technique->graphicsApiFilter()->setMajorVersion( 3 );
72 gL3Technique->graphicsApiFilter()->setMinorVersion( 1 );
73 gL3Technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
74
75 Qt3DRender::QFilterKey *filterKey = new Qt3DRender::QFilterKey( this );
76 filterKey->setName( u"renderingStyle"_s );
77 filterKey->setValue( u"forward"_s );
78
79 gL3Technique->addFilterKey( filterKey );
80
81 Qt3DRender::QRenderPass *gL3RenderPass = new Qt3DRender::QRenderPass();
82 gL3RenderPass->setShaderProgram( gL3Shader );
83 gL3Technique->addRenderPass( gL3RenderPass );
84 effect->addTechnique( gL3Technique );
85
86 setEffect( effect );
87}
88
89void QgsPhongTexturedMaterial::setAmbient( const QColor &ambient )
90{
91 mAmbientParameter->setValue( Qgs3DUtils::srgbToLinear( ambient ) );
92}
93
94void QgsPhongTexturedMaterial::setDiffuseTexture( Qt3DRender::QAbstractTexture *diffuseTexture )
95{
96 mDiffuseTextureParameter->setValue( QVariant::fromValue( diffuseTexture ) );
97}
98
99void QgsPhongTexturedMaterial::setDiffuseTextureScale( float diffuseTextureScale )
100{
101 mDiffuseTextureScaleParameter->setValue( diffuseTextureScale );
102}
103
104void QgsPhongTexturedMaterial::setDiffuseTextureRotation( float textureRotation )
105{
106 mDiffuseTextureRotationParameter->setValue( textureRotation );
107}
108
109void QgsPhongTexturedMaterial::setSpecular( const QColor &specular )
110{
111 mSpecularParameter->setValue( Qgs3DUtils::srgbToLinear( specular ) );
112}
113
114void QgsPhongTexturedMaterial::setShininess( float shininess )
115{
116 mShininessParameter->setValue( shininess );
117}
118
119void QgsPhongTexturedMaterial::setOpacity( float opacity )
120{
121 mOpacityParameter->setValue( opacity );
122}
123
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