QGIS API Documentation 4.1.0-Master (4aad578bf8d)
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, mRootEntity ), 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::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter();
78
79 // could be the first of this branch
80 new Qt3DRender::QClearBuffers( layerFilter );
81
82 Qt3DRender::QLayer *postProcessingLayer = new Qt3DRender::QLayer();
83 mPostprocessingEntity = new QgsPostprocessingEntity( this, postProcessingLayer, mRootEntity );
84 layerFilter->addLayer( postProcessingLayer );
85 mPostprocessingEntity->setObjectName( "PostProcessingPassEntity" );
86
87 return layerFilter;
88}
89
90Qt3DRender::QFrameGraphNode *QgsFrameGraph::constructSubPostPassForRenderCapture()
91{
92 Qt3DRender::QFrameGraphNode *top = new Qt3DRender::QNoDraw;
93 top->setObjectName( "Sub pass RenderCapture" );
94
95 mRenderCapture = new Qt3DRender::QRenderCapture( top );
96
97 return top;
98}
99
100Qt3DRender::QFrameGraphNode *QgsFrameGraph::constructPostprocessingPass()
101{
102 mRenderCaptureTargetSelector = new Qt3DRender::QRenderTargetSelector;
103 mRenderCaptureTargetSelector->setObjectName( "Postprocessing render pass" );
104 mRenderCaptureTargetSelector->setEnabled( mRenderCaptureEnabled );
105
106 Qt3DRender::QRenderTarget *renderTarget = new Qt3DRender::QRenderTarget( mRenderCaptureTargetSelector );
107
108 // The lifetime of the objects created here is managed
109 // automatically, as they become children of this object.
110
111 // Create a render target output for rendering color.
112 Qt3DRender::QRenderTargetOutput *colorOutput = new Qt3DRender::QRenderTargetOutput( renderTarget );
113 colorOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
114
115 // Create a texture to render into.
116 mRenderCaptureColorTexture = new Qt3DRender::QTexture2D( colorOutput );
117 mRenderCaptureColorTexture->setSize( mSize.width(), mSize.height() );
118 mRenderCaptureColorTexture->setFormat( Qt3DRender::QAbstractTexture::RGB8_UNorm );
119 mRenderCaptureColorTexture->setMinificationFilter( Qt3DRender::QAbstractTexture::Linear );
120 mRenderCaptureColorTexture->setMagnificationFilter( Qt3DRender::QAbstractTexture::Linear );
121 mRenderCaptureColorTexture->setObjectName( "PostProcessingPass::ColorTarget" );
122
123 // Hook the texture up to our output, and the output up to this object.
124 colorOutput->setTexture( mRenderCaptureColorTexture );
125 renderTarget->addOutput( colorOutput );
126
127 Qt3DRender::QRenderTargetOutput *depthOutput = new Qt3DRender::QRenderTargetOutput( renderTarget );
128
129 depthOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Depth );
130 mRenderCaptureDepthTexture = new Qt3DRender::QTexture2D( depthOutput );
131 mRenderCaptureDepthTexture->setSize( mSize.width(), mSize.height() );
132 mRenderCaptureDepthTexture->setFormat( Qt3DRender::QAbstractTexture::DepthFormat );
133 mRenderCaptureDepthTexture->setMinificationFilter( Qt3DRender::QAbstractTexture::Linear );
134 mRenderCaptureDepthTexture->setMagnificationFilter( Qt3DRender::QAbstractTexture::Linear );
135 mRenderCaptureDepthTexture->setComparisonFunction( Qt3DRender::QAbstractTexture::CompareLessEqual );
136 mRenderCaptureDepthTexture->setComparisonMode( Qt3DRender::QAbstractTexture::CompareRefToTexture );
137 mRenderCaptureDepthTexture->setObjectName( "PostProcessingPass::DepthTarget" );
138
139 depthOutput->setTexture( mRenderCaptureDepthTexture );
140 renderTarget->addOutput( depthOutput );
141
142 mRenderCaptureTargetSelector->setTarget( renderTarget );
143
144 // sub passes:
145 constructSubPostPassForProcessing()->setParent( mRenderCaptureTargetSelector );
146 constructOverlayTexturePass( mRenderCaptureTargetSelector );
147 constructSubPostPassForRenderCapture()->setParent( mRenderCaptureTargetSelector );
148
149 return mRenderCaptureTargetSelector;
150}
151
152void QgsFrameGraph::constructAmbientOcclusionRenderPass()
153{
154 Qt3DRender::QTexture2D *forwardDepthTexture = forwardRenderView().depthTexture();
155
156 QgsAmbientOcclusionRenderView *aorv = new QgsAmbientOcclusionRenderView( AMBIENT_OCCLUSION_RENDERVIEW, mMainCamera, mSize, forwardDepthTexture, mRootEntity );
157 registerRenderView( std::unique_ptr<QgsAmbientOcclusionRenderView>( aorv ), AMBIENT_OCCLUSION_RENDERVIEW );
158}
159
160Qt3DRender::QFrameGraphNode *QgsFrameGraph::constructRubberBandsPass()
161{
162 mRubberBandsCameraSelector = new Qt3DRender::QCameraSelector;
163 mRubberBandsCameraSelector->setObjectName( "RubberBands Pass CameraSelector" );
164 mRubberBandsCameraSelector->setCamera( mMainCamera );
165
166 mRubberBandsLayerFilter = new Qt3DRender::QLayerFilter( mRubberBandsCameraSelector );
167 mRubberBandsLayerFilter->addLayer( mRubberBandsLayer );
168
169 Qt3DRender::QBlendEquationArguments *blendState = new Qt3DRender::QBlendEquationArguments;
170 blendState->setSourceRgb( Qt3DRender::QBlendEquationArguments::SourceAlpha );
171 blendState->setDestinationRgb( Qt3DRender::QBlendEquationArguments::OneMinusSourceAlpha );
172
173 Qt3DRender::QBlendEquation *blendEquation = new Qt3DRender::QBlendEquation;
174 blendEquation->setBlendFunction( Qt3DRender::QBlendEquation::Add );
175
176 mRubberBandsStateSet = new Qt3DRender::QRenderStateSet( mRubberBandsLayerFilter );
177 Qt3DRender::QDepthTest *depthTest = new Qt3DRender::QDepthTest;
178 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Always );
179 mRubberBandsStateSet->addRenderState( depthTest );
180 mRubberBandsStateSet->addRenderState( blendState );
181 mRubberBandsStateSet->addRenderState( blendEquation );
182
183 // Here we attach our drawings to the render target also used by forward pass.
184 // This is kind of okay, but as a result, post-processing effects get applied
185 // to rubber bands too. Ideally we would want them on top of everything.
186 mRubberBandsRenderTargetSelector = new Qt3DRender::QRenderTargetSelector( mRubberBandsStateSet );
187 mRubberBandsRenderTargetSelector->setTarget( forwardRenderView().renderTargetSelector()->target() );
188
189 return mRubberBandsCameraSelector;
190}
191
192void QgsFrameGraph::constructDepthRenderPass()
193{
194 // entity used to draw the depth texture and convert it to rgb image
195 Qt3DRender::QTexture2D *forwardDepthTexture = forwardRenderView().depthTexture();
196 QgsDepthRenderView *rv = new QgsDepthRenderView( DEPTH_RENDERVIEW, mSize, forwardDepthTexture, mRootEntity );
197 registerRenderView( std::unique_ptr<QgsDepthRenderView>( rv ), DEPTH_RENDERVIEW );
198}
199
200Qt3DRender::QRenderCapture *QgsFrameGraph::depthRenderCapture()
201{
203}
204
205void QgsFrameGraph::addGlobalParameters( const QList<Qt3DRender::QParameter *> &parameters )
206{
207 for ( Qt3DRender::QParameter *param : parameters )
208 {
209 mGlobalParamsStorage->addParameter( param );
210 }
211}
212
213QgsFrameGraph::QgsFrameGraph( QSurface *surface, QSize s, Qt3DRender::QCamera *mainCamera, Qt3DCore::QEntity *root )
214 : Qt3DCore::QEntity( root )
215 , mSize( s )
216{
217 // general overview of how the frame graph looks:
218 //
219 // +------------------------+ using window or
220 // | QRenderSurfaceSelector | offscreen surface
221 // +------------------------+
222 // |
223 // +-----------+
224 // | QViewport | (0,0,1,1)
225 // +-----------+
226 // |
227 // +------------------------+------------------+------------------+-------------------+
228 // | | | | |
229 // | (optional) | | |
230 // +------------------+ +-----------------+ +--------------+ +-----------------+ +-----------------+
231 // | forward passes | | MSAA blit | | shadows pass | | depth buffer | | post-processing |
232 // | (solid objects, | | (color + depth) | | | | processing pass | | passes |
233 // | transparent, | +-----------------+ +--------------+ +-----------------+ +-----------------+
234 // | highlights, |
235 // | rubber bands) |
236 // +------------------+
237 //
238 // Notes:
239 // - (optional) MSAA blits multisampled (4 samples) color and depth textures
240 // so that other passes can sample them
241 // - depth buffer processing pass is used whenever we need depth map information
242 // (for camera navigation) and it converts depth texture to a color texture
243 // so that we can capture it with QRenderCapture - currently it is unable
244 // to capture depth buffer, only colors (see QTBUG-65155)
245 // - there are multiple post-processing passes that take rendered output
246 // of the scene, optionally apply effects (add shadows, ambient occlusion,
247 // eye dome lighting) and finally output to the given surface
248 // - there may be also two more passes when 3D axis is shown - see Qgs3DAxis
249
250 mRootEntity = root;
251 mMainCamera = mainCamera;
252
253 mRubberBandsLayer = new Qt3DRender::QLayer;
254 mRubberBandsLayer->setObjectName( "mRubberBandsLayer" );
255 mRubberBandsLayer->setRecursive( true );
256
257 mRenderSurfaceSelector = new Qt3DRender::QRenderSurfaceSelector;
258
259 QObject *surfaceObj = dynamic_cast<QObject *>( surface );
260 Q_ASSERT( surfaceObj );
261
262 mRenderSurfaceSelector->setSurface( surfaceObj );
263 mRenderSurfaceSelector->setExternalRenderTargetSize( mSize );
264
265 mMainViewPort = new Qt3DRender::QViewport( mRenderSurfaceSelector );
266 mMainViewPort->setNormalizedRect( QRectF( 0.0f, 0.0f, 1.0f, 1.0f ) );
267
268 mGlobalParamsStorage = new Qt3DRender::QRenderPassFilter( mMainViewPort );
269 mGlobalParamsStorage->setObjectName( "GlobalParametersStore" );
270
271 // Forward render
272 constructForwardRenderPass();
273
274 // Highlighted items pass
275 constructHighlightsPass();
276
277 // rubber bands (they should be always on top)
278 Qt3DRender::QFrameGraphNode *rubberBandsPass = constructRubberBandsPass();
279 rubberBandsPass->setObjectName( "rubberBandsPass" );
280 rubberBandsPass->setParent( mGlobalParamsStorage );
281
282 mMsaaBlitNode = new Qt3DRender::QBlitFramebuffer( mGlobalParamsStorage );
283 mMsaaBlitNode->setObjectName( "MsaaBlitFramebuffer" );
284 mMsaaBlitNode->setEnabled( false );
285
286 mMsaaDepthBlitNode = new Qt3DRender::QBlitFramebuffer( mGlobalParamsStorage );
287 mMsaaDepthBlitNode->setObjectName( "MsaaDepthBlitFramebuffer" );
288 mMsaaDepthBlitNode->setEnabled( false );
289
290 // shadow rendering pass
291 constructShadowRenderPass();
292
293 // depth buffer processing
294 constructDepthRenderPass();
295
296 // Ambient occlusion factor render pass
297 constructAmbientOcclusionRenderPass();
298
299 // post process
300 Qt3DRender::QFrameGraphNode *postprocessingPass = constructPostprocessingPass();
301 postprocessingPass->setParent( mGlobalParamsStorage );
302 postprocessingPass->setObjectName( "PostProcessingPass" );
303
304 mRubberBandsRootEntity = new Qt3DCore::QEntity( mRootEntity );
305 mRubberBandsRootEntity->setObjectName( "mRubberBandsRootEntity" );
306 mRubberBandsRootEntity->addComponent( mRubberBandsLayer );
307}
308
309void QgsFrameGraph::unregisterRenderView( const QString &name )
310{
311 if ( mRenderViewMap.find( name ) != mRenderViewMap.end() )
312 {
313 mRenderViewMap[name]->topGraphNode()->setParent( ( QNode * ) nullptr );
314 mRenderViewMap.erase( name );
315 }
316}
317
318bool QgsFrameGraph::registerRenderView( std::unique_ptr<QgsAbstractRenderView> renderView, const QString &name, Qt3DRender::QFrameGraphNode *topNode )
319{
320 bool out;
321 if ( mRenderViewMap.find( name ) == mRenderViewMap.end() )
322 {
323 mRenderViewMap[name] = std::move( renderView );
324 mRenderViewMap[name]->topGraphNode()->setParent( topNode ? topNode : mGlobalParamsStorage );
325 mRenderViewMap[name]->updateWindowResize( mSize.width(), mSize.height() );
326 out = true;
327 }
328 else
329 out = false;
330
331 return out;
332}
333
334void QgsFrameGraph::setRenderViewEnabled( const QString &name, bool enable )
335{
336 if ( mRenderViewMap[name] )
337 {
338 mRenderViewMap[name]->setEnabled( enable );
339 }
340}
341
343{
344 if ( mRenderViewMap.find( name ) != mRenderViewMap.end() )
345 {
346 return mRenderViewMap[name].get();
347 }
348 return nullptr;
349}
350
351bool QgsFrameGraph::isRenderViewEnabled( const QString &name )
352{
353 return mRenderViewMap[name] != nullptr && mRenderViewMap[name]->isEnabled();
354}
355
357{
359
360 aoRenderView.setRadius( settings.radius() );
361 aoRenderView.setIntensity( settings.intensity() );
362 aoRenderView.setThreshold( settings.threshold() );
363 aoRenderView.setEnabled( settings.isEnabled() );
364
365 mPostprocessingEntity->setAmbientOcclusionEnabled( settings.isEnabled() );
366}
367
369{
370 mPostprocessingEntity->setEyeDomeLightingEnabled( settings.eyeDomeLightingEnabled() );
371 mPostprocessingEntity->setEyeDomeLightingStrength( settings.eyeDomeLightingStrength() );
372 mPostprocessingEntity->setEyeDomeLightingDistance( settings.eyeDomeLightingDistance() );
373}
374
375void QgsFrameGraph::updateShadowSettings( const QgsShadowSettings &shadowSettings, const QList<QgsLightSource *> &lightSources )
376{
377 if ( shadowSettings.renderShadows() )
378 {
379 int selectedLight = shadowSettings.selectedDirectionalLight();
380 QgsDirectionalLightSettings *light = nullptr;
381 for ( int i = 0, dirLight = 0; !light && i < lightSources.size(); i++ )
382 {
383 if ( lightSources[i]->type() == Qgis::LightSourceType::Directional )
384 {
385 if ( dirLight == selectedLight )
386 light = qgis::down_cast< QgsDirectionalLightSettings * >( lightSources[i] );
387 dirLight++;
388 }
389 }
390
391 if ( light )
392 {
393 const int size = shadowSettings.qualityToMapResolution( shadowSettings.shadowQuality() );
394 shadowRenderView().setMapSize( size, size );
396 mPostprocessingEntity->setShadowRenderingEnabled( true );
397 mPostprocessingEntity->setShadowBias( static_cast<float>( shadowSettings.shadowBias() ) );
398 mPostprocessingEntity->updateShadowSettings( *light, static_cast<float>( shadowSettings.maximumShadowRenderingDistance() ) );
399 mPostprocessingEntity->setShowCascadingShadowSplits( shadowSettings.showCascadeSplits() );
400 }
401 }
402 else
403 {
404 shadowRenderView().setEnabled( false );
405 mPostprocessingEntity->setShadowRenderingEnabled( false );
406 }
407}
408
410{
411 QgsOverlayTextureRenderView *debugRenderView = dynamic_cast<QgsOverlayTextureRenderView *>( mRenderViewMap[OVERLAY_RENDERVIEW].get() );
412 if ( !debugRenderView )
413 return;
414
415 if ( !mDepthTextureDebugging && settings.debugDepthMapEnabled() )
416 {
417 Qt3DRender::QTexture2D *forwardDepthTexture = forwardRenderView().depthTexture();
418 mDepthTextureDebugging = new QgsOverlayTextureEntity( forwardDepthTexture, debugRenderView->overlayLayer(), this );
419 }
420
421 debugRenderView->setEnabled( settings.debugDepthMapEnabled() || settings.is2DMapOverlayEnabled() );
422
423 if ( mDepthTextureDebugging )
424 {
425 mDepthTextureDebugging->setEnabled( settings.debugDepthMapEnabled() );
426 if ( settings.debugDepthMapEnabled() )
427 mDepthTextureDebugging->setPosition( settings.debugDepthMapCorner(), settings.debugDepthMapSize() );
428 else
429 {
430 delete mDepthTextureDebugging;
431 mDepthTextureDebugging = nullptr;
432 }
433 }
434}
435
437{
438 QObject *top = mRenderSurfaceSelector;
439 while ( top->parent() && dynamic_cast<Qt3DRender::QFrameGraphNode *>( top->parent() ) )
440 top = top->parent();
441
443 context.lowestId = mMainCamera->id().id();
444 QStringList strList = QgsFrameGraphUtils::dumpFrameGraph( dynamic_cast<Qt3DRender::QFrameGraphNode *>( top ), context );
445
446 return strList.join( "\n" ) + QString( "\n" );
447}
448
450{
451 QStringList strList = QgsFrameGraphUtils::dumpSceneGraph( mRootEntity, QgsFrameGraphUtils::FgDumpContext() );
452 return strList.join( "\n" ) + QString( "\n" );
453}
454
455void QgsFrameGraph::setClearColor( const QColor &clearColor )
456{
457 forwardRenderView().setClearColor( clearColor );
458}
459
464
466{
467 mSize = s;
468 for ( auto it = mRenderViewMap.begin(); it != mRenderViewMap.end(); ++it )
469 {
470 QgsAbstractRenderView *rv = it->second.get();
471 rv->updateWindowResize( mSize.width(), mSize.height() );
472 }
473
474 mRenderCaptureColorTexture->setSize( mSize.width(), mSize.height() );
475 mRenderCaptureDepthTexture->setSize( mSize.width(), mSize.height() );
476 mRenderSurfaceSelector->setExternalRenderTargetSize( mSize );
477
478 mMsaaBlitNode->setSourceRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
479 mMsaaBlitNode->setDestinationRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
480 mMsaaDepthBlitNode->setSourceRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
481 mMsaaDepthBlitNode->setDestinationRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
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
503{
504 mMsaaEnabled = enabled;
505
506 if ( !enabled && mMsaaBlitConfigured )
507 {
508 mMsaaBlitNode->setSource( nullptr );
509 mMsaaBlitNode->setDestination( nullptr );
510 mMsaaDepthBlitNode->setSource( nullptr );
511 mMsaaDepthBlitNode->setDestination( nullptr );
512 mMsaaBlitConfigured = false;
513 }
514
516
517 if ( enabled && !mMsaaBlitConfigured )
518 {
519 mMsaaBlitConfigured = true;
520 mMsaaBlitNode->setSource( forwardRenderView().msaaRenderTarget() );
521 mMsaaBlitNode->setDestination( forwardRenderView().regularRenderTarget() );
522 mMsaaBlitNode->setSourceRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
523 mMsaaBlitNode->setDestinationRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
524 mMsaaBlitNode->setSourceAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
525 mMsaaBlitNode->setDestinationAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
526 mMsaaBlitNode->setInterpolationMethod( Qt3DRender::QBlitFramebuffer::Nearest );
527
528 mMsaaDepthBlitNode->setSource( forwardRenderView().msaaRenderTarget() );
529 mMsaaDepthBlitNode->setDestination( forwardRenderView().regularRenderTarget() );
530 mMsaaDepthBlitNode->setSourceRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
531 mMsaaDepthBlitNode->setDestinationRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
532 mMsaaDepthBlitNode->setSourceAttachmentPoint( Qt3DRender::QRenderTargetOutput::DepthStencil );
533 mMsaaDepthBlitNode->setDestinationAttachmentPoint( Qt3DRender::QRenderTargetOutput::DepthStencil );
534 mMsaaDepthBlitNode->setInterpolationMethod( Qt3DRender::QBlitFramebuffer::Nearest );
535 }
536
537 Qt3DRender::QRenderTarget *target = enabled ? forwardRenderView().msaaRenderTarget() : forwardRenderView().regularRenderTarget();
539 mRubberBandsRenderTargetSelector->setTarget( target );
540 mMsaaBlitNode->setEnabled( enabled );
541 mMsaaDepthBlitNode->setEnabled( enabled );
542}
543
548
549void QgsFrameGraph::addClipPlanes( int nrClipPlanes )
550{
551 forwardRenderView().addClipPlanes( nrClipPlanes );
552}
553
555{
557 return *( dynamic_cast<QgsForwardRenderView *>( rv ) );
558}
559
561{
563 return *( dynamic_cast<QgsShadowRenderView *>( rv ) );
564}
565
567{
568 QgsAbstractRenderView *rv = mRenderViewMap[QgsFrameGraph::DEPTH_RENDERVIEW].get();
569 return *( dynamic_cast<QgsDepthRenderView *>( rv ) );
570}
571
577
583
@ Directional
Directional light source.
Definition qgis.h:4406
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.
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).
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 setMsaaEnabled(bool enabled)
Sets whether multisample anti-aliasing (MSAA) 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.
Qt3DRender::QRenderTarget * msaaRenderTarget() const
Returns the multisampled render target used as blit source when MSAA is enabled.
Qt3DRender::QRenderTarget * regularRenderTarget() const
Returns the regular (single-sample) render target used as blit destination and postprocessing input.
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 addGlobalParameters(const QList< Qt3DRender::QParameter * > &parameters)
Adds additional global parameters to the graph.
void setMsaaEnabled(bool enabled)
Sets whether multisample anti-aliasing (MSAA) is enabled.
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.
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.
void setRenderTarget(Qt3DRender::QRenderTarget *target)
Switches the render target (called when toggling MSAA on/off).
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.
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.
static int qualityToMapResolution(Qgis::ShadowQuality quality)
Returns the shadow map resolution corresponding to the specified shadow quality.
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...
Qgis::ShadowQuality shadowQuality() const
Returns the quality of the shadow map texture used to generate the shadows.
bool showCascadeSplits() const
Returns true if the cascading shadow splits should be tinted in the view.