QGIS API Documentation 4.1.0-Master (01362494303)
Loading...
Searching...
No Matches
qgsgradientbackgroundentity.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsgradientbackgroundentity.cpp
3 --------------------------------------
4 Date : April 2026
5 Copyright : (C) 2026 by Dominik Cindrić
6 Email : viper dot miniq 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
20#include <QString>
21#include <QUrl>
22#include <QVector>
23#include <QVector3D>
24#include <Qt3DCore/QAttribute>
25#include <Qt3DCore/QBuffer>
26#include <Qt3DCore/QGeometry>
27#include <Qt3DRender/QDepthTest>
28#include <Qt3DRender/QEffect>
29#include <Qt3DRender/QFilterKey>
30#include <Qt3DRender/QGeometryRenderer>
31#include <Qt3DRender/QGraphicsApiFilter>
32#include <Qt3DRender/QMaterial>
33#include <Qt3DRender/QNoDepthMask>
34#include <Qt3DRender/QParameter>
35#include <Qt3DRender/QRenderPass>
36#include <Qt3DRender/QShaderProgram>
37#include <Qt3DRender/QTechnique>
38
39#include "moc_qgsgradientbackgroundentity.cpp"
40
41using namespace Qt::StringLiterals;
42
43QgsGradientBackgroundEntity::QgsGradientBackgroundEntity( const QColor &topColor, const QColor &bottomColor, Qt3DCore::QNode *parent )
44 : Qt3DCore::QEntity( parent )
45 , mEffect( new Qt3DRender::QEffect( this ) )
46 , mMaterial( new Qt3DRender::QMaterial( this ) )
47 , mGl3Technique( new Qt3DRender::QTechnique( this ) )
48 , mFilterKey( new Qt3DRender::QFilterKey( this ) )
49 , mGl3RenderPass( new Qt3DRender::QRenderPass( this ) )
50 , mMesh( new Qt3DRender::QGeometryRenderer( this ) )
51 , mGlShader( new Qt3DRender::QShaderProgram( this ) )
52 , mTopColorParameter( new Qt3DRender::QParameter( u"topColor"_s, QVariant() ) )
53 , mBottomColorParameter( new Qt3DRender::QParameter( u"bottomColor"_s, QVariant() ) )
54{
55 const QColor linearTopColor = Qgs3DUtils::srgbToLinear( topColor );
56 const QColor linearBottomColor = Qgs3DUtils::srgbToLinear( bottomColor );
57 mTopColorParameter->setValue( QVector3D( linearTopColor.redF(), linearTopColor.greenF(), linearTopColor.blueF() ) );
58 mBottomColorParameter->setValue( QVector3D( linearBottomColor.redF(), linearBottomColor.greenF(), linearBottomColor.blueF() ) );
59
60 mGl3Technique->graphicsApiFilter()->setApi( Qt3DRender::QGraphicsApiFilter::OpenGL );
61 mGl3Technique->graphicsApiFilter()->setMajorVersion( 3 );
62 mGl3Technique->graphicsApiFilter()->setMinorVersion( 3 );
63 mGl3Technique->graphicsApiFilter()->setProfile( Qt3DRender::QGraphicsApiFilter::CoreProfile );
64
65 mFilterKey->setParent( mEffect );
66 mFilterKey->setName( u"renderingStyle"_s );
67 mFilterKey->setValue( u"forward"_s );
68
69 mGl3Technique->addFilterKey( mFilterKey );
70
71 Qt3DRender::QDepthTest *depthTest = new Qt3DRender::QDepthTest();
72 depthTest->setDepthFunction( Qt3DRender::QDepthTest::LessOrEqual );
73 Qt3DRender::QNoDepthMask *noDepthMask = new Qt3DRender::QNoDepthMask();
74
75 mGl3RenderPass->addRenderState( depthTest );
76 mGl3RenderPass->addRenderState( noDepthMask );
77
78 mGlShader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/gradient_static.vert"_s ) ) );
79 mGlShader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( u"qrc:/shaders/gradient_background.frag"_s ) ) );
80 mGl3RenderPass->setShaderProgram( mGlShader );
81
82 mGl3Technique->addRenderPass( mGl3RenderPass );
83 mEffect->addTechnique( mGl3Technique );
84
85 mMaterial->setEffect( mEffect );
86 mMaterial->addParameter( mTopColorParameter );
87 mMaterial->addParameter( mBottomColorParameter );
88
89 Qt3DCore::QGeometry *geom = new Qt3DCore::QGeometry( this );
90 Qt3DCore::QAttribute *posAttr = new Qt3DCore::QAttribute( this );
91 // clang-format off
92 const QVector<float> verts = { -1.0f, -1.0f, 0.0f,
93 1.0f, -1.0f, 0.0f,
94 -1.0f, 1.0f, 0.0f,
95 -1.0f, 1.0f, 0.0f,
96 1.0f, -1.0f, 0.0f,
97 1.0f, 1.0f, 0.0f };
98 // clang-format on
99 Qt3DCore::QBuffer *vbo = new Qt3DCore::QBuffer( this );
100 vbo->setData( QByteArray( reinterpret_cast<const char *>( verts.constData() ), verts.size() * sizeof( float ) ) );
101 posAttr->setName( Qt3DCore::QAttribute::defaultPositionAttributeName() );
102 posAttr->setVertexBaseType( Qt3DCore::QAttribute::Float );
103 posAttr->setVertexSize( 3 );
104 posAttr->setAttributeType( Qt3DCore::QAttribute::VertexAttribute );
105 posAttr->setBuffer( vbo );
106 posAttr->setByteStride( 3 * sizeof( float ) );
107 posAttr->setCount( 6 );
108 geom->addAttribute( posAttr );
109 mMesh->setPrimitiveType( Qt3DRender::QGeometryRenderer::Triangles );
110 mMesh->setGeometry( geom );
111
112 addComponent( mMesh );
113 addComponent( mMaterial );
114}
static QColor srgbToLinear(const QColor &color)
Converts a SRGB color to a linear color.
QgsGradientBackgroundEntity(const QColor &topColor, const QColor &bottomColor, Qt3DCore::QNode *parent=nullptr)
Constructs a gradient background entity.