QGIS API Documentation 3.99.0-Master (357b655ed83)
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 "qgssettings.h"
19
20#include <QColor>
21#include <QString>
22#include <QUrl>
23#include <Qt3DRender/QEffect>
24#include <Qt3DRender/QGraphicsApiFilter>
25#include <Qt3DRender/QParameter>
26#include <Qt3DRender/QTechnique>
27
28#include "moc_qgshighlightmaterial.cpp"
29
30using namespace Qt::StringLiterals;
31
33
34QgsHighlightMaterial::QgsHighlightMaterial( QgsMaterialSettingsRenderingTechnique technique, QNode *parent )
35 : QgsMaterial( parent )
36{
37 init( technique );
38}
39
40QgsHighlightMaterial::~QgsHighlightMaterial() = default;
41
42void QgsHighlightMaterial::init( QgsMaterialSettingsRenderingTechnique renderingTechnique )
43{
44 Qt3DRender::QEffect *effect = new Qt3DRender::QEffect;
45 Qt3DRender::QTechnique *technique = new Qt3DRender::QTechnique;
46 technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
47 technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
48 technique->graphicsApiFilter()->setMajorVersion( 3 );
49 technique->graphicsApiFilter()->setMinorVersion( 3 );
50
51 Qt3DRender::QRenderPass *pass = new Qt3DRender::QRenderPass;
52
53 Qt3DRender::QShaderProgram *shaderProgram = new Qt3DRender::QShaderProgram;
54 switch ( renderingTechnique )
55 {
60 {
61 shaderProgram->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/default.vert"_s ) ) );
62 break;
63 }
65 {
66 shaderProgram->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/instanced.vert"_s ) ) );
67 break;
68 }
71 {
72 // Lines are single color and do not need the highlight material
73 // Billboards are not supported yet
74 break;
75 }
76 }
77
78 shaderProgram->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/singlecolor.frag"_s ) ) );
79 pass->setShaderProgram( shaderProgram );
80
81 const QgsSettings settings;
82 const float alpha = settings.value( u"Map/highlight/colorAlpha"_s, Qgis::DEFAULT_HIGHLIGHT_COLOR.alpha() ).toFloat() / 255.f;
83 QColor color = QColor( settings.value( u"Map/highlight/color"_s, Qgis::DEFAULT_HIGHLIGHT_COLOR.name() ).toString() );
84 color.setAlphaF( alpha );
85 Qt3DRender::QParameter *colorParam = new Qt3DRender::QParameter( u"color"_s, color );
86 pass->addParameter( colorParam );
87
88 technique->addRenderPass( pass );
89 effect->addTechnique( technique );
90 setEffect( effect );
91}
92
static const QColor DEFAULT_HIGHLIGHT_COLOR
Default highlight color.
Definition qgis.h:6496
Base class for all materials used within QGIS 3D views.
Definition qgsmaterial.h:39
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.
QgsMaterialSettingsRenderingTechnique
Material rendering techniques.
@ Points
Point based rendering, requires point data.
@ Triangles
Triangle based rendering (default).
@ TrianglesFromModel
Triangle based rendering, using a model object source.
@ Lines
Line based rendering, requires line data.
@ TrianglesDataDefined
Triangle based rendering with possibility of datadefined color.
@ InstancedPoints
Instanced based rendering, requiring triangles and point data.
@ TrianglesWithFixedTexture
Triangle based rendering, using a fixed, non-user-configurable texture (e.g. for terrain rendering).