QGIS API Documentation 4.1.0-Master (376402f9aeb)
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
209void QgsFrameGraph::addGlobalParameters( const QList<Qt3DRender::QParameter *> &parameters )
210{
211 for ( Qt3DRender::QParameter *param : parameters )
212 {
213 mGlobalParamsStorage->addParameter( param );
214 }
215}
216
217QgsFrameGraph::QgsFrameGraph( QSurface *surface, QSize s, Qt3DRender::QCamera *mainCamera, Qt3DCore::QEntity *root )
218 : Qt3DCore::QEntity( root )
219 , mSize( s )
220{
221 // general overview of how the frame graph looks:
222 //
223 // +------------------------+ using window or
224 // | QRenderSurfaceSelector | offscreen surface
225 // +------------------------+
226 // |
227 // +-----------+
228 // | QViewport | (0,0,1,1)
229 // +-----------+
230 // |
231 // +------------------------+------------------+------------------+-------------------+
232 // | | | | |
233 // | (optional) | | |
234 // +------------------+ +-----------------+ +--------------+ +-----------------+ +-----------------+
235 // | forward passes | | MSAA blit | | shadows pass | | depth buffer | | post-processing |
236 // | (solid objects, | | (color + depth) | | | | processing pass | | passes |
237 // | transparent, | +-----------------+ +--------------+ +-----------------+ +-----------------+
238 // | highlights, |
239 // | rubber bands) |
240 // +------------------+
241 //
242 // Notes:
243 // - (optional) MSAA blits multisampled (4 samples) color and depth textures
244 // so that other passes can sample them
245 // - depth buffer processing pass is used whenever we need depth map information
246 // (for camera navigation) and it converts depth texture to a color texture
247 // so that we can capture it with QRenderCapture - currently it is unable
248 // to capture depth buffer, only colors (see QTBUG-65155)
249 // - there are multiple post-processing passes that take rendered output
250 // of the scene, optionally apply effects (add shadows, ambient occlusion,
251 // eye dome lighting) and finally output to the given surface
252 // - there may be also two more passes when 3D axis is shown - see Qgs3DAxis
253
254 mRootEntity = root;
255 mMainCamera = mainCamera;
256
257 mRubberBandsLayer = new Qt3DRender::QLayer;
258 mRubberBandsLayer->setObjectName( "mRubberBandsLayer" );
259 mRubberBandsLayer->setRecursive( true );
260
261 mRenderSurfaceSelector = new Qt3DRender::QRenderSurfaceSelector;
262
263 QObject *surfaceObj = dynamic_cast<QObject *>( surface );
264 Q_ASSERT( surfaceObj );
265
266 mRenderSurfaceSelector->setSurface( surfaceObj );
267 mRenderSurfaceSelector->setExternalRenderTargetSize( mSize );
268
269 mMainViewPort = new Qt3DRender::QViewport( mRenderSurfaceSelector );
270 mMainViewPort->setNormalizedRect( QRectF( 0.0f, 0.0f, 1.0f, 1.0f ) );
271
272 mGlobalParamsStorage = new Qt3DRender::QRenderPassFilter( mMainViewPort );
273 mGlobalParamsStorage->setObjectName( "GlobalParametersStore" );
274
275 // Forward render
276 constructForwardRenderPass();
277
278 // Highlighted items pass
279 constructHighlightsPass();
280
281 // rubber bands (they should be always on top)
282 Qt3DRender::QFrameGraphNode *rubberBandsPass = constructRubberBandsPass();
283 rubberBandsPass->setObjectName( "rubberBandsPass" );
284 rubberBandsPass->setParent( mGlobalParamsStorage );
285
286 mMsaaBlitNode = new Qt3DRender::QBlitFramebuffer( mGlobalParamsStorage );
287 mMsaaBlitNode->setObjectName( "MsaaBlitFramebuffer" );
288 mMsaaBlitNode->setEnabled( false );
289
290 mMsaaDepthBlitNode = new Qt3DRender::QBlitFramebuffer( mGlobalParamsStorage );
291 mMsaaDepthBlitNode->setObjectName( "MsaaDepthBlitFramebuffer" );
292 mMsaaDepthBlitNode->setEnabled( false );
293
294 // shadow rendering pass
295 constructShadowRenderPass();
296
297 // depth buffer processing
298 constructDepthRenderPass();
299
300 // Ambient occlusion factor render pass
301 constructAmbientOcclusionRenderPass();
302
303 // post process
304 Qt3DRender::QFrameGraphNode *postprocessingPass = constructPostprocessingPass();
305 postprocessingPass->setParent( mGlobalParamsStorage );
306 postprocessingPass->setObjectName( "PostProcessingPass" );
307
308 mRubberBandsRootEntity = new Qt3DCore::QEntity( mRootEntity );
309 mRubberBandsRootEntity->setObjectName( "mRubberBandsRootEntity" );
310 mRubberBandsRootEntity->addComponent( mRubberBandsLayer );
311}
312
313void QgsFrameGraph::unregisterRenderView( const QString &name )
314{
315 if ( mRenderViewMap.find( name ) != mRenderViewMap.end() )
316 {
317 mRenderViewMap[name]->topGraphNode()->setParent( ( QNode * ) nullptr );
318 mRenderViewMap.erase( name );
319 }
320}
321
322bool QgsFrameGraph::registerRenderView( std::unique_ptr<QgsAbstractRenderView> renderView, const QString &name, Qt3DRender::QFrameGraphNode *topNode )
323{
324 bool out;
325 if ( mRenderViewMap.find( name ) == mRenderViewMap.end() )
326 {
327 mRenderViewMap[name] = std::move( renderView );
328 mRenderViewMap[name]->topGraphNode()->setParent( topNode ? topNode : mGlobalParamsStorage );
329 mRenderViewMap[name]->updateWindowResize( mSize.width(), mSize.height() );
330 out = true;
331 }
332 else
333 out = false;
334
335 return out;
336}
337
338void QgsFrameGraph::setRenderViewEnabled( const QString &name, bool enable )
339{
340 if ( mRenderViewMap[name] )
341 {
342 mRenderViewMap[name]->setEnabled( enable );
343 }
344}
345
347{
348 if ( mRenderViewMap.find( name ) != mRenderViewMap.end() )
349 {
350 return mRenderViewMap[name].get();
351 }
352 return nullptr;
353}
354
355bool QgsFrameGraph::isRenderViewEnabled( const QString &name )
356{
357 return mRenderViewMap[name] != nullptr && mRenderViewMap[name]->isEnabled();
358}
359
361{
363
364 aoRenderView.setRadius( settings.radius() );
365 aoRenderView.setIntensity( settings.intensity() );
366 aoRenderView.setThreshold( settings.threshold() );
367 aoRenderView.setEnabled( settings.isEnabled() );
368
369 mPostprocessingEntity->setAmbientOcclusionEnabled( settings.isEnabled() );
370}
371
373{
374 mPostprocessingEntity->setEyeDomeLightingEnabled( settings.eyeDomeLightingEnabled() );
375 mPostprocessingEntity->setEyeDomeLightingStrength( settings.eyeDomeLightingStrength() );
376 mPostprocessingEntity->setEyeDomeLightingDistance( settings.eyeDomeLightingDistance() );
377}
378
379void QgsFrameGraph::updateShadowSettings( const QgsShadowSettings &shadowSettings, const QList<QgsLightSource *> &lightSources )
380{
381 if ( shadowSettings.renderShadows() )
382 {
383 int selectedLight = shadowSettings.selectedDirectionalLight();
384 QgsDirectionalLightSettings *light = nullptr;
385 for ( int i = 0, dirLight = 0; !light && i < lightSources.size(); i++ )
386 {
387 if ( lightSources[i]->type() == Qgis::LightSourceType::Directional )
388 {
389 if ( dirLight == selectedLight )
390 light = qgis::down_cast< QgsDirectionalLightSettings * >( lightSources[i] );
391 dirLight++;
392 }
393 }
394
395 if ( light )
396 {
397 shadowRenderView().setMapSize( shadowSettings.shadowMapResolution(), shadowSettings.shadowMapResolution() );
399 mPostprocessingEntity->setShadowRenderingEnabled( true );
400 mPostprocessingEntity->setShadowBias( static_cast<float>( shadowSettings.shadowBias() ) );
401 mPostprocessingEntity->updateShadowSettings( *light, static_cast<float>( shadowSettings.maximumShadowRenderingDistance() ) );
402 }
403 }
404 else
405 {
406 shadowRenderView().setEnabled( false );
407 mPostprocessingEntity->setShadowRenderingEnabled( false );
408 }
409}
410
412{
413 QgsOverlayTextureRenderView *debugRenderView = dynamic_cast<QgsOverlayTextureRenderView *>( mRenderViewMap[OVERLAY_RENDERVIEW].get() );
414 if ( !debugRenderView )
415 return;
416
417 if ( !mShadowTextureDebugging && settings.debugShadowMapEnabled() )
418 {
419 Qt3DRender::QTexture2D *shadowDepthTexture = shadowRenderView().mapTexture();
420 mShadowTextureDebugging = new QgsOverlayTextureEntity( shadowDepthTexture, debugRenderView->overlayLayer(), this );
421 }
422
423 debugRenderView->setEnabled( settings.debugShadowMapEnabled() || settings.debugDepthMapEnabled() || settings.is2DMapOverlayEnabled() );
424
425 if ( mShadowTextureDebugging )
426 {
427 mShadowTextureDebugging->setEnabled( settings.debugShadowMapEnabled() );
428 if ( settings.debugShadowMapEnabled() )
429 mShadowTextureDebugging->setPosition( settings.debugShadowMapCorner(), settings.debugShadowMapSize() );
430 else
431 {
432 delete mShadowTextureDebugging;
433 mShadowTextureDebugging = nullptr;
434 }
435 }
436}
437
439{
440 QgsOverlayTextureRenderView *debugRenderView = dynamic_cast<QgsOverlayTextureRenderView *>( mRenderViewMap[OVERLAY_RENDERVIEW].get() );
441 if ( !debugRenderView )
442 return;
443
444 if ( !mDepthTextureDebugging && settings.debugDepthMapEnabled() )
445 {
446 Qt3DRender::QTexture2D *forwardDepthTexture = forwardRenderView().depthTexture();
447 mDepthTextureDebugging = new QgsOverlayTextureEntity( forwardDepthTexture, debugRenderView->overlayLayer(), this );
448 }
449
450 debugRenderView->setEnabled( settings.debugShadowMapEnabled() || settings.debugDepthMapEnabled() || settings.is2DMapOverlayEnabled() );
451
452 if ( mDepthTextureDebugging )
453 {
454 mDepthTextureDebugging->setEnabled( settings.debugDepthMapEnabled() );
455 if ( settings.debugDepthMapEnabled() )
456 mDepthTextureDebugging->setPosition( settings.debugDepthMapCorner(), settings.debugDepthMapSize() );
457 else
458 {
459 delete mDepthTextureDebugging;
460 mDepthTextureDebugging = nullptr;
461 }
462 }
463}
464
466{
467 QObject *top = mRenderSurfaceSelector;
468 while ( top->parent() && dynamic_cast<Qt3DRender::QFrameGraphNode *>( top->parent() ) )
469 top = top->parent();
470
472 context.lowestId = mMainCamera->id().id();
473 QStringList strList = QgsFrameGraphUtils::dumpFrameGraph( dynamic_cast<Qt3DRender::QFrameGraphNode *>( top ), context );
474
475 return strList.join( "\n" ) + QString( "\n" );
476}
477
479{
480 QStringList strList = QgsFrameGraphUtils::dumpSceneGraph( mRootEntity, QgsFrameGraphUtils::FgDumpContext() );
481 return strList.join( "\n" ) + QString( "\n" );
482}
483
484void QgsFrameGraph::setClearColor( const QColor &clearColor )
485{
486 forwardRenderView().setClearColor( clearColor );
487}
488
493
495{
496 mSize = s;
497 for ( auto it = mRenderViewMap.begin(); it != mRenderViewMap.end(); ++it )
498 {
499 QgsAbstractRenderView *rv = it->second.get();
500 rv->updateWindowResize( mSize.width(), mSize.height() );
501 }
502
503 mRenderCaptureColorTexture->setSize( mSize.width(), mSize.height() );
504 mRenderCaptureDepthTexture->setSize( mSize.width(), mSize.height() );
505 mRenderSurfaceSelector->setExternalRenderTargetSize( mSize );
506
507 mMsaaBlitNode->setSourceRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
508 mMsaaBlitNode->setDestinationRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
509 mMsaaDepthBlitNode->setSourceRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
510 mMsaaDepthBlitNode->setDestinationRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
511}
512
513Qt3DRender::QRenderCapture *QgsFrameGraph::renderCapture()
514{
515 return mRenderCapture;
516}
517
519{
520 if ( enabled == mRenderCaptureEnabled )
521 return;
522 mRenderCaptureEnabled = enabled;
523 mRenderCaptureTargetSelector->setEnabled( mRenderCaptureEnabled );
524}
525
530
532{
533 mMsaaEnabled = enabled;
534
535 if ( !enabled && mMsaaBlitConfigured )
536 {
537 mMsaaBlitNode->setSource( nullptr );
538 mMsaaBlitNode->setDestination( nullptr );
539 mMsaaDepthBlitNode->setSource( nullptr );
540 mMsaaDepthBlitNode->setDestination( nullptr );
541 mMsaaBlitConfigured = false;
542 }
543
545
546 if ( enabled && !mMsaaBlitConfigured )
547 {
548 mMsaaBlitConfigured = true;
549 mMsaaBlitNode->setSource( forwardRenderView().msaaRenderTarget() );
550 mMsaaBlitNode->setDestination( forwardRenderView().regularRenderTarget() );
551 mMsaaBlitNode->setSourceRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
552 mMsaaBlitNode->setDestinationRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
553 mMsaaBlitNode->setSourceAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
554 mMsaaBlitNode->setDestinationAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
555 mMsaaBlitNode->setInterpolationMethod( Qt3DRender::QBlitFramebuffer::Nearest );
556
557 mMsaaDepthBlitNode->setSource( forwardRenderView().msaaRenderTarget() );
558 mMsaaDepthBlitNode->setDestination( forwardRenderView().regularRenderTarget() );
559 mMsaaDepthBlitNode->setSourceRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
560 mMsaaDepthBlitNode->setDestinationRect( QRect( 0, 0, mSize.width(), mSize.height() ) );
561 mMsaaDepthBlitNode->setSourceAttachmentPoint( Qt3DRender::QRenderTargetOutput::DepthStencil );
562 mMsaaDepthBlitNode->setDestinationAttachmentPoint( Qt3DRender::QRenderTargetOutput::DepthStencil );
563 mMsaaDepthBlitNode->setInterpolationMethod( Qt3DRender::QBlitFramebuffer::Nearest );
564 }
565
566 Qt3DRender::QRenderTarget *target = enabled ? forwardRenderView().msaaRenderTarget() : forwardRenderView().regularRenderTarget();
568 mRubberBandsRenderTargetSelector->setTarget( target );
569 mMsaaBlitNode->setEnabled( enabled );
570 mMsaaDepthBlitNode->setEnabled( enabled );
571}
572
577
578void QgsFrameGraph::addClipPlanes( int nrClipPlanes )
579{
580 forwardRenderView().addClipPlanes( nrClipPlanes );
581}
582
584{
586 return *( dynamic_cast<QgsForwardRenderView *>( rv ) );
587}
588
590{
592 return *( dynamic_cast<QgsShadowRenderView *>( rv ) );
593}
594
596{
597 QgsAbstractRenderView *rv = mRenderViewMap[QgsFrameGraph::DEPTH_RENDERVIEW].get();
598 return *( dynamic_cast<QgsDepthRenderView *>( rv ) );
599}
600
606
612
@ Directional
Directional light source.
Definition qgis.h:4362
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 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.
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.
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.
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...