QGIS API Documentation 3.43.0-Master (69d1901085b)
qgsrenderpassquad.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsrenderpassquad.cpp
3 --------------------------------------
4 Date : June 2022
5 Copyright : (C) 2022 by Belgacem Nedjima
6 Email : belgacem dot nedjima 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
16#include "qgsrenderpassquad.h"
17#include "moc_qgsrenderpassquad.cpp"
18
19#include <random>
20
21#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
22#include <Qt3DRender/QAttribute>
23#include <Qt3DRender/QBuffer>
24#include <Qt3DRender/QGeometry>
25
26typedef Qt3DRender::QAttribute Qt3DQAttribute;
27typedef Qt3DRender::QBuffer Qt3DQBuffer;
28typedef Qt3DRender::QGeometry Qt3DQGeometry;
29#else
30#include <Qt3DCore/QAttribute>
31#include <Qt3DCore/QBuffer>
32#include <Qt3DCore/QGeometry>
33
34typedef Qt3DCore::QAttribute Qt3DQAttribute;
35typedef Qt3DCore::QBuffer Qt3DQBuffer;
36typedef Qt3DCore::QGeometry Qt3DQGeometry;
37#endif
38
39#include <Qt3DRender/QGeometryRenderer>
40#include <Qt3DRender/QTechnique>
41#include <Qt3DRender/QGraphicsApiFilter>
42#include <Qt3DRender/QDepthTest>
43#include <Qt3DRender/QEffect>
44#include <QUrl>
45#include <QVector3D>
46
47QgsRenderPassQuad::QgsRenderPassQuad( Qt3DRender::QLayer *layer, QNode *parent )
48 : Qt3DCore::QEntity() // Qt3D bug: if we set the parent in the super constructor
49 // the entity is not attached properly. We attach it at the constructor end.
50{
51 Qt3DQGeometry *geom = new Qt3DQGeometry( this );
52 Qt3DQAttribute *positionAttribute = new Qt3DQAttribute( this );
53 const QVector<float> vert = { -1.0f, -1.0f, 0.0f, //
54 1.0f, -1.0f, 0.0f, //
55 -1.0f, 1.0f, 0.0f, //
56 -1.0f, 1.0f, 0.0f, //
57 1.0f, -1.0f, 0.0f, //
58 1.0f, 1.0f, 0.0f };
59
60 const QByteArray vertexArr( ( const char * ) vert.constData(), vert.size() * sizeof( float ) );
61 Qt3DQBuffer *vertexBuffer = nullptr;
62 vertexBuffer = new Qt3DQBuffer( this );
63 vertexBuffer->setData( vertexArr );
64
65 positionAttribute->setName( Qt3DQAttribute::defaultPositionAttributeName() );
66 positionAttribute->setVertexBaseType( Qt3DQAttribute::Float );
67 positionAttribute->setVertexSize( 3 );
68 positionAttribute->setAttributeType( Qt3DQAttribute::VertexAttribute );
69 positionAttribute->setBuffer( vertexBuffer );
70 positionAttribute->setByteOffset( 0 );
71 positionAttribute->setByteStride( 3 * sizeof( float ) );
72 positionAttribute->setCount( 6 );
73
74 geom->addAttribute( positionAttribute );
75
76 Qt3DRender::QGeometryRenderer *renderer = new Qt3DRender::QGeometryRenderer( this );
77 renderer->setPrimitiveType( Qt3DRender::QGeometryRenderer::PrimitiveType::Triangles );
78 renderer->setGeometry( geom );
79
80 addComponent( renderer );
81
82 mMaterial = new Qt3DRender::QMaterial( this );
83
84 Qt3DRender::QEffect *effect = new Qt3DRender::QEffect( this );
85 Qt3DRender::QTechnique *technique = new Qt3DRender::QTechnique( this );
86 Qt3DRender::QGraphicsApiFilter *graphicsApiFilter = technique->graphicsApiFilter();
87 graphicsApiFilter->setApi( Qt3DRender::QGraphicsApiFilter::Api::OpenGL );
88 graphicsApiFilter->setProfile( Qt3DRender::QGraphicsApiFilter::OpenGLProfile::CoreProfile );
89 graphicsApiFilter->setMajorVersion( 3 );
90 graphicsApiFilter->setMinorVersion( 1 );
91 Qt3DRender::QRenderPass *renderPass = new Qt3DRender::QRenderPass( this );
92 mShader = new Qt3DRender::QShaderProgram( this );
93
94 renderPass->setShaderProgram( mShader );
95
96 Qt3DRender::QDepthTest *depthTest = new Qt3DRender::QDepthTest( this );
97 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Always );
98
99 renderPass->addRenderState( depthTest );
100
101 technique->addRenderPass( renderPass );
102
103 effect->addTechnique( technique );
104 mMaterial->setEffect( effect );
105
106 addComponent( mMaterial );
107
108 addComponent( layer );
109
110 setParent( parent ); // Needed!
111}
QgsRenderPassQuad(Qt3DRender::QLayer *layer, QNode *parent=nullptr)
Constructor.
Qt3DRender::QShaderProgram * mShader
Qt3DRender::QMaterial * mMaterial
Qt3DCore::QAttribute Qt3DQAttribute
Qt3DCore::QBuffer Qt3DQBuffer
Qt3DCore::QGeometry Qt3DQGeometry
Qt3DCore::QAttribute Qt3DQAttribute
Qt3DCore::QBuffer Qt3DQBuffer
Qt3DCore::QGeometry Qt3DQGeometry