QGIS API Documentation 3.99.0-Master (8e76e220402)
Loading...
Searching...
No Matches
qgsframegraph.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsframegraph.cpp
3 --------------------------------------
4 Date : August 2020
5 Copyright : (C) 2020 by Belgacem Nedjima
6 Email : gb underscore nedjima at esi dot dz
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 "qgsframegraph.h"
17
18#include "qgs3dutils.h"
21#include "qgsdepthrenderview.h"
24#include "qgsframegraphutils.h"
29#include "qgsshadowrenderview.h"
30
31#include <Qt3DCore/QAttribute>
32#include <Qt3DCore/QBuffer>
33#include <Qt3DCore/QGeometry>
34#include <Qt3DRender/QAbstractTexture>
35#include <Qt3DRender/QBlendEquation>
36#include <Qt3DRender/QBlendEquationArguments>
37#include <Qt3DRender/QColorMask>
38#include <Qt3DRender/QGeometryRenderer>
39#include <Qt3DRender/QGraphicsApiFilter>
40#include <Qt3DRender/QNoDepthMask>
41#include <Qt3DRender/QNoDraw>
42#include <Qt3DRender/QSortPolicy>
43#include <Qt3DRender/QTechnique>
44
45#include "moc_qgsframegraph.cpp"
46
47const QString QgsFrameGraph::FORWARD_RENDERVIEW = "forward";
48const QString QgsFrameGraph::SHADOW_RENDERVIEW = "shadow";
49const QString QgsFrameGraph::AXIS3D_RENDERVIEW = "3daxis";
50const QString QgsFrameGraph::DEPTH_RENDERVIEW = "depth";
51const QString QgsFrameGraph::OVERLAY_RENDERVIEW = "overlay_texture";
52const QString QgsFrameGraph::AMBIENT_OCCLUSION_RENDERVIEW = "ambient_occlusion";
53const QString QgsFrameGraph::HIGHLIGHTS_RENDERVIEW = "highlights";
54
55void QgsFrameGraph::constructForwardRenderPass()
56{
57 registerRenderView( std::make_unique<QgsForwardRenderView>( FORWARD_RENDERVIEW, mMainCamera ), FORWARD_RENDERVIEW );
58}
59
60void QgsFrameGraph::constructHighlightsPass()
61{
62 registerRenderView( std::make_unique<QgsHighlightsRenderView>( HIGHLIGHTS_RENDERVIEW, forwardRenderView().renderTargetSelector()->target(), mMainCamera ), HIGHLIGHTS_RENDERVIEW );
63}
64
65void QgsFrameGraph::constructShadowRenderPass()
66{
67 registerRenderView( std::make_unique<QgsShadowRenderView>( SHADOW_RENDERVIEW ), SHADOW_RENDERVIEW );
68}
69
70void QgsFrameGraph::constructOverlayTexturePass( Qt3DRender::QFrameGraphNode *topNode )
71{
72 registerRenderView( std::make_unique<QgsOverlayTextureRenderView>( OVERLAY_RENDERVIEW ), OVERLAY_RENDERVIEW, topNode );
73}
74
75Qt3DRender::QFrameGraphNode *QgsFrameGraph::constructSubPostPassForProcessing()
76{
77 Qt3DRender::QCameraSelector *cameraSelector = new Qt3DRender::QCameraSelector;
78 cameraSelector->setObjectName( "Sub pass Postprocessing" );
79 cameraSelector->setCamera( shadowRenderView().lightCamera() );
80
81 Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter( cameraSelector );
82
83 // could be the first of this branch
84 new Qt3DRender::QClearBuffers( layerFilter );
85
86 Qt3DRender::QLayer *postProcessingLayer = new Qt3DRender::QLayer();
87 mPostprocessingEntity = new QgsPostprocessingEntity( this, postProcessingLayer, mRootEntity );
88 layerFilter->addLayer( postProcessingLayer );
89 mPostprocessingEntity->setObjectName( "PostProcessingPassEntity" );
90
91 return cameraSelector;
92}
93
94Qt3DRender::QFrameGraphNode *QgsFrameGraph::constructSubPostPassForRenderCapture()
95{
96 Qt3DRender::QFrameGraphNode *top = new Qt3DRender::QNoDraw;
97 top->setObjectName( "Sub pass RenderCapture" );
98
99 mRenderCapture = new Qt3DRender::QRenderCapture( top );
100
101 return top;
102}
103
104Qt3DRender::QFrameGraphNode *QgsFrameGraph::constructPostprocessingPass()
105{
106 mRenderCaptureTargetSelector = new Qt3DRender::QRenderTargetSelector;
107 mRenderCaptureTargetSelector->setObjectName( "Postprocessing render pass" );
108 mRenderCaptureTargetSelector->setEnabled( mRenderCaptureEnabled );
109
110 Qt3DRender::QRenderTarget *renderTarget = new Qt3DRender::QRenderTarget( mRenderCaptureTargetSelector );
111
112 // The lifetime of the objects created here is managed
113 // automatically, as they become children of this object.
114
115 // Create a render target output for rendering color.
116 Qt3DRender::QRenderTargetOutput *colorOutput = new Qt3DRender::QRenderTargetOutput( renderTarget );
117 colorOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
118
119 // Create a texture to render into.
120 mRenderCaptureColorTexture = new Qt3DRender::QTexture2D( colorOutput );
121 mRenderCaptureColorTexture->setSize( mSize.width(), mSize.height() );
122 mRenderCaptureColorTexture->setFormat( Qt3DRender::QAbstractTexture::RGB8_UNorm );
123 mRenderCaptureColorTexture->setMinificationFilter( Qt3DRender::QAbstractTexture::Linear );
124 mRenderCaptureColorTexture->setMagnificationFilter( Qt3DRender::QAbstractTexture::Linear );
125 mRenderCaptureColorTexture->setObjectName( "PostProcessingPass::ColorTarget" );
126
127 // Hook the texture up to our output, and the output up to this object.
128 colorOutput->setTexture( mRenderCaptureColorTexture );
129 renderTarget->addOutput( colorOutput );
130
131 Qt3DRender::QRenderTargetOutput *depthOutput = new Qt3DRender::QRenderTargetOutput( renderTarget );
132
133 depthOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Depth );
134 mRenderCaptureDepthTexture = new Qt3DRender::QTexture2D( depthOutput );
135 mRenderCaptureDepthTexture->setSize( mSize.width(), mSize.height() );
136 mRenderCaptureDepthTexture->setFormat( Qt3DRender::QAbstractTexture::DepthFormat );
137 mRenderCaptureDepthTexture->setMinificationFilter( Qt3DRender::QAbstractTexture::Linear );
138 mRenderCaptureDepthTexture->setMagnificationFilter( Qt3DRender::QAbstractTexture::Linear );
139 mRenderCaptureDepthTexture->setComparisonFunction( Qt3DRender::QAbstractTexture::CompareLessEqual );
140 mRenderCaptureDepthTexture->setComparisonMode( Qt3DRender::QAbstractTexture::CompareRefToTexture );
141 mRenderCaptureDepthTexture->setObjectName( "PostProcessingPass::DepthTarget" );
142
143 depthOutput->setTexture( mRenderCaptureDepthTexture );
144 renderTarget->addOutput( depthOutput );
145
146 mRenderCaptureTargetSelector->setTarget( renderTarget );
147
148 // sub passes:
149 constructSubPostPassForProcessing()->setParent( mRenderCaptureTargetSelector );
150 constructOverlayTexturePass( mRenderCaptureTargetSelector );
151 constructSubPostPassForRenderCapture()->setParent( mRenderCaptureTargetSelector );
152
153 return mRenderCaptureTargetSelector;
154}
155
156void QgsFrameGraph::constructAmbientOcclusionRenderPass()
157{
158 Qt3DRender::QTexture2D *forwardDepthTexture = forwardRenderView().depthTexture();
159
160 QgsAmbientOcclusionRenderView *aorv = new QgsAmbientOcclusionRenderView( AMBIENT_OCCLUSION_RENDERVIEW, mMainCamera, mSize, forwardDepthTexture, mRootEntity );
161 registerRenderView( std::unique_ptr<QgsAmbientOcclusionRenderView>( aorv ), AMBIENT_OCCLUSION_RENDERVIEW );
162}
163
164Qt3DRender::QFrameGraphNode *QgsFrameGraph::constructRubberBandsPass()
165{
166 mRubberBandsCameraSelector = new Qt3DRender::QCameraSelector;
167 mRubberBandsCameraSelector->setObjectName( "RubberBands Pass CameraSelector" );
168 mRubberBandsCameraSelector->setCamera( mMainCamera );
169
170 mRubberBandsLayerFilter = new Qt3DRender::QLayerFilter( mRubberBandsCameraSelector );
171 mRubberBandsLayerFilter->addLayer( mRubberBandsLayer );
172
173 Qt3DRender::QBlendEquationArguments *blendState = new Qt3DRender::QBlendEquationArguments;
174 blendState->setSourceRgb( Qt3DRender::QBlendEquationArguments::SourceAlpha );
175 blendState->setDestinationRgb( Qt3DRender::QBlendEquationArguments::OneMinusSourceAlpha );
176
177 Qt3DRender::QBlendEquation *blendEquation = new Qt3DRender::QBlendEquation;
178 blendEquation->setBlendFunction( Qt3DRender::QBlendEquation::Add );
179
180 mRubberBandsStateSet = new Qt3DRender::QRenderStateSet( mRubberBandsLayerFilter );
181 Qt3DRender::QDepthTest *depthTest = new Qt3DRender::QDepthTest;
182 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Always );
183 mRubberBandsStateSet->addRenderState( depthTest );
184 mRubberBandsStateSet->addRenderState( blendState );
185 mRubberBandsStateSet->addRenderState( blendEquation );
186
187 // Here we attach our drawings to the render target also used by forward pass.
188 // This is kind of okay, but as a result, post-processing effects get applied
189 // to rubber bands too. Ideally we would want them on top of everything.
190 mRubberBandsRenderTargetSelector = new Qt3DRender::QRenderTargetSelector( mRubberBandsStateSet );
191 mRubberBandsRenderTargetSelector->setTarget( forwardRenderView().renderTargetSelector()->target() );
192
193 return mRubberBandsCameraSelector;
194}
195
196void QgsFrameGraph::constructDepthRenderPass()
197{
198 // entity used to draw the depth texture and convert it to rgb image
199 Qt3DRender::QTexture2D *forwardDepthTexture = forwardRenderView().depthTexture();
200 QgsDepthRenderView *rv = new QgsDepthRenderView( DEPTH_RENDERVIEW, mSize, forwardDepthTexture, mRootEntity );
201 registerRenderView( std::unique_ptr<QgsDepthRenderView>( rv ), DEPTH_RENDERVIEW );
202}
203
204Qt3DRender::QRenderCapture *QgsFrameGraph::depthRenderCapture()
205{
207}
208
209QgsFrameGraph::QgsFrameGraph( QSurface *surface, QSize s, Qt3DRender::QCamera *mainCamera, Qt3DCore::QEntity *root )
210 : Qt3DCore::QEntity( root )
211 , mSize( s )
212{
213 // general overview of how the frame graph looks:
214 //
215 // +------------------------+ using window or
216 // | QRenderSurfaceSelector | offscreen surface
217 // +------------------------+
218 // |
219 // +-----------+
220 // | QViewport | (0,0,1,1)
221 // +-----------+
222 // |
223 // +--------------------------+-------------------+-----------------+
224 // | | | |
225 // +--------------------+ +--------------+ +-----------------+ +-----------------+
226 // | two forward passes | | shadows pass | | depth buffer | | post-processing |
227 // | (solid objects | | | | processing pass | | passes |
228 // | and transparent) | +--------------+ +-----------------+ +-----------------+
229 // +--------------------+
230 //
231 // Notes:
232 // - depth buffer processing pass is used whenever we need depth map information
233 // (for camera navigation) and it converts depth texture to a color texture
234 // so that we can capture it with QRenderCapture - currently it is unable
235 // to capture depth buffer, only colors (see QTBUG-65155)
236 // - there are multiple post-processing passes that take rendered output
237 // of the scene, optionally apply effects (add shadows, ambient occlusion,
238 // eye dome lighting) and finally output to the given surface
239 // - there may be also two more passes when 3D axis is shown - see Qgs3DAxis
240
241 mRootEntity = root;
242 mMainCamera = mainCamera;
243
244 mRubberBandsLayer = new Qt3DRender::QLayer;
245 mRubberBandsLayer->setObjectName( "mRubberBandsLayer" );
246 mRubberBandsLayer->setRecursive( true );
247
248 mRenderSurfaceSelector = new Qt3DRender::QRenderSurfaceSelector;
249
250 QObject *surfaceObj = dynamic_cast<QObject *>( surface );
251 Q_ASSERT( surfaceObj );
252
253 mRenderSurfaceSelector->setSurface( surfaceObj );
254 mRenderSurfaceSelector->setExternalRenderTargetSize( mSize );
255
256 mMainViewPort = new Qt3DRender::QViewport( mRenderSurfaceSelector );
257 mMainViewPort->setNormalizedRect( QRectF( 0.0f, 0.0f, 1.0f, 1.0f ) );
258
259 // Forward render
260 constructForwardRenderPass();
261
262 // Highlighted items pass
263 constructHighlightsPass();
264
265 // rubber bands (they should be always on top)
266 Qt3DRender::QFrameGraphNode *rubberBandsPass = constructRubberBandsPass();
267 rubberBandsPass->setObjectName( "rubberBandsPass" );
268 rubberBandsPass->setParent( mMainViewPort );
269
270 // shadow rendering pass
271 constructShadowRenderPass();
272
273 // depth buffer processing
274 constructDepthRenderPass();
275
276 // Ambient occlusion factor render pass
277 constructAmbientOcclusionRenderPass();
278
279 // post process
280 Qt3DRender::QFrameGraphNode *postprocessingPass = constructPostprocessingPass();
281 postprocessingPass->setParent( mMainViewPort );
282 postprocessingPass->setObjectName( "PostProcessingPass" );
283
284 mRubberBandsRootEntity = new Qt3DCore::QEntity( mRootEntity );
285 mRubberBandsRootEntity->setObjectName( "mRubberBandsRootEntity" );
286 mRubberBandsRootEntity->addComponent( mRubberBandsLayer );
287}
288
289void QgsFrameGraph::unregisterRenderView( const QString &name )
290{
291 if ( mRenderViewMap.find( name ) != mRenderViewMap.end() )
292 {
293 mRenderViewMap[name]->topGraphNode()->setParent( ( QNode * ) nullptr );
294 mRenderViewMap.erase( name );
295 }
296}
297
298bool QgsFrameGraph::registerRenderView( std::unique_ptr<QgsAbstractRenderView> renderView, const QString &name, Qt3DRender::QFrameGraphNode *topNode )
299{
300 bool out;
301 if ( mRenderViewMap.find( name ) == mRenderViewMap.end() )
302 {
303 mRenderViewMap[name] = std::move( renderView );
304 mRenderViewMap[name]->topGraphNode()->setParent( topNode ? topNode : mMainViewPort );
305 mRenderViewMap[name]->updateWindowResize( mSize.width(), mSize.height() );
306 out = true;
307 }
308 else
309 out = false;
310
311 return out;
312}
313
314void QgsFrameGraph::setRenderViewEnabled( const QString &name, bool enable )
315{
316 if ( mRenderViewMap[name] )
317 {
318 mRenderViewMap[name]->setEnabled( enable );
319 }
320}
321
323{
324 if ( mRenderViewMap.find( name ) != mRenderViewMap.end() )
325 {
326 return mRenderViewMap[name].get();
327 }
328 return nullptr;
329}
330
331bool QgsFrameGraph::isRenderViewEnabled( const QString &name )
332{
333 return mRenderViewMap[name] != nullptr && mRenderViewMap[name]->isEnabled();
334}
335
337{
339
340 aoRenderView.setRadius( settings.radius() );
341 aoRenderView.setIntensity( settings.intensity() );
342 aoRenderView.setThreshold( settings.threshold() );
343 aoRenderView.setEnabled( settings.isEnabled() );
344
345 mPostprocessingEntity->setAmbientOcclusionEnabled( settings.isEnabled() );
346}
347
349{
350 mPostprocessingEntity->setEyeDomeLightingEnabled( settings.eyeDomeLightingEnabled() );
351 mPostprocessingEntity->setEyeDomeLightingStrength( settings.eyeDomeLightingStrength() );
352 mPostprocessingEntity->setEyeDomeLightingDistance( settings.eyeDomeLightingDistance() );
353}
354
355void QgsFrameGraph::updateShadowSettings( const QgsShadowSettings &shadowSettings, const QList<QgsLightSource *> &lightSources )
356{
357 if ( shadowSettings.renderShadows() )
358 {
359 int selectedLight = shadowSettings.selectedDirectionalLight();
360 QgsDirectionalLightSettings *light = nullptr;
361 for ( int i = 0, dirLight = 0; !light && i < lightSources.size(); i++ )
362 {
363 if ( lightSources[i]->type() == Qgis::LightSourceType::Directional )
364 {
365 if ( dirLight == selectedLight )
366 light = qgis::down_cast< QgsDirectionalLightSettings * >( lightSources[i] );
367 dirLight++;
368 }
369 }
370
371 if ( light )
372 {
373 shadowRenderView().setMapSize( shadowSettings.shadowMapResolution(), shadowSettings.shadowMapResolution() );
375 mPostprocessingEntity->setShadowRenderingEnabled( true );
376 mPostprocessingEntity->setShadowBias( static_cast<float>( shadowSettings.shadowBias() ) );
377 mPostprocessingEntity->updateShadowSettings( *light, static_cast<float>( shadowSettings.maximumShadowRenderingDistance() ) );
378 }
379 }
380 else
381 {
382 shadowRenderView().setEnabled( false );
383 mPostprocessingEntity->setShadowRenderingEnabled( false );
384 }
385}
386
388{
389 QgsOverlayTextureRenderView *debugRenderView = dynamic_cast<QgsOverlayTextureRenderView *>( mRenderViewMap[OVERLAY_RENDERVIEW].get() );
390 if ( !debugRenderView )
391 return;
392
393 if ( !mShadowTextureDebugging && settings.debugShadowMapEnabled() )
394 {
395 Qt3DRender::QTexture2D *shadowDepthTexture = shadowRenderView().mapTexture();
396 mShadowTextureDebugging = new QgsOverlayTextureEntity( shadowDepthTexture, debugRenderView->overlayLayer(), this );
397 }
398
399 debugRenderView->setEnabled( settings.debugShadowMapEnabled() || settings.debugDepthMapEnabled() || settings.is2DMapOverlayEnabled() );
400
401 if ( mShadowTextureDebugging )
402 {
403 mShadowTextureDebugging->setEnabled( settings.debugShadowMapEnabled() );
404 if ( settings.debugShadowMapEnabled() )
405 mShadowTextureDebugging->setPosition( settings.debugShadowMapCorner(), settings.debugShadowMapSize() );
406 else
407 {
408 delete mShadowTextureDebugging;
409 mShadowTextureDebugging = nullptr;
410 }
411 }
412}
413
415{
416 QgsOverlayTextureRenderView *debugRenderView = dynamic_cast<QgsOverlayTextureRenderView *>( mRenderViewMap[OVERLAY_RENDERVIEW].get() );
417 if ( !debugRenderView )
418 return;
419
420 if ( !mDepthTextureDebugging && settings.debugDepthMapEnabled() )
421 {
422 Qt3DRender::QTexture2D *forwardDepthTexture = forwardRenderView().depthTexture();
423 mDepthTextureDebugging = new QgsOverlayTextureEntity( forwardDepthTexture, debugRenderView->overlayLayer(), this );
424 }
425
426 debugRenderView->setEnabled( settings.debugShadowMapEnabled() || settings.debugDepthMapEnabled() || settings.is2DMapOverlayEnabled() );
427
428 if ( mDepthTextureDebugging )
429 {
430 mDepthTextureDebugging->setEnabled( settings.debugDepthMapEnabled() );
431 if ( settings.debugDepthMapEnabled() )
432 mDepthTextureDebugging->setPosition( settings.debugDepthMapCorner(), settings.debugDepthMapSize() );
433 else
434 {
435 delete mDepthTextureDebugging;
436 mDepthTextureDebugging = nullptr;
437 }
438 }
439}
440
442{
443 QObject *top = mRenderSurfaceSelector;
444 while ( top->parent() && dynamic_cast<Qt3DRender::QFrameGraphNode *>( top->parent() ) )
445 top = top->parent();
446
448 context.lowestId = mMainCamera->id().id();
449 QStringList strList = QgsFrameGraphUtils::dumpFrameGraph( dynamic_cast<Qt3DRender::QFrameGraphNode *>( top ), context );
450
451 return strList.join( "\n" ) + QString( "\n" );
452}
453
455{
456 QStringList strList = QgsFrameGraphUtils::dumpSceneGraph( mRootEntity, QgsFrameGraphUtils::FgDumpContext() );
457 return strList.join( "\n" ) + QString( "\n" );
458}
459
460void QgsFrameGraph::setClearColor( const QColor &clearColor )
461{
462 forwardRenderView().setClearColor( clearColor );
463}
464
469
471{
472 mSize = s;
473 for ( auto it = mRenderViewMap.begin(); it != mRenderViewMap.end(); ++it )
474 {
475 QgsAbstractRenderView *rv = it->second.get();
476 rv->updateWindowResize( mSize.width(), mSize.height() );
477 }
478
479 mRenderCaptureColorTexture->setSize( mSize.width(), mSize.height() );
480 mRenderCaptureDepthTexture->setSize( mSize.width(), mSize.height() );
481 mRenderSurfaceSelector->setExternalRenderTargetSize( mSize );
482}
483
484Qt3DRender::QRenderCapture *QgsFrameGraph::renderCapture()
485{
486 return mRenderCapture;
487}
488
490{
491 if ( enabled == mRenderCaptureEnabled )
492 return;
493 mRenderCaptureEnabled = enabled;
494 mRenderCaptureTargetSelector->setEnabled( mRenderCaptureEnabled );
495}
496
501
506
507void QgsFrameGraph::addClipPlanes( int nrClipPlanes )
508{
509 forwardRenderView().addClipPlanes( nrClipPlanes );
510}
511
513{
515 return *( dynamic_cast<QgsForwardRenderView *>( rv ) );
516}
517
519{
521 return *( dynamic_cast<QgsShadowRenderView *>( rv ) );
522}
523
525{
526 QgsAbstractRenderView *rv = mRenderViewMap[QgsFrameGraph::DEPTH_RENDERVIEW].get();
527 return *( dynamic_cast<QgsDepthRenderView *>( rv ) );
528}
529
535
541
@ Directional
Directional light source.
Definition qgis.h:4227
Definition of the world.
Qt::Corner debugDepthMapCorner() const
Returns the corner where the shadow map preview is displayed.
bool debugDepthMapEnabled() const
Returns whether the shadow map debugging is enabled.
double eyeDomeLightingStrength() const
Returns the eye dome lighting strength value.
Qt::Corner debugShadowMapCorner() const
Returns the corner where the shadow map preview is displayed.
double debugDepthMapSize() const
Returns the size of the shadow map preview.
bool is2DMapOverlayEnabled() const
Returns whether 2D map overlay is enabled.
int eyeDomeLightingDistance() const
Returns the eye dome lighting distance value (contributes to the contrast of the image).
double debugShadowMapSize() const
Returns the size of the shadow map preview.
bool debugShadowMapEnabled() const
Returns whether the shadow map debugging is enabled.
bool eyeDomeLightingEnabled() const
Returns whether eye dome lighting is used.
Base class for 3D render view.
virtual void setEnabled(bool enable)
Enable or disable via enable the render view sub tree.
virtual bool isEnabled() const
Returns true if render view is enabled.
virtual void updateWindowResize(int width, int height)
Called when 3D window is resized.
Container class that holds different objects related to ambient occlusion rendering.
void setRadius(float radius)
Delegates to QgsAmbientOcclusionRenderEntity::setRadius.
void setEnabled(bool enable) override
Enable or disable via enable the render view sub tree.
void setIntensity(float intensity)
Delegates to QgsAmbientOcclusionRenderEntity::setIntensity.
void setThreshold(float threshold)
Delegates to QgsAmbientOcclusionRenderEntity::setThreshold.
Contains the configuration of ambient occlusion rendering.
float radius() const
Returns the radius parameter of the ambient occlusion effect.
bool isEnabled() const
Returns whether ambient occlusion effect is enabled.
float intensity() const
Returns the shading factor of the ambient occlusion effect.
float threshold() const
Returns at what amount of occlusion the effect will kick in.
Container class that holds different objects related to depth rendering.
Qt3DRender::QRenderCapture * renderCapture()
Returns the render capture object used to take an image of the depth buffer of the scene.
Definition of a directional light in a 3D map scene.
Container class that holds different objects related to forward rendering.
void setClearColor(const QColor &clearColor)
Sets the clear color of the scene (background color).
void setDebugOverlayEnabled(bool enabled)
Sets whether debug overlay is enabled.
void setFrustumCullingEnabled(bool enabled)
Sets whether frustum culling is enabled.
Qt3DRender::QTexture2D * depthTexture() const
Returns forward depth texture.
void addClipPlanes(int nrClipPlanes)
Setups nrClipPlanes clip planes in the forward pass to enable OpenGL clipping.
void removeClipPlanes()
Disables OpenGL clipping.
static QStringList dumpFrameGraph(const Qt3DCore::QNode *node, FgDumpContext context)
Returns a tree view of the frame graph starting from node. The object ids will be given relatively to...
static QStringList dumpSceneGraph(const Qt3DCore::QNode *node, FgDumpContext context)
Returns a tree view of the scene graph starting from node. The object ids will be given relatively to...
void updateAmbientOcclusionSettings(const QgsAmbientOcclusionSettings &settings)
Updates settings for ambient occlusion.
void updateEyeDomeSettings(const Qgs3DMapSettings &settings)
Updates settings for eye dome lighting.
bool isRenderViewEnabled(const QString &name)
Returns true if the render view named name is found and enabled.
void setRenderViewEnabled(const QString &name, bool enable)
Enables or disables the render view named name according to enable.
void updateShadowSettings(const QgsShadowSettings &shadowSettings, const QList< QgsLightSource * > &lightSources)
Updates shadow bias, light and texture size according to shadowSettings and lightSources.
void addClipPlanes(int nrClipPlanes)
Setups nrClipPlanes clip planes in the forward pass to enable OpenGL clipping.
void unregisterRenderView(const QString &name)
Unregisters the render view named name, if any.
bool registerRenderView(std::unique_ptr< QgsAbstractRenderView > renderView, const QString &name, Qt3DRender::QFrameGraphNode *topNode=nullptr)
Registers a new the render view renderView with name name.
QString dumpFrameGraph() const
Dumps frame graph as string.
void setRenderCaptureEnabled(bool enabled)
Sets whether it will be possible to render to an image.
QgsAmbientOcclusionRenderView & ambientOcclusionRenderView()
Returns ambient occlusion renderview.
Qt3DRender::QRenderCapture * depthRenderCapture()
Returns the render capture object used to take an image of the depth buffer of the scene.
void updateDebugShadowMapSettings(const Qgs3DMapSettings &settings)
Updates settings for shadows debug map.
QgsAbstractRenderView * renderView(const QString &name)
Returns the render view named name, if any.
void removeClipPlanes()
Disables OpenGL clipping.
static const QString AMBIENT_OCCLUSION_RENDERVIEW
Ambient occlusion render view name.
QgsDepthRenderView & depthRenderView()
Returns depth renderview.
void setClearColor(const QColor &clearColor)
Sets the clear color of the scene (background color).
static const QString FORWARD_RENDERVIEW
void setFrustumCullingEnabled(bool enabled)
Sets whether frustum culling is enabled.
static const QString SHADOW_RENDERVIEW
void setDebugOverlayEnabled(bool enabled)
Sets whether debug overlay is enabled.
static const QString HIGHLIGHTS_RENDERVIEW
QgsHighlightsRenderView & highlightsRenderView()
Returns the highlights renderview, used for rendering highlight overlays of identified features.
static const QString OVERLAY_RENDERVIEW
void updateDebugDepthMapSettings(const Qgs3DMapSettings &settings)
Updates settings for depth debug map.
static const QString AXIS3D_RENDERVIEW
QgsForwardRenderView & forwardRenderView()
Returns forward renderview.
QgsOverlayTextureRenderView & overlayTextureRenderView()
Returns overlay texture renderview.
QString dumpSceneGraph() const
Dumps scene graph as string.
QgsShadowRenderView & shadowRenderView()
Returns shadow renderview.
void setSize(QSize s)
Sets the size of the buffers used for rendering.
static const QString DEPTH_RENDERVIEW
Qt3DRender::QCamera * mainCamera()
Returns the main camera.
QgsFrameGraph(QSurface *surface, QSize s, Qt3DRender::QCamera *mainCamera, Qt3DCore::QEntity *root)
Constructor.
Qt3DRender::QRenderCapture * renderCapture()
Returns the render capture object used to take an image of the scene.
Container class that holds different objects related to highlighting identified features.
An entity responsible for rendering an overlay texture in 3D view.
Simple render view to preview overlay textures in 3D view.
Qt3DRender::QLayer * overlayLayer() const
Returns layer in which entities must be added in the in order to be processed by this renderview.
Container class that holds different objects related to shadow rendering.
void setMapSize(int width, int height)
Update shadow depth texture size.
void setEnabled(bool enable) override
Enable or disable via enable the renderview sub tree.
Qt3DRender::QTexture2D * mapTexture() const
Returns shadow depth texture.
Contains configuration for rendering shadows.
int selectedDirectionalLight() const
Returns the selected direcctional light used to cast shadows.
bool renderShadows() const
Returns whether shadow rendering is enabled.
int shadowMapResolution() const
Returns the resolution of the shadow map texture used to generate the shadows.
double maximumShadowRenderingDistance() const
Returns the maximum shadow rendering distance accounted for when rendering shadows Objects further aw...
double shadowBias() const
Returns the shadow bias used to correct the numerical imprecision of shadows (for the depth test) Thi...