QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgsframegraph.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsframegraph.h
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#ifndef QGSFRAMEGRAPH_H
17#define QGSFRAMEGRAPH_H
18
19#include <QWindow>
20#include <Qt3DRender/QCamera>
21#include <Qt3DRender/QRenderSurfaceSelector>
22#include <Qt3DRender/QViewport>
23#include <Qt3DRender/QCameraSelector>
24#include <Qt3DRender/QLayerFilter>
25#include <Qt3DRender/QLayer>
26#include <Qt3DRender/QRenderTargetSelector>
27#include <Qt3DRender/QRenderTarget>
28#include <Qt3DRender/QTexture>
29#include <Qt3DRender/QClearBuffers>
30#include <Qt3DRender/QParameter>
31#include <Qt3DRender/QFrustumCulling>
32#include <Qt3DRender/QRenderStateSet>
33#include <Qt3DRender/QDepthTest>
34#include <Qt3DRender/QCullFace>
35#include <Qt3DRender/QPolygonOffset>
36#include <Qt3DRender/QRenderCapture>
37#include <Qt3DRender/QDebugOverlay>
38
40
43class QgsRectangle;
46class QgsPreviewQuad;
48
49#define SIP_NO_FILE
50
61class QgsFrameGraph : public Qt3DCore::QEntity
62{
63 Q_OBJECT
64
65 public:
67 QgsFrameGraph( QSurface *surface, QSize s, Qt3DRender::QCamera *mainCamera, Qt3DCore::QEntity *root );
68
70 Qt3DRender::QFrameGraphNode *frameGraphRoot() { return mRenderSurfaceSelector; }
71
73 Qt3DRender::QTexture2D *forwardRenderColorTexture() { return mForwardColorTexture; }
75 Qt3DRender::QTexture2D *forwardRenderDepthTexture() { return mForwardDepthTexture; }
77 Qt3DRender::QTexture2D *shadowMapTexture() { return mShadowMapTexture; }
78
83 Qt3DRender::QTexture2D *ambientOcclusionFactorMap() { return mAmbientOcclusionRenderTexture; }
84
89 Qt3DRender::QTexture2D *blurredAmbientOcclusionFactorMap() { return mAmbientOcclusionBlurTexture; }
90
92 Qt3DRender::QLayer *previewLayer() { return mPreviewLayer; }
94 Qt3DRender::QLayer *castShadowsLayer() { return mCastShadowsLayer; }
96 Qt3DRender::QLayer *forwardRenderLayer() { return mForwardRenderLayer; }
97
102 Qt3DRender::QLayer *transparentObjectLayer() { return mTransparentObjectsPassLayer; }
103
105 Qt3DRender::QCamera *mainCamera() { return mMainCamera; }
107 Qt3DRender::QCamera *lightCamera() { return mLightCamera; }
109 QgsPostprocessingEntity *postprocessingEntity() { return mPostprocessingEntity; }
111 Qt3DCore::QEntity *rootEntity() { return mRootEntity; }
112
114 Qt3DCore::QEntity *rubberBandsRootEntity() { return mRubberBandsRootEntity; }
115
117 Qt3DRender::QRenderCapture *renderCapture() { return mRenderCapture; }
118
120 Qt3DRender::QRenderCapture *depthRenderCapture() { return mDepthRenderCapture; }
121
122
124 bool frustumCullingEnabled() const { return mFrustumCullingEnabled; }
126 void setFrustumCullingEnabled( bool enabled );
127
129 bool shadowRenderingEnabled() const { return mShadowRenderingEnabled; }
131 void setShadowRenderingEnabled( bool enabled );
132
134 float shadowBias() const { return mShadowBias; }
136 void setShadowBias( float shadowBias );
137
139 int shadowMapResolution() const { return mShadowMapResolution; }
141 void setShadowMapResolution( int resolution );
142
143
148 void setAmbientOcclusionEnabled( bool enabled );
149
154 bool ambientOcclusionEnabled() const { return mAmbientOcclusionEnabled; }
155
160 void setAmbientOcclusionIntensity( float intensity );
161
166 float ambientOcclusionIntensity() const { return mAmbientOcclusionIntensity; }
167
172 void setAmbientOcclusionRadius( float radius );
173
178 float ambientOcclusionRadius() const { return mAmbientOcclusionRadius; }
179
184 void setAmbientOcclusionThreshold( float threshold );
185
190 float ambientOcclusionThreshold() const { return mAmbientOcclusionThreshold; }
191
193 void setClearColor( const QColor &clearColor );
195 QgsPreviewQuad *addTexturePreviewOverlay( Qt3DRender::QTexture2D *texture, const QPointF &centerNDC, const QSizeF &size, QVector<Qt3DRender::QParameter *> additionalShaderParameters = QVector<Qt3DRender::QParameter *>() );
197 void setupDirectionalLight( const QgsDirectionalLightSettings &light, float maximumShadowRenderingDistance );
199 void setupEyeDomeLighting( bool enabled, double strength, int distance );
201 void setupShadowMapDebugging( bool enabled, Qt::Corner corner, double size );
203 void setupDepthMapDebugging( bool enabled, Qt::Corner corner, double size );
205 void setSize( QSize s );
206
211 void setRenderCaptureEnabled( bool enabled );
212
217 bool renderCaptureEnabled() const { return mRenderCaptureEnabled; }
218
223 void setDebugOverlayEnabled( bool enabled );
224
225 private:
226 Qt3DRender::QRenderSurfaceSelector *mRenderSurfaceSelector = nullptr;
227 Qt3DRender::QViewport *mMainViewPort = nullptr;
228 bool mFrustumCullingEnabled = true;
229
230 Qt3DRender::QCamera *mMainCamera = nullptr;
231 Qt3DRender::QCamera *mLightCamera = nullptr;
232
233 // Forward rendering pass branch nodes:
234 Qt3DRender::QCameraSelector *mMainCameraSelector = nullptr;
235 Qt3DRender::QLayerFilter *mForwardRenderLayerFilter = nullptr;
236 Qt3DRender::QRenderTargetSelector *mForwardRenderTargetSelector = nullptr;
237 Qt3DRender::QClearBuffers *mForwardClearBuffers = nullptr;
238 Qt3DRender::QFrustumCulling *mFrustumCulling = nullptr;
239 // Forward rendering pass texture related objects:
240 Qt3DRender::QTexture2D *mForwardColorTexture = nullptr;
241 Qt3DRender::QTexture2D *mForwardDepthTexture = nullptr;
242 // QDebugOverlay added in the forward pass
243 Qt3DRender::QDebugOverlay *mDebugOverlay = nullptr;
244
245 // Shadow rendering pass branch nodes:
246 Qt3DRender::QCameraSelector *mLightCameraSelectorShadowPass = nullptr;
247 Qt3DRender::QLayerFilter *mShadowSceneEntitiesFilter = nullptr;
248 Qt3DRender::QRenderTargetSelector *mShadowRenderTargetSelector = nullptr;
249 Qt3DRender::QClearBuffers *mShadowClearBuffers = nullptr;
250 Qt3DRender::QRenderStateSet *mShadowRenderStateSet = nullptr;
251 // Shadow rendering pass texture related objects:
252 Qt3DRender::QTexture2D *mShadowMapTexture = nullptr;
253
254 // - The depth buffer render pass is made to copy the depth buffer into
255 // an RGB texture that can be captured into a QImage and sent to the CPU for
256 // calculating real 3D points from mouse coordinates (for zoom, rotation, drag..)
257 // Depth buffer render pass branch nodes:
258 Qt3DRender::QCameraSelector *mDepthRenderCameraSelector = nullptr;
259 Qt3DRender::QRenderStateSet *mDepthRenderStateSet = nullptr;;
260 Qt3DRender::QLayerFilter *mDepthRenderLayerFilter = nullptr;
261 Qt3DRender::QRenderTargetSelector *mDepthRenderCaptureTargetSelector = nullptr;
262 Qt3DRender::QRenderCapture *mDepthRenderCapture = nullptr;
263 // Depth buffer processing pass texture related objects:
264 Qt3DRender::QTexture2D *mDepthRenderCaptureDepthTexture = nullptr;
265 Qt3DRender::QTexture2D *mDepthRenderCaptureColorTexture = nullptr;
266
267 // Post processing pass branch nodes:
268 Qt3DRender::QCameraSelector *mPostProcessingCameraSelector = nullptr;
269 Qt3DRender::QLayerFilter *mPostprocessPassLayerFilter = nullptr;
270 Qt3DRender::QClearBuffers *mPostprocessClearBuffers = nullptr;
271 Qt3DRender::QRenderTargetSelector *mRenderCaptureTargetSelector = nullptr;
272 Qt3DRender::QRenderCapture *mRenderCapture = nullptr;
273 // Post processing pass texture related objects:
274 Qt3DRender::QTexture2D *mRenderCaptureColorTexture = nullptr;
275 Qt3DRender::QTexture2D *mRenderCaptureDepthTexture = nullptr;
276
277 // Ambient occlusion factor generation pass
278 Qt3DRender::QCameraSelector *mAmbientOcclusionRenderCameraSelector = nullptr;
279 Qt3DRender::QRenderStateSet *mAmbientOcclusionRenderStateSet = nullptr;;
280 Qt3DRender::QLayerFilter *mAmbientOcclusionRenderLayerFilter = nullptr;
281 Qt3DRender::QRenderTargetSelector *mAmbientOcclusionRenderCaptureTargetSelector = nullptr;
282 // Ambient occlusion factor generation pass texture related objects:
283 Qt3DRender::QTexture2D *mAmbientOcclusionRenderTexture = nullptr;
284
285 // Ambient occlusion factor blur pass
286 Qt3DRender::QCameraSelector *mAmbientOcclusionBlurCameraSelector = nullptr;
287 Qt3DRender::QRenderStateSet *mAmbientOcclusionBlurStateSet = nullptr;;
288 Qt3DRender::QLayerFilter *mAmbientOcclusionBlurLayerFilter = nullptr;
289 Qt3DRender::QRenderTargetSelector *mAmbientOcclusionBlurRenderCaptureTargetSelector = nullptr;
290 // Ambient occlusion factor blur pass texture related objects:
291 Qt3DRender::QTexture2D *mAmbientOcclusionBlurTexture = nullptr;
292
293 // Rubber bands pass
294 Qt3DRender::QCameraSelector *mRubberBandsCameraSelector = nullptr;
295 Qt3DRender::QLayerFilter *mRubberBandsLayerFilter = nullptr;
296 Qt3DRender::QRenderStateSet *mRubberBandsStateSet = nullptr;
297 Qt3DRender::QRenderTargetSelector *mRubberBandsRenderTargetSelector = nullptr;
298
299 // Texture preview:
300 Qt3DRender::QLayerFilter *mPreviewLayerFilter = nullptr;
301 Qt3DRender::QRenderStateSet *mPreviewRenderStateSet = nullptr;
302 Qt3DRender::QDepthTest *mPreviewDepthTest = nullptr;
303 Qt3DRender::QCullFace *mPreviewCullFace = nullptr;
304
305 bool mShadowRenderingEnabled = false;
306 float mShadowBias = 0.00001f;
307 int mShadowMapResolution = 2048;
308
309 // Ambient occlusion related settings
310 bool mAmbientOcclusionEnabled = false;
311 float mAmbientOcclusionIntensity = 0.5f;
312 float mAmbientOcclusionRadius = 25.f;
313 float mAmbientOcclusionThreshold = 0.5f;
314
315 QSize mSize = QSize( 1024, 768 );
316
317 bool mEyeDomeLightingEnabled = false;
318 double mEyeDomeLightingStrength = 1000.0;
319 int mEyeDomeLightingDistance = 1;
320
321 QgsPreviewQuad *mDebugShadowMapPreviewQuad = nullptr;
322 QgsPreviewQuad *mDebugDepthMapPreviewQuad = nullptr;
323
324 QEntity *mDepthRenderQuad = nullptr;
325
326 QVector3D mLightDirection = QVector3D( 0.0, -1.0f, 0.0f );
327
328 Qt3DCore::QEntity *mRootEntity = nullptr;
329
330 Qt3DRender::QLayer *mPreviewLayer = nullptr;
331 Qt3DRender::QLayer *mForwardRenderLayer = nullptr;
332 Qt3DRender::QLayer *mCastShadowsLayer = nullptr;
333 Qt3DRender::QLayer *mDepthRenderPassLayer = nullptr;
334 Qt3DRender::QLayer *mTransparentObjectsPassLayer = nullptr;
335 Qt3DRender::QLayer *mRubberBandsLayer = nullptr;
336
337 QgsPostprocessingEntity *mPostprocessingEntity = nullptr;
338 QgsAmbientOcclusionRenderEntity *mAmbientOcclusionRenderEntity = nullptr;
339 QgsAmbientOcclusionBlurEntity *mAmbientOcclusionBlurEntity = nullptr;
340
341 Qt3DCore::QEntity *mRubberBandsRootEntity = nullptr;
342
343 QVector<QgsPreviewQuad *> mPreviewQuads;
344
345 Qt3DRender::QFrameGraphNode *constructShadowRenderPass();
346 Qt3DRender::QFrameGraphNode *constructForwardRenderPass();
347 Qt3DRender::QFrameGraphNode *constructTexturesPreviewPass();
348 Qt3DRender::QFrameGraphNode *constructPostprocessingPass();
349 Qt3DRender::QFrameGraphNode *constructDepthRenderPass();
350 Qt3DRender::QFrameGraphNode *constructAmbientOcclusionRenderPass();
351 Qt3DRender::QFrameGraphNode *constructAmbientOcclusionBlurPass();
352 Qt3DRender::QFrameGraphNode *constructRubberBandsPass();
353
354 Qt3DCore::QEntity *constructDepthRenderQuad();
355
356 bool mRenderCaptureEnabled = true;
357
358 Q_DISABLE_COPY( QgsFrameGraph )
359};
360
361#endif // QGSFRAMEGRAPH_H
bool renderCaptureEnabled() const
Returns whether it will be possible to render to an image.
Qt3DRender::QLayer * forwardRenderLayer()
Returns a layer object used to indicate that an entity will be rendered during the forward rendering ...
Definition: qgsframegraph.h:96
bool frustumCullingEnabled() const
Returns whether frustum culling is enabled.
int shadowMapResolution() const
Returns the shadow map resolution.
void setRenderCaptureEnabled(bool enabled)
Sets whether it will be possible to render to an image.
Qt3DRender::QRenderCapture * depthRenderCapture()
Returns the render capture object used to take an image of the depth buffer of the scene.
Qt3DCore::QEntity * rootEntity()
Returns the root entity of the entities related to the frame graph (like the post processing entity a...
void setShadowBias(float shadowBias)
Sets the shadow bias value.
bool ambientOcclusionEnabled() const
Returns whether Screen Space Ambient Occlusion is enabled.
Qt3DRender::QFrameGraphNode * frameGraphRoot()
Returns the root of the frame graph object.
Definition: qgsframegraph.h:70
void setupShadowMapDebugging(bool enabled, Qt::Corner corner, double size)
Sets the shadow map debugging view port.
Qt3DRender::QTexture2D * shadowMapTexture()
Returns the shadow map (a depth texture for the shadow rendering pass)
Definition: qgsframegraph.h:77
void setClearColor(const QColor &clearColor)
Sets the clear color of the scene (background color)
bool shadowRenderingEnabled() const
Returns whether shadow rendering is enabled.
QgsPostprocessingEntity * postprocessingEntity()
Returns the postprocessing entity.
Qt3DRender::QTexture2D * forwardRenderColorTexture()
Returns the color texture of the forward rendering pass.
Definition: qgsframegraph.h:73
void setShadowMapResolution(int resolution)
Sets the resolution of the shadow map.
QgsPreviewQuad * addTexturePreviewOverlay(Qt3DRender::QTexture2D *texture, const QPointF &centerNDC, const QSizeF &size, QVector< Qt3DRender::QParameter * > additionalShaderParameters=QVector< Qt3DRender::QParameter * >())
Adds an preview entity that shows a texture in real time for debugging purposes.
void setAmbientOcclusionIntensity(float intensity)
Sets the ambient occlusion intensity.
float shadowBias() const
Returns the shadow bias value.
Qt3DCore::QEntity * rubberBandsRootEntity()
Returns entity for all rubber bands (to show them always on top)
void setFrustumCullingEnabled(bool enabled)
Sets whether frustum culling is enabled.
Qt3DRender::QLayer * transparentObjectLayer()
Returns a layer object used to indicate that the object is transparent.
void setDebugOverlayEnabled(bool enabled)
Sets whether debug overlay is enabled.
void setShadowRenderingEnabled(bool enabled)
Sets whether the shadow rendering is enabled.
Qt3DRender::QTexture2D * ambientOcclusionFactorMap()
Returns ambient occlusion factor values texture.
Definition: qgsframegraph.h:83
Qt3DRender::QLayer * previewLayer()
Returns a layer object used to indicate that an entity is to be rendered during the preview textures ...
Definition: qgsframegraph.h:92
float ambientOcclusionRadius() const
Returns the ambient occlusion radius.
void setupDepthMapDebugging(bool enabled, Qt::Corner corner, double size)
Sets the depth map debugging view port.
void setupDirectionalLight(const QgsDirectionalLightSettings &light, float maximumShadowRenderingDistance)
Sets shadow rendering to use a directional light.
float ambientOcclusionIntensity() const
Returns the ambient occlusion intensity.
void setAmbientOcclusionThreshold(float threshold)
Sets the ambient occlusion threshold.
Qt3DRender::QCamera * lightCamera()
Returns the light camera.
Qt3DRender::QTexture2D * blurredAmbientOcclusionFactorMap()
Returns blurred ambient occlusion factor values texture.
Definition: qgsframegraph.h:89
Qt3DRender::QLayer * castShadowsLayer()
Returns a layer object used to indicate that an entity will cast shadows.
Definition: qgsframegraph.h:94
float ambientOcclusionThreshold() const
Returns the ambient occlusion threshold.
void setupEyeDomeLighting(bool enabled, double strength, int distance)
Sets eye dome lighting shading related settings.
void setSize(QSize s)
Sets the size of the buffers used for rendering.
Qt3DRender::QTexture2D * forwardRenderDepthTexture()
Returns the depth texture of the forward rendering pass.
Definition: qgsframegraph.h:75
void setAmbientOcclusionEnabled(bool enabled)
Sets whether Screen Space Ambient Occlusion will be enabled.
void setAmbientOcclusionRadius(float radius)
Sets the ambient occlusion radius.
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.
A rectangle specified with double values.
Definition: qgsrectangle.h:42