QGIS API Documentation 4.1.0-Master (3fcefe620d1)
Loading...
Searching...
No Matches
qgshighlightmaterial.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgshighlightmaterial.cpp
3 ---------------------
4 begin : December 2025
5 copyright : (C) 2025 by Stefanos Natsis
6 email : uclaros 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
17
18#include "qgs3dutils.h"
19#include "qgssettings.h"
20
21#include <QColor>
22#include <QString>
23#include <QUrl>
24#include <Qt3DRender/QEffect>
25#include <Qt3DRender/QGraphicsApiFilter>
26#include <Qt3DRender/QParameter>
27#include <Qt3DRender/QRenderPass>
28#include <Qt3DRender/QShaderProgram>
29#include <Qt3DRender/QTechnique>
30
31#include "moc_qgshighlightmaterial.cpp"
32
33using namespace Qt::StringLiterals;
34
36
37QgsHighlightMaterial::QgsHighlightMaterial( QNode *parent )
38 : QgsMaterial( parent )
39 , mTransformParameter( new Qt3DRender::QParameter( u"meshMatrix"_s, QVariant::fromValue( QMatrix4x4() ), this ) )
40 , mNormalTransformParameter( new Qt3DRender::QParameter( u"meshNormalMatrix"_s, QVariant::fromValue( QMatrix3x3() ), this ) )
41{
42 init();
43}
44
45QgsHighlightMaterial::~QgsHighlightMaterial() = default;
46
47void QgsHighlightMaterial::init()
48{
49 Qt3DRender::QEffect *effect = new Qt3DRender::QEffect;
50 Qt3DRender::QTechnique *technique = new Qt3DRender::QTechnique;
51 technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
52 technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
53 technique->graphicsApiFilter()->setMajorVersion( 3 );
54 technique->graphicsApiFilter()->setMinorVersion( 3 );
55
56 Qt3DRender::QRenderPass *pass = new Qt3DRender::QRenderPass;
57
58 mShaderProgram = new Qt3DRender::QShaderProgram();
59 pass->setShaderProgram( mShaderProgram );
60
61 mShaderProgram->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/singlecolor.frag"_s ) ) );
62
63 const QgsSettings settings;
64 const float alpha = settings.value( u"Map/highlight/colorAlpha"_s, Qgis::DEFAULT_HIGHLIGHT_COLOR.alpha() ).toFloat() / 255.f;
65 QColor color = QColor( settings.value( u"Map/highlight/color"_s, Qgis::DEFAULT_HIGHLIGHT_COLOR.name() ).toString() );
66 color.setAlphaF( alpha );
67 Qt3DRender::QParameter *colorParam = new Qt3DRender::QParameter( u"color"_s, Qgs3DUtils::srgbToLinear( color ) );
68 pass->addParameter( colorParam );
69
70 technique->addRenderPass( pass );
71 effect->addTechnique( technique );
72 effect->addParameter( mTransformParameter );
73 effect->addParameter( mNormalTransformParameter );
74 setEffect( effect );
75
76
77 updateShaders();
78}
79
80void QgsHighlightMaterial::setInstancingEnabled( bool enabled, Qgis::InstancedMaterialFlags flags )
81{
82 mInstanced = enabled;
83 mInstanceFlags = flags;
84 updateShaders();
85}
86
87void QgsHighlightMaterial::setInstancingMeshTransform( const QMatrix4x4 &transform )
88{
89 const QMatrix3x3 normalTransform = transform.normalMatrix();
90 mTransformParameter->setValue( QVariant::fromValue( transform ) );
91 mNormalTransformParameter->setValue( QVariant::fromValue( normalTransform ) );
92}
93
94void QgsHighlightMaterial::updateShaders()
95{
96 if ( mInstanced )
97 {
98 QStringList defines;
99 if ( mInstanceFlags.testFlag( Qgis::InstancedMaterialFlag::DataDefinedScale ) )
100 defines << u"USE_INSTANCE_SCALE"_s;
101 if ( mInstanceFlags.testFlag( Qgis::InstancedMaterialFlag::DataDefinedRotation ) )
102 defines << u"USE_INSTANCE_ROTATION"_s;
103 const QByteArray vertCode = Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/instanced.vert"_s ) );
104 mShaderProgram->setShaderCode( Qt3DRender::QShaderProgram::Vertex, Qgs3DUtils::addDefinesToShaderCode( vertCode, defines ) );
105 }
106 else
107 {
108 mShaderProgram->setShaderCode( Qt3DRender::QShaderProgram::Vertex, Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/default.vert"_s ) ) );
109 }
110}
111
static const QColor DEFAULT_HIGHLIGHT_COLOR
Default highlight color.
Definition qgis.h:6900
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.
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
Stores settings for use within QGIS.
Definition qgssettings.h:68
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.