QGIS API Documentation 4.1.0-Master (3fcefe620d1)
Loading...
Searching...
No Matches
qgstexturematerial.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgstexturematerial.cpp
3 --------------------------------------
4 Date : March 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
16#include "qgstexturematerial.h"
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/QRenderPass>
26#include <Qt3DRender/QShaderProgram>
27#include <Qt3DRender/QTechnique>
28#include <Qt3DRender/QTexture>
29
30#include "moc_qgstexturematerial.cpp"
31
32using namespace Qt::StringLiterals;
33
35QgsTextureMaterial::QgsTextureMaterial( QNode *parent )
36 : QgsMaterial( parent )
37 , mTextureParameter( new Qt3DRender::QParameter( u"diffuseTexture"_s, new Qt3DRender::QTexture2D ) )
38 , mGL3Technique( new Qt3DRender::QTechnique( this ) )
39 , mGL3RenderPass( new Qt3DRender::QRenderPass( this ) )
40 , mGL3Shader( new Qt3DRender::QShaderProgram( this ) )
41 , mFilterKey( new Qt3DRender::QFilterKey( this ) )
42 , mTransformParameter( new Qt3DRender::QParameter( u"meshMatrix"_s, QVariant::fromValue( QMatrix4x4() ), this ) )
43{
44 init();
45}
46
47QgsTextureMaterial::~QgsTextureMaterial() = default;
48
49
50void QgsTextureMaterial::init()
51{
52 Qt3DRender::QEffect *effect = new Qt3DRender::QEffect();
53
54 effect->addParameter( mTextureParameter );
55
56 mGL3Shader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/texture.frag"_s ) ) );
57 mGL3Shader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/texture.vert"_s ) ) );
58
59 mGL3Technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
60 mGL3Technique->graphicsApiFilter()->setMajorVersion( 3 );
61 mGL3Technique->graphicsApiFilter()->setMinorVersion( 1 );
62 mGL3Technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
63
64 mFilterKey->setParent( this );
65 mFilterKey->setName( u"renderingStyle"_s );
66 mFilterKey->setValue( u"forward"_s );
67
68 mGL3Technique->addFilterKey( mFilterKey );
69 mGL3RenderPass->setShaderProgram( mGL3Shader );
70 mGL3Technique->addRenderPass( mGL3RenderPass );
71 effect->addTechnique( mGL3Technique );
72 effect->addParameter( mTransformParameter );
73
74 setEffect( effect );
75}
76
77void QgsTextureMaterial::setTexture( Qt3DRender::QAbstractTexture *texture )
78{
79 mTextureParameter->setValue( QVariant::fromValue( texture ) );
80}
81
82Qt3DRender::QAbstractTexture *QgsTextureMaterial::texture() const
83{
84 return mTextureParameter->value().value<Qt3DRender::QAbstractTexture *>();
85}
86
87void QgsTextureMaterial::setInstancingEnabled( bool enabled, Qgis::InstancedMaterialFlags flags )
88{
89 mInstanced = enabled;
90 mInstanceFlags = flags;
91
92 if ( mInstanced )
93 {
94 QStringList defines = { u"HAS_TEXTURE"_s };
95 if ( mInstanceFlags.testFlag( Qgis::InstancedMaterialFlag::DataDefinedScale ) )
96 defines << u"USE_INSTANCE_SCALE"_s;
97 if ( mInstanceFlags.testFlag( Qgis::InstancedMaterialFlag::DataDefinedRotation ) )
98 defines << u"USE_INSTANCE_ROTATION"_s;
99 const QByteArray vertCode = Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/instanced.vert"_s ) );
100 mGL3Shader->setVertexShaderCode( Qgs3DUtils::addDefinesToShaderCode( vertCode, defines ) );
101 }
102 else
103 {
104 mGL3Shader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/texture.vert"_s ) ) );
105 }
106}
107
108void QgsTextureMaterial::setInstancingMeshTransform( const QMatrix4x4 &transform )
109{
110 mTransformParameter->setValue( QVariant::fromValue( transform ) );
111}
112
QFlags< InstancedMaterialFlag > InstancedMaterialFlags
Definition qgis.h:4398
@ DataDefinedRotation
Per-instance data-defined rotation.
Definition qgis.h:4395
@ DataDefinedScale
Per-instance data-defined scale.
Definition qgis.h:4394
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.
Definition qgsmaterial.h:40