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