QGIS API Documentation 3.43.0-Master (0bee5d6404c)
qgsdepthrenderview.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsdepthrenderview.cpp
3 --------------------------------------
4 Date : August 2022
5 Copyright : (C) 2022 by Benoit De Mezzo and (C) 2020 by Belgacem Nedjima
6 Email : benoit dot de dot mezzo at oslandia 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 "qgsdepthrenderview.h"
17#include <Qt3DRender/QCamera>
18#include <Qt3DRender/QLayerFilter>
19#include <Qt3DRender/QLayer>
20#include <Qt3DRender/QRenderTargetSelector>
21#include <Qt3DRender/QRenderTarget>
22#include <Qt3DRender/QTexture>
23#include <Qt3DRender/QClearBuffers>
24#include <Qt3DRender/qsubtreeenabler.h>
25#include <Qt3DRender/QCameraSelector>
26#include <Qt3DRender/QRenderStateSet>
27#include <Qt3DRender/QDepthTest>
28#include <Qt3DRender/QCullFace>
29#include <Qt3DRender/QRenderCapture>
30#include "qgsdepthentity.h"
31
32
33QgsDepthRenderView::QgsDepthRenderView( const QString &viewName, QSize size, Qt3DRender::QTexture2D *forwardDepthTexture, Qt3DCore::QEntity *rootSceneEntity )
34 : QgsAbstractRenderView( viewName )
35{
36 mLayer = new Qt3DRender::QLayer;
37 mLayer->setRecursive( true );
38 mLayer->setObjectName( mViewName + "::Layer" );
39
40 // depth rendering pass
41 buildRenderPass( size, forwardDepthTexture, rootSceneEntity );
42}
43
44void QgsDepthRenderView::updateWindowResize( int width, int height )
45{
46 mColorTexture->setSize( width, height );
47}
48
49Qt3DRender::QRenderTarget *QgsDepthRenderView::buildTextures( QSize size )
50{
51 // depth buffer render to copy pass
52 // Create a render target output for rendering color.
53 Qt3DRender::QRenderTargetOutput *colorOutput = new Qt3DRender::QRenderTargetOutput;
54 colorOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
55
56 // Create a texture to render into.
57 mColorTexture = new Qt3DRender::QTexture2D( colorOutput );
58 mColorTexture->setSize( size.width(), size.height() );
59 mColorTexture->setFormat( Qt3DRender::QAbstractTexture::RGB8_UNorm );
60 mColorTexture->setMinificationFilter( Qt3DRender::QAbstractTexture::Linear );
61 mColorTexture->setMagnificationFilter( Qt3DRender::QAbstractTexture::Linear );
62 mColorTexture->setObjectName( mViewName + "::mColorTexture" );
63
64 // Hook the texture up to our output, and the output up to this object.
65 colorOutput->setTexture( mColorTexture );
66
67 Qt3DRender::QRenderTarget *renderTarget = new Qt3DRender::QRenderTarget;
68 renderTarget->setObjectName( mViewName + "::RenderTarget" );
69 renderTarget->addOutput( colorOutput );
70
71 return renderTarget;
72}
73
74void QgsDepthRenderView::buildRenderPass( QSize size, Qt3DRender::QTexture2D *forwardDepthTexture, Qt3DCore::QEntity *rootSceneEntity )
75{
76 // depth buffer render to copy pass
77 Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter( mRendererEnabler );
78 layerFilter->addLayer( mLayer );
79
80 Qt3DRender::QRenderTargetSelector *renderTargetSelector = new Qt3DRender::QRenderTargetSelector( layerFilter );
81
82 // build texture part
83 Qt3DRender::QRenderTarget *renderTarget = buildTextures( size );
84
85 renderTargetSelector->setTarget( renderTarget );
86
87 // Note: We do not a clear buffers node since we are drawing a quad that will override the buffer's content anyway
88 mDepthRenderCapture = new Qt3DRender::QRenderCapture( renderTargetSelector );
89
90 // entity used to draw the depth texture and convert it to rgb image
91 new QgsDepthEntity( forwardDepthTexture, mLayer, rootSceneEntity );
92}
Base class for 3D render view.
Qt3DRender::QSubtreeEnabler * mRendererEnabler
An entity that is responsible for capturing depth.
virtual void updateWindowResize(int width, int height) override
Called when 3D window is resized.
QgsDepthRenderView(const QString &viewName, QSize size, Qt3DRender::QTexture2D *forwardDepthTexture, Qt3DCore::QEntity *rootSceneEntity)
Constructor.