QGIS API Documentation 3.99.0-Master (26c88405ac0)
Loading...
Searching...
No Matches
qgsambientocclusionrenderview.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsambientocclusionrenderview.cpp
3 --------------------------------------
4 Date : May 2025
5 Copyright : (C) 2025 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
17
20
21#include <Qt3DRender/QCamera>
22#include <Qt3DRender/QCameraSelector>
23#include <Qt3DRender/QCullFace>
24#include <Qt3DRender/QDepthTest>
25#include <Qt3DRender/QLayer>
26#include <Qt3DRender/QLayerFilter>
27#include <Qt3DRender/QRenderStateSet>
28#include <Qt3DRender/QRenderTarget>
29#include <Qt3DRender/QRenderTargetSelector>
30#include <Qt3DRender/QTexture>
31#include <Qt3DRender/qsubtreeenabler.h>
32
33QgsAmbientOcclusionRenderView::QgsAmbientOcclusionRenderView( const QString &viewName, Qt3DRender::QCamera *mainCamera, QSize mSize, Qt3DRender::QTexture2D *forwardDepthTexture, Qt3DCore::QEntity *rootSceneEntity )
34 : QgsAbstractRenderView( viewName )
35{
36 mAOPassLayer = new Qt3DRender::QLayer;
37 mAOPassLayer->setRecursive( true );
38 mAOPassLayer->setObjectName( mViewName + "::Layer(AO)" );
39
40 mBlurPassLayer = new Qt3DRender::QLayer;
41 mBlurPassLayer->setRecursive( true );
42 mBlurPassLayer->setObjectName( mViewName + "::Layer(Blur)" );
43
44 // ambient occlusion rendering pass
45 buildRenderPasses( mSize, forwardDepthTexture, rootSceneEntity, mainCamera );
46}
47
49{
50 mAOPassTexture->setSize( width, height );
51 mBlurPassTexture->setSize( width, height );
52}
53
55{
57 mAmbientOcclusionRenderEntity->setEnabled( enable );
58 mAmbientOcclusionBlurEntity->setEnabled( enable );
59}
60
61Qt3DRender::QRenderTarget *QgsAmbientOcclusionRenderView::buildAOTexture( QSize mSize )
62{
63 // Create a texture to render into.
64 Qt3DRender::QRenderTargetOutput *colorTargetOutput = new Qt3DRender::QRenderTargetOutput;
65 colorTargetOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
66
67 mAOPassTexture = new Qt3DRender::QTexture2D( colorTargetOutput );
68 mAOPassTexture->setSize( mSize.width(), mSize.height() );
69 mAOPassTexture->setFormat( Qt3DRender::QAbstractTexture::R32F );
70 mAOPassTexture->setMinificationFilter( Qt3DRender::QAbstractTexture::Linear );
71 mAOPassTexture->setMagnificationFilter( Qt3DRender::QAbstractTexture::Linear );
72 mAOPassTexture->setObjectName( mViewName + "::ColorTarget(AO)" );
73 colorTargetOutput->setTexture( mAOPassTexture );
74
75 Qt3DRender::QRenderTarget *renderTarget = new Qt3DRender::QRenderTarget;
76 renderTarget->addOutput( colorTargetOutput );
77
78 return renderTarget;
79}
80
81Qt3DRender::QRenderTarget *QgsAmbientOcclusionRenderView::buildBlurTexture( QSize mSize )
82{
83 // Create a texture to render into.
84 Qt3DRender::QRenderTargetOutput *colorTargetOutput = new Qt3DRender::QRenderTargetOutput;
85 colorTargetOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
86
87 mBlurPassTexture = new Qt3DRender::QTexture2D( colorTargetOutput );
88 mBlurPassTexture->setSize( mSize.width(), mSize.height() );
89 mBlurPassTexture->setFormat( Qt3DRender::QAbstractTexture::R32F );
90 mBlurPassTexture->setMinificationFilter( Qt3DRender::QAbstractTexture::Linear );
91 mBlurPassTexture->setMagnificationFilter( Qt3DRender::QAbstractTexture::Linear );
92 mBlurPassTexture->setObjectName( mViewName + "::ColorTarget(blur)" );
93 colorTargetOutput->setTexture( mBlurPassTexture );
94
95 Qt3DRender::QRenderTarget *renderTarget = new Qt3DRender::QRenderTarget;
96 renderTarget->addOutput( colorTargetOutput );
97
98 return renderTarget;
99}
100
101void QgsAmbientOcclusionRenderView::buildRenderPasses( QSize mSize, Qt3DRender::QTexture2D *forwardDepthTexture, Qt3DCore::QEntity *rootSceneEntity, Qt3DRender::QCamera *mainCamera )
102{
103 // AO pass
104 {
105 Qt3DRender::QRenderStateSet *renderStateSet = new Qt3DRender::QRenderStateSet( mRendererEnabler );
106
107 Qt3DRender::QDepthTest *depthRenderDepthTest = new Qt3DRender::QDepthTest;
108 depthRenderDepthTest->setDepthFunction( Qt3DRender::QDepthTest::Always );
109 Qt3DRender::QCullFace *depthRenderCullFace = new Qt3DRender::QCullFace;
110 depthRenderCullFace->setMode( Qt3DRender::QCullFace::NoCulling );
111
112 renderStateSet->addRenderState( depthRenderDepthTest );
113 renderStateSet->addRenderState( depthRenderCullFace );
114
115 Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter( renderStateSet );
116 layerFilter->addLayer( mAOPassLayer );
117
118 Qt3DRender::QRenderTarget *renderTarget = buildAOTexture( mSize );
119
120 Qt3DRender::QRenderTargetSelector *renderTargetSelector = new Qt3DRender::QRenderTargetSelector( layerFilter );
121 renderTargetSelector->setObjectName( mViewName + "::RenderTargetSelector(AO)" );
122 renderTargetSelector->setTarget( renderTarget );
123
124 mAmbientOcclusionRenderEntity = new QgsAmbientOcclusionRenderEntity( forwardDepthTexture, mAOPassLayer, mainCamera, rootSceneEntity );
125 }
126
127 // blur pass
128 {
129 Qt3DRender::QRenderStateSet *renderStateSet = new Qt3DRender::QRenderStateSet( mRendererEnabler );
130
131 Qt3DRender::QDepthTest *depthRenderDepthTest = new Qt3DRender::QDepthTest;
132 depthRenderDepthTest->setDepthFunction( Qt3DRender::QDepthTest::Always );
133 Qt3DRender::QCullFace *depthRenderCullFace = new Qt3DRender::QCullFace;
134 depthRenderCullFace->setMode( Qt3DRender::QCullFace::NoCulling );
135
136 renderStateSet->addRenderState( depthRenderDepthTest );
137 renderStateSet->addRenderState( depthRenderCullFace );
138
139 Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter( renderStateSet );
140 layerFilter->addLayer( mBlurPassLayer );
141
142 Qt3DRender::QRenderTarget *renderTarget = buildBlurTexture( mSize );
143
144 Qt3DRender::QRenderTargetSelector *renderTargetSelector = new Qt3DRender::QRenderTargetSelector( layerFilter );
145 renderTargetSelector->setObjectName( mViewName + "::RenderTargetSelector(Blur)" );
146 renderTargetSelector->setTarget( renderTarget );
147
148 mAmbientOcclusionBlurEntity = new QgsAmbientOcclusionBlurEntity( mAOPassTexture, mBlurPassLayer, rootSceneEntity );
149 }
150}
151
153{
154 mAmbientOcclusionRenderEntity->setIntensity( intensity );
155}
156
158{
159 mAmbientOcclusionRenderEntity->setRadius( radius );
160}
161
163{
164 mAmbientOcclusionRenderEntity->setThreshold( threshold );
165}
166
168{
169 return mBlurPassTexture;
170}
Qt3DRender::QSubtreeEnabler * mRendererEnabler
virtual void setEnabled(bool enable)
Enable or disable via enable the render view sub tree.
QgsAbstractRenderView(const QString &viewName)
Constructor for QgsAbstractRenderView with the specified parent object.
void setRadius(float radius)
Delegates to QgsAmbientOcclusionRenderEntity::setRadius.
void setEnabled(bool enable) override
Enable or disable via enable the render view sub tree.
void updateWindowResize(int width, int height) override
Called when 3D window is resized.
QgsAmbientOcclusionRenderView(const QString &viewName, Qt3DRender::QCamera *mainCamera, QSize mSize, Qt3DRender::QTexture2D *forwardDepthTexture, Qt3DCore::QEntity *rootSceneEntity)
Default constructor.
void setIntensity(float intensity)
Delegates to QgsAmbientOcclusionRenderEntity::setIntensity.
void setThreshold(float threshold)
Delegates to QgsAmbientOcclusionRenderEntity::setThreshold.
Qt3DRender::QTexture2D * blurredFactorMapTexture() const
Returns blur pass texture.