QGIS API Documentation 3.39.0-Master (47f7b3a4989)
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
219 private:
220 Qt3DRender::QRenderSurfaceSelector *mRenderSurfaceSelector = nullptr;
221 Qt3DRender::QViewport *mMainViewPort = nullptr;
222 bool mFrustumCullingEnabled = true;
223
224 Qt3DRender::QCamera *mMainCamera = nullptr;
225 Qt3DRender::QCamera *mLightCamera = nullptr;
226
227 // Forward rendering pass branch nodes:
228 Qt3DRender::QCameraSelector *mMainCameraSelector = nullptr;
229 Qt3DRender::QLayerFilter *mForwardRenderLayerFilter = nullptr;
230 Qt3DRender::QRenderTargetSelector *mForwardRenderTargetSelector = nullptr;
231 Qt3DRender::QClearBuffers *mForwardClearBuffers = nullptr;
232 Qt3DRender::QFrustumCulling *mFrustumCulling = nullptr;
233 // Forward rendering pass texture related objects:
234 Qt3DRender::QTexture2D *mForwardColorTexture = nullptr;
235 Qt3DRender::QTexture2D *mForwardDepthTexture = nullptr;
236 // QDebugOverlay added in the forward pass
237 Qt3DRender::QDebugOverlay *mDebugOverlay = nullptr;
238
239 // Shadow rendering pass branch nodes:
240 Qt3DRender::QCameraSelector *mLightCameraSelectorShadowPass = nullptr;
241 Qt3DRender::QLayerFilter *mShadowSceneEntitiesFilter = nullptr;
242 Qt3DRender::QRenderTargetSelector *mShadowRenderTargetSelector = nullptr;
243 Qt3DRender::QClearBuffers *mShadowClearBuffers = nullptr;
244 Qt3DRender::QRenderStateSet *mShadowRenderStateSet = nullptr;
245 // Shadow rendering pass texture related objects:
246 Qt3DRender::QTexture2D *mShadowMapTexture = nullptr;
247
248 // - The depth buffer render pass is made to copy the depth buffer into
249 // an RGB texture that can be captured into a QImage and sent to the CPU for
250 // calculating real 3D points from mouse coordinates (for zoom, rotation, drag..)
251 // Depth buffer render pass branch nodes:
252 Qt3DRender::QCameraSelector *mDepthRenderCameraSelector = nullptr;
253 Qt3DRender::QRenderStateSet *mDepthRenderStateSet = nullptr;;
254 Qt3DRender::QLayerFilter *mDepthRenderLayerFilter = nullptr;
255 Qt3DRender::QRenderTargetSelector *mDepthRenderCaptureTargetSelector = nullptr;
256 Qt3DRender::QRenderCapture *mDepthRenderCapture = nullptr;
257 // Depth buffer processing pass texture related objects:
258 Qt3DRender::QTexture2D *mDepthRenderCaptureDepthTexture = nullptr;
259 Qt3DRender::QTexture2D *mDepthRenderCaptureColorTexture = nullptr;
260
261 // Post processing pass branch nodes:
262 Qt3DRender::QCameraSelector *mPostProcessingCameraSelector = nullptr;
263 Qt3DRender::QLayerFilter *mPostprocessPassLayerFilter = nullptr;
264 Qt3DRender::QClearBuffers *mPostprocessClearBuffers = nullptr;
265 Qt3DRender::QRenderTargetSelector *mRenderCaptureTargetSelector = nullptr;
266 Qt3DRender::QRenderCapture *mRenderCapture = nullptr;
267 // Post processing pass texture related objects:
268 Qt3DRender::QTexture2D *mRenderCaptureColorTexture = nullptr;
269 Qt3DRender::QTexture2D *mRenderCaptureDepthTexture = nullptr;
270
271 // Ambient occlusion factor generation pass
272 Qt3DRender::QCameraSelector *mAmbientOcclusionRenderCameraSelector = nullptr;
273 Qt3DRender::QRenderStateSet *mAmbientOcclusionRenderStateSet = nullptr;;
274 Qt3DRender::QLayerFilter *mAmbientOcclusionRenderLayerFilter = nullptr;
275 Qt3DRender::QRenderTargetSelector *mAmbientOcclusionRenderCaptureTargetSelector = nullptr;
276 // Ambient occlusion factor generation pass texture related objects:
277 Qt3DRender::QTexture2D *mAmbientOcclusionRenderTexture = nullptr;
278
279 // Ambient occlusion factor blur pass
280 Qt3DRender::QCameraSelector *mAmbientOcclusionBlurCameraSelector = nullptr;
281 Qt3DRender::QRenderStateSet *mAmbientOcclusionBlurStateSet = nullptr;;
282 Qt3DRender::QLayerFilter *mAmbientOcclusionBlurLayerFilter = nullptr;
283 Qt3DRender::QRenderTargetSelector *mAmbientOcclusionBlurRenderCaptureTargetSelector = nullptr;
284 // Ambient occlusion factor blur pass texture related objects:
285 Qt3DRender::QTexture2D *mAmbientOcclusionBlurTexture = nullptr;
286
287 // Rubber bands pass
288 Qt3DRender::QCameraSelector *mRubberBandsCameraSelector = nullptr;
289 Qt3DRender::QLayerFilter *mRubberBandsLayerFilter = nullptr;
290 Qt3DRender::QRenderStateSet *mRubberBandsStateSet = nullptr;
291 Qt3DRender::QRenderTargetSelector *mRubberBandsRenderTargetSelector = nullptr;
292
293 // Texture preview:
294 Qt3DRender::QLayerFilter *mPreviewLayerFilter = nullptr;
295 Qt3DRender::QRenderStateSet *mPreviewRenderStateSet = nullptr;
296 Qt3DRender::QDepthTest *mPreviewDepthTest = nullptr;
297 Qt3DRender::QCullFace *mPreviewCullFace = nullptr;
298
299 bool mShadowRenderingEnabled = false;
300 float mShadowBias = 0.00001f;
301 int mShadowMapResolution = 2048;
302
303 // Ambient occlusion related settings
304 bool mAmbientOcclusionEnabled = false;
305 float mAmbientOcclusionIntensity = 0.5f;
306 float mAmbientOcclusionRadius = 25.f;
307 float mAmbientOcclusionThreshold = 0.5f;
308
309 QSize mSize = QSize( 1024, 768 );
310
311 bool mEyeDomeLightingEnabled = false;
312 double mEyeDomeLightingStrength = 1000.0;
313 int mEyeDomeLightingDistance = 1;
314
315 QgsPreviewQuad *mDebugShadowMapPreviewQuad = nullptr;
316 QgsPreviewQuad *mDebugDepthMapPreviewQuad = nullptr;
317
318 QEntity *mDepthRenderQuad = nullptr;
319
320 QVector3D mLightDirection = QVector3D( 0.0, -1.0f, 0.0f );
321
322 Qt3DCore::QEntity *mRootEntity = nullptr;
323
324 Qt3DRender::QLayer *mPreviewLayer = nullptr;
325 Qt3DRender::QLayer *mForwardRenderLayer = nullptr;
326 Qt3DRender::QLayer *mCastShadowsLayer = nullptr;
327 Qt3DRender::QLayer *mDepthRenderPassLayer = nullptr;
328 Qt3DRender::QLayer *mTransparentObjectsPassLayer = nullptr;
329 Qt3DRender::QLayer *mRubberBandsLayer = nullptr;
330
331 QgsPostprocessingEntity *mPostprocessingEntity = nullptr;
332 QgsAmbientOcclusionRenderEntity *mAmbientOcclusionRenderEntity = nullptr;
333 QgsAmbientOcclusionBlurEntity *mAmbientOcclusionBlurEntity = nullptr;
334
335 Qt3DCore::QEntity *mRubberBandsRootEntity = nullptr;
336
337 QVector<QgsPreviewQuad *> mPreviewQuads;
338
339 Qt3DRender::QFrameGraphNode *constructShadowRenderPass();
340 Qt3DRender::QFrameGraphNode *constructForwardRenderPass();
341 Qt3DRender::QFrameGraphNode *constructTexturesPreviewPass();
342 Qt3DRender::QFrameGraphNode *constructPostprocessingPass();
343 Qt3DRender::QFrameGraphNode *constructDepthRenderPass();
344 Qt3DRender::QFrameGraphNode *constructAmbientOcclusionRenderPass();
345 Qt3DRender::QFrameGraphNode *constructAmbientOcclusionBlurPass();
346 Qt3DRender::QFrameGraphNode *constructRubberBandsPass();
347
348 Qt3DCore::QEntity *constructDepthRenderQuad();
349
350 bool mRenderCaptureEnabled = true;
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.
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.
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.