17#include "moc_qgsframegraph.cpp" 
   26#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) 
   27#include <Qt3DRender/QAttribute> 
   28#include <Qt3DRender/QBuffer> 
   29#include <Qt3DRender/QGeometry> 
   35#include <Qt3DCore/QAttribute> 
   36#include <Qt3DCore/QBuffer> 
   37#include <Qt3DCore/QGeometry> 
   44#include <Qt3DRender/QGeometryRenderer> 
   45#include <Qt3DRender/QTechnique> 
   46#include <Qt3DRender/QGraphicsApiFilter> 
   47#include <Qt3DRender/QBlendEquation> 
   48#include <Qt3DRender/QColorMask> 
   49#include <Qt3DRender/QSortPolicy> 
   50#include <Qt3DRender/QNoDepthMask> 
   51#include <Qt3DRender/QBlendEquationArguments> 
   52#include <Qt3DRender/QAbstractTexture> 
   53#include <Qt3DRender/QNoDraw> 
   69void QgsFrameGraph::constructForwardRenderPass()
 
   74void QgsFrameGraph::constructShadowRenderPass()
 
   79void QgsFrameGraph::constructDebugTexturePass( Qt3DRender::QFrameGraphNode *topNode )
 
   84Qt3DRender::QFrameGraphNode *QgsFrameGraph::constructSubPostPassForProcessing()
 
   86  Qt3DRender::QCameraSelector *cameraSelector = 
new Qt3DRender::QCameraSelector;
 
   87  cameraSelector->setObjectName( 
"Sub pass Postprocessing" );
 
   90  Qt3DRender::QLayerFilter *layerFilter = 
new Qt3DRender::QLayerFilter( cameraSelector );
 
   93  new Qt3DRender::QClearBuffers( layerFilter );
 
   95  Qt3DRender::QLayer *postProcessingLayer = 
new Qt3DRender::QLayer();
 
   97  layerFilter->addLayer( postProcessingLayer );
 
   98  mPostprocessingEntity->setObjectName( 
"PostProcessingPassEntity" );
 
  100  return cameraSelector;
 
  103Qt3DRender::QFrameGraphNode *QgsFrameGraph::constructSubPostPassForRenderCapture()
 
  105  Qt3DRender::QFrameGraphNode *top = 
new Qt3DRender::QNoDraw;
 
  106  top->setObjectName( 
"Sub pass RenderCapture" );
 
  108  mRenderCapture = 
new Qt3DRender::QRenderCapture( top );
 
  113Qt3DRender::QFrameGraphNode *QgsFrameGraph::constructPostprocessingPass()
 
  115  mRenderCaptureTargetSelector = 
new Qt3DRender::QRenderTargetSelector;
 
  116  mRenderCaptureTargetSelector->setObjectName( 
"Postprocessing render pass" );
 
  117  mRenderCaptureTargetSelector->setEnabled( mRenderCaptureEnabled );
 
  119  Qt3DRender::QRenderTarget *renderTarget = 
new Qt3DRender::QRenderTarget( mRenderCaptureTargetSelector );
 
  125  Qt3DRender::QRenderTargetOutput *colorOutput = 
new Qt3DRender::QRenderTargetOutput( renderTarget );
 
  126  colorOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Color0 );
 
  129  mRenderCaptureColorTexture = 
new Qt3DRender::QTexture2D( colorOutput );
 
  130  mRenderCaptureColorTexture->setSize( mSize.width(), mSize.height() );
 
  131  mRenderCaptureColorTexture->setFormat( Qt3DRender::QAbstractTexture::RGB8_UNorm );
 
  132  mRenderCaptureColorTexture->setMinificationFilter( Qt3DRender::QAbstractTexture::Linear );
 
  133  mRenderCaptureColorTexture->setMagnificationFilter( Qt3DRender::QAbstractTexture::Linear );
 
  134  mRenderCaptureColorTexture->setObjectName( 
"PostProcessingPass::ColorTarget" );
 
  137  colorOutput->setTexture( mRenderCaptureColorTexture );
 
  138  renderTarget->addOutput( colorOutput );
 
  140  Qt3DRender::QRenderTargetOutput *depthOutput = 
new Qt3DRender::QRenderTargetOutput( renderTarget );
 
  142  depthOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Depth );
 
  143  mRenderCaptureDepthTexture = 
new Qt3DRender::QTexture2D( depthOutput );
 
  144  mRenderCaptureDepthTexture->setSize( mSize.width(), mSize.height() );
 
  145  mRenderCaptureDepthTexture->setFormat( Qt3DRender::QAbstractTexture::DepthFormat );
 
  146  mRenderCaptureDepthTexture->setMinificationFilter( Qt3DRender::QAbstractTexture::Linear );
 
  147  mRenderCaptureDepthTexture->setMagnificationFilter( Qt3DRender::QAbstractTexture::Linear );
 
  148  mRenderCaptureDepthTexture->setComparisonFunction( Qt3DRender::QAbstractTexture::CompareLessEqual );
 
  149  mRenderCaptureDepthTexture->setComparisonMode( Qt3DRender::QAbstractTexture::CompareRefToTexture );
 
  150  mRenderCaptureDepthTexture->setObjectName( 
"PostProcessingPass::DepthTarget" );
 
  152  depthOutput->setTexture( mRenderCaptureDepthTexture );
 
  153  renderTarget->addOutput( depthOutput );
 
  155  mRenderCaptureTargetSelector->setTarget( renderTarget );
 
  158  constructSubPostPassForProcessing()->setParent( mRenderCaptureTargetSelector );
 
  159  constructDebugTexturePass( mRenderCaptureTargetSelector );
 
  160  constructSubPostPassForRenderCapture()->setParent( mRenderCaptureTargetSelector );
 
  162  return mRenderCaptureTargetSelector;
 
  165void QgsFrameGraph::constructAmbientOcclusionRenderPass()
 
  173Qt3DRender::QFrameGraphNode *QgsFrameGraph::constructRubberBandsPass()
 
  175  mRubberBandsCameraSelector = 
new Qt3DRender::QCameraSelector;
 
  176  mRubberBandsCameraSelector->setObjectName( 
"RubberBands Pass CameraSelector" );
 
  177  mRubberBandsCameraSelector->setCamera( mMainCamera );
 
  179  mRubberBandsLayerFilter = 
new Qt3DRender::QLayerFilter( mRubberBandsCameraSelector );
 
  180  mRubberBandsLayerFilter->addLayer( mRubberBandsLayer );
 
  182  Qt3DRender::QBlendEquationArguments *blendState = 
new Qt3DRender::QBlendEquationArguments;
 
  183  blendState->setSourceRgb( Qt3DRender::QBlendEquationArguments::SourceAlpha );
 
  184  blendState->setDestinationRgb( Qt3DRender::QBlendEquationArguments::OneMinusSourceAlpha );
 
  186  Qt3DRender::QBlendEquation *blendEquation = 
new Qt3DRender::QBlendEquation;
 
  187  blendEquation->setBlendFunction( Qt3DRender::QBlendEquation::Add );
 
  189  mRubberBandsStateSet = 
new Qt3DRender::QRenderStateSet( mRubberBandsLayerFilter );
 
  190  Qt3DRender::QDepthTest *depthTest = 
new Qt3DRender::QDepthTest;
 
  191  depthTest->setDepthFunction( Qt3DRender::QDepthTest::Always );
 
  192  mRubberBandsStateSet->addRenderState( depthTest );
 
  193  mRubberBandsStateSet->addRenderState( blendState );
 
  194  mRubberBandsStateSet->addRenderState( blendEquation );
 
  199  mRubberBandsRenderTargetSelector = 
new Qt3DRender::QRenderTargetSelector( mRubberBandsStateSet );
 
  200  mRubberBandsRenderTargetSelector->setTarget( 
forwardRenderView().renderTargetSelector()->target() );
 
  202  return mRubberBandsCameraSelector;
 
  206void QgsFrameGraph::constructDepthRenderPass()
 
  254  mRubberBandsLayer = 
new Qt3DRender::QLayer;
 
  255  mRubberBandsLayer->setObjectName( 
"mRubberBandsLayer" );
 
  256  mRubberBandsLayer->setRecursive( 
true );
 
  258  mRenderSurfaceSelector = 
new Qt3DRender::QRenderSurfaceSelector;
 
  260  QObject *surfaceObj = 
dynamic_cast<QObject *
>( surface );
 
  261  Q_ASSERT( surfaceObj );
 
  263  mRenderSurfaceSelector->setSurface( surfaceObj );
 
  264  mRenderSurfaceSelector->setExternalRenderTargetSize( mSize );
 
  266  mMainViewPort = 
new Qt3DRender::QViewport( mRenderSurfaceSelector );
 
  267  mMainViewPort->setNormalizedRect( QRectF( 0.0f, 0.0f, 1.0f, 1.0f ) );
 
  270  constructForwardRenderPass();
 
  273  Qt3DRender::QFrameGraphNode *rubberBandsPass = constructRubberBandsPass();
 
  274  rubberBandsPass->setObjectName( 
"rubberBandsPass" );
 
  275  rubberBandsPass->setParent( mMainViewPort );
 
  278  constructShadowRenderPass();
 
  281  constructDepthRenderPass();
 
  284  constructAmbientOcclusionRenderPass();
 
  287  Qt3DRender::QFrameGraphNode *postprocessingPass = constructPostprocessingPass();
 
  288  postprocessingPass->setParent( mMainViewPort );
 
  289  postprocessingPass->setObjectName( 
"PostProcessingPass" );
 
  291  mRubberBandsRootEntity = 
new Qt3DCore::QEntity( mRootEntity );
 
  292  mRubberBandsRootEntity->setObjectName( 
"mRubberBandsRootEntity" );
 
  293  mRubberBandsRootEntity->addComponent( mRubberBandsLayer );
 
 
  298  if ( mRenderViewMap.find( name ) != mRenderViewMap.end() )
 
  300    mRenderViewMap[name]->topGraphNode()->setParent( ( QNode * ) 
nullptr );
 
  301    mRenderViewMap.erase( name );
 
 
  308  if ( mRenderViewMap.find( name ) == mRenderViewMap.end() )
 
  310    mRenderViewMap[name] = std::move( 
renderView );
 
  311    mRenderViewMap[name]->topGraphNode()->setParent( topNode ? topNode : mMainViewPort );
 
  312    mRenderViewMap[name]->updateWindowResize( mSize.width(), mSize.height() );
 
 
  323  if ( mRenderViewMap[name] )
 
  325    mRenderViewMap[name]->setEnabled( enable );
 
 
  331  if ( mRenderViewMap.find( name ) != mRenderViewMap.end() )
 
  333    return mRenderViewMap[name].get();
 
 
  340  return mRenderViewMap[name] != 
nullptr && mRenderViewMap[name]->isEnabled();
 
 
  368    for ( 
int i = 0, dirLight = 0; !light && i < lightSources.size(); i++ )
 
  372        if ( dirLight == selectedLight )
 
  373          light = qgis::down_cast< QgsDirectionalLightSettings * >( lightSources[i] );
 
 
  405  if ( mShadowTextureDebugging )
 
  412      delete mShadowTextureDebugging;
 
  413      mShadowTextureDebugging = 
nullptr;
 
 
  429  if ( mDepthTextureDebugging )
 
  436      delete mDepthTextureDebugging;
 
  437      mDepthTextureDebugging = 
nullptr;
 
 
  444  QObject *top = mRenderSurfaceSelector;
 
  445  while ( top->parent() && 
dynamic_cast<Qt3DRender::QFrameGraphNode *
>( top->parent() ) )
 
  449  context.
lowestId = mMainCamera->id().id();
 
  452  return strList.join( 
"\n" ) + QString( 
"\n" );
 
 
  458  return strList.join( 
"\n" ) + QString( 
"\n" );
 
 
  474  for ( 
auto it = mRenderViewMap.begin(); it != mRenderViewMap.end(); ++it )
 
  480  mRenderCaptureColorTexture->setSize( mSize.width(), mSize.height() );
 
  481  mRenderCaptureDepthTexture->setSize( mSize.width(), mSize.height() );
 
  482  mRenderSurfaceSelector->setExternalRenderTargetSize( mSize );
 
 
  487  return mRenderCapture;
 
 
  492  if ( enabled == mRenderCaptureEnabled )
 
  494  mRenderCaptureEnabled = enabled;
 
  495  mRenderCaptureTargetSelector->setEnabled( mRenderCaptureEnabled );
 
 
@ Directional
Directional light source.
 
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.
 
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 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.
 
virtual 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.
 
An entity that is responsible for debugging texture.
 
void setPosition(Qt::Corner corner, double size)
Sets the texture debugging parameters.
 
Simple renderview to preview/debug textures.
 
Qt3DRender::QLayer * debugLayer() 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 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 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.
 
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 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.
 
void updateDebugDepthMapSettings(const Qgs3DMapSettings &settings)
Updates settings for depth debug map.
 
static const QString AXIS3D_RENDERVIEW
 
QgsForwardRenderView & forwardRenderView()
Returns forward renderview.
 
QString dumpSceneGraph() const
Dumps scene graph as string.
 
QgsShadowRenderView & shadowRenderView()
Returns shadow renderview.
 
static const QString DEBUG_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.
 
An entity that is responsible for applying post processing effects.
 
void setAmbientOcclusionEnabled(bool enabled)
Sets whether screen space ambient occlusion is enabled.
 
void setShadowRenderingEnabled(bool enabled)
Sets whether shadow rendering is enabled.
 
void updateShadowSettings(const QgsDirectionalLightSettings &light, float maximumShadowRenderingDistance)
Sets shadow rendering to use a directional light.
 
void setEyeDomeLightingDistance(int distance)
Sets the eye dome lighting distance (contributes to the contrast of the image)
 
void setShadowBias(float shadowBias)
Sets the shadow bias value.
 
void setEyeDomeLightingStrength(double strength)
Sets the eye dome lighting strength.
 
void setEyeDomeLightingEnabled(bool enabled)
Sets whether eye dome lighting is enabled.
 
Container class that holds different objects related to shadow rendering.
 
void setMapSize(int width, int height)
Update shadow depth texture size.
 
virtual 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...
 
Qt3DCore::QAttribute Qt3DQAttribute
 
Qt3DCore::QBuffer Qt3DQBuffer
 
Qt3DCore::QGeometry Qt3DQGeometry