QGIS API Documentation 3.39.0-Master (d85f3c2a281)
Loading...
Searching...
No Matches
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 *blurredAmbientOcclusionFactorMap() { return mAmbientOcclusionBlurTexture; }
84
86 Qt3DRender::QLayer *previewLayer() { return mPreviewLayer; }
88 Qt3DRender::QLayer *castShadowsLayer() { return mCastShadowsLayer; }
90 Qt3DRender::QLayer *forwardRenderLayer() { return mForwardRenderLayer; }
91
96 Qt3DRender::QLayer *transparentObjectLayer() { return mTransparentObjectsPassLayer; }
97
99 Qt3DRender::QCamera *mainCamera() { return mMainCamera; }
101 Qt3DRender::QCamera *lightCamera() { return mLightCamera; }
103 QgsPostprocessingEntity *postprocessingEntity() { return mPostprocessingEntity; }
105 Qt3DCore::QEntity *rootEntity() { return mRootEntity; }
106
108 Qt3DCore::QEntity *rubberBandsRootEntity() { return mRubberBandsRootEntity; }
109
111 Qt3DRender::QRenderCapture *renderCapture() { return mRenderCapture; }
112
114 Qt3DRender::QRenderCapture *depthRenderCapture() { return mDepthRenderCapture; }
115
116
118 bool frustumCullingEnabled() const { return mFrustumCullingEnabled; }
120 void setFrustumCullingEnabled( bool enabled );
121
123 bool shadowRenderingEnabled() const { return mShadowRenderingEnabled; }
125 void setShadowRenderingEnabled( bool enabled );
126
128 float shadowBias() const { return mShadowBias; }
130 void setShadowBias( float shadowBias );
131
133 int shadowMapResolution() const { return mShadowMapResolution; }
135 void setShadowMapResolution( int resolution );
136
137
142 void setAmbientOcclusionEnabled( bool enabled );
143
148 bool ambientOcclusionEnabled() const { return mAmbientOcclusionEnabled; }
149
154 void setAmbientOcclusionIntensity( float intensity );
155
160 float ambientOcclusionIntensity() const { return mAmbientOcclusionIntensity; }
161
166 void setAmbientOcclusionRadius( float radius );
167
172 float ambientOcclusionRadius() const { return mAmbientOcclusionRadius; }
173
178 void setAmbientOcclusionThreshold( float threshold );
179
184 float ambientOcclusionThreshold() const { return mAmbientOcclusionThreshold; }
185
187 void setClearColor( const QColor &clearColor );
189 QgsPreviewQuad *addTexturePreviewOverlay( Qt3DRender::QTexture2D *texture, const QPointF &centerNDC, const QSizeF &size, QVector<Qt3DRender::QParameter *> additionalShaderParameters = QVector<Qt3DRender::QParameter *>() );
191 void setupDirectionalLight( const QgsDirectionalLightSettings &light, float maximumShadowRenderingDistance );
193 void setupEyeDomeLighting( bool enabled, double strength, int distance );
195 void setupShadowMapDebugging( bool enabled, Qt::Corner corner, double size );
197 void setupDepthMapDebugging( bool enabled, Qt::Corner corner, double size );
199 void setSize( QSize s );
200
205 void setRenderCaptureEnabled( bool enabled );
206
211 bool renderCaptureEnabled() const { return mRenderCaptureEnabled; }
212
217 void setDebugOverlayEnabled( bool enabled );
218
220 QString dumpFrameGraph() const;
221
223 QString dumpSceneGraph() const;
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::QRenderTargetSelector *mRenderCaptureTargetSelector = nullptr;
269 Qt3DRender::QRenderCapture *mRenderCapture = nullptr;
270 // Post processing pass texture related objects:
271 Qt3DRender::QTexture2D *mRenderCaptureColorTexture = nullptr;
272 Qt3DRender::QTexture2D *mRenderCaptureDepthTexture = nullptr;
273
274 // Ambient occlusion factor generation pass
275 Qt3DRender::QCameraSelector *mAmbientOcclusionRenderCameraSelector = nullptr;
276 Qt3DRender::QRenderStateSet *mAmbientOcclusionRenderStateSet = nullptr;
277 Qt3DRender::QLayerFilter *mAmbientOcclusionRenderLayerFilter = nullptr;
278 Qt3DRender::QRenderTargetSelector *mAmbientOcclusionRenderCaptureTargetSelector = nullptr;
279 // Ambient occlusion factor generation pass texture related objects:
280 Qt3DRender::QTexture2D *mAmbientOcclusionRenderTexture = nullptr;
281
282 // Ambient occlusion factor blur pass
283 Qt3DRender::QCameraSelector *mAmbientOcclusionBlurCameraSelector = nullptr;
284 Qt3DRender::QRenderStateSet *mAmbientOcclusionBlurStateSet = nullptr;
285 Qt3DRender::QLayerFilter *mAmbientOcclusionBlurLayerFilter = nullptr;
286 Qt3DRender::QRenderTargetSelector *mAmbientOcclusionBlurRenderCaptureTargetSelector = nullptr;
287 // Ambient occlusion factor blur pass texture related objects:
288 Qt3DRender::QTexture2D *mAmbientOcclusionBlurTexture = nullptr;
289
290 // Rubber bands pass
291 Qt3DRender::QCameraSelector *mRubberBandsCameraSelector = nullptr;
292 Qt3DRender::QLayerFilter *mRubberBandsLayerFilter = nullptr;
293 Qt3DRender::QRenderStateSet *mRubberBandsStateSet = nullptr;
294 Qt3DRender::QRenderTargetSelector *mRubberBandsRenderTargetSelector = nullptr;
295
296 bool mShadowRenderingEnabled = false;
297 float mShadowBias = 0.00001f;
298 int mShadowMapResolution = 2048;
299
300 // Ambient occlusion related settings
301 bool mAmbientOcclusionEnabled = false;
302 float mAmbientOcclusionIntensity = 0.5f;
303 float mAmbientOcclusionRadius = 25.f;
304 float mAmbientOcclusionThreshold = 0.5f;
305
306 QSize mSize = QSize( 1024, 768 );
307
308 bool mEyeDomeLightingEnabled = false;
309 double mEyeDomeLightingStrength = 1000.0;
310 int mEyeDomeLightingDistance = 1;
311
312 QgsPreviewQuad *mDebugShadowMapPreviewQuad = nullptr;
313 QgsPreviewQuad *mDebugDepthMapPreviewQuad = nullptr;
314
315 QEntity *mDepthRenderQuad = nullptr;
316
317 QVector3D mLightDirection = QVector3D( 0.0, -1.0f, 0.0f );
318
319 Qt3DCore::QEntity *mRootEntity = nullptr;
320
321 Qt3DRender::QLayer *mPreviewLayer = nullptr;
322 Qt3DRender::QLayer *mForwardRenderLayer = nullptr;
323 Qt3DRender::QLayer *mCastShadowsLayer = nullptr;
324 Qt3DRender::QLayer *mDepthRenderPassLayer = nullptr;
325 Qt3DRender::QLayer *mTransparentObjectsPassLayer = nullptr;
326 Qt3DRender::QLayer *mRubberBandsLayer = nullptr;
327
328 QgsPostprocessingEntity *mPostprocessingEntity = nullptr;
329 QgsAmbientOcclusionRenderEntity *mAmbientOcclusionRenderEntity = nullptr;
330 QgsAmbientOcclusionBlurEntity *mAmbientOcclusionBlurEntity = nullptr;
331
332 Qt3DCore::QEntity *mRubberBandsRootEntity = nullptr;
333
334 QVector<QgsPreviewQuad *> mPreviewQuads;
335
336 Qt3DRender::QFrameGraphNode *constructShadowRenderPass();
337 Qt3DRender::QFrameGraphNode *constructForwardRenderPass();
338 Qt3DRender::QFrameGraphNode *constructPostprocessingPass();
339 Qt3DRender::QFrameGraphNode *constructDepthRenderPass();
340 Qt3DRender::QFrameGraphNode *constructAmbientOcclusionRenderPass();
341 Qt3DRender::QFrameGraphNode *constructAmbientOcclusionBlurPass();
342 Qt3DRender::QFrameGraphNode *constructRubberBandsPass();
343
344 Qt3DRender::QFrameGraphNode *constructSubPostPassForProcessing();
345 Qt3DRender::QFrameGraphNode *constructSubPostPassForRenderCapture();
346 Qt3DRender::QFrameGraphNode *constructSubPostPassForTexturesPreview();
347
348 Qt3DCore::QEntity *constructDepthRenderQuad();
349
350 bool mRenderCaptureEnabled = false;
351
352 Q_DISABLE_COPY( QgsFrameGraph )
353};
354
355#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 ...
bool frustumCullingEnabled() const
Returns whether frustum culling is enabled.
int shadowMapResolution() const
Returns the shadow map resolution.
QString dumpFrameGraph() const
Dumps frame graph as string.
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.
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)
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.
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::QLayer * previewLayer()
Returns a layer object used to indicate that an entity is to be rendered during the preview textures ...
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.
QString dumpSceneGraph() const
Dumps scene graph as string.
Qt3DRender::QLayer * castShadowsLayer()
Returns a layer object used to indicate that an entity will cast shadows.
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.
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.
Qt3DRender::QRenderCapture * renderCapture()
Returns the render capture object used to take an image of the scene.
A rectangle specified with double values.