QGIS API Documentation 3.43.0-Master (b60ef06885e)
qgsshadowrenderview.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsshadowrenderview.cpp
3 --------------------------------------
4 Date : June 2024
5 Copyright : (C) 2024 by Benoit De Mezzo and (C) 2020 by Belgacem Nedjima
6 Email : benoit dot de dot mezzo at oslandia dot com
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 "qgsshadowrenderview.h"
18#include "qgsshadowsettings.h"
19
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/qsubtreeenabler.h>
37
39 : QgsAbstractRenderView( viewName )
40{
41 mLightCamera = new Qt3DRender::QCamera;
42 mLightCamera->setObjectName( mViewName + "::LightCamera" );
43 mEntityCastingShadowsLayer = new Qt3DRender::QLayer;
44 mEntityCastingShadowsLayer->setRecursive( true );
45 mEntityCastingShadowsLayer->setObjectName( mViewName + "::Layer" );
46
47 // shadow rendering pass
48 buildRenderPass();
49}
50
52{
54 mLayerFilter->setEnabled( enable );
55}
56
57Qt3DRender::QRenderTarget *QgsShadowRenderView::buildTextures()
58{
59 mMapTexture = new Qt3DRender::QTexture2D;
60 mMapTexture->setWidth( mDefaultMapResolution );
61 mMapTexture->setHeight( mDefaultMapResolution );
62 mMapTexture->setFormat( Qt3DRender::QTexture2D::TextureFormat::DepthFormat );
63 mMapTexture->setGenerateMipMaps( false );
64 mMapTexture->setMagnificationFilter( Qt3DRender::QTexture2D::Linear );
65 mMapTexture->setMinificationFilter( Qt3DRender::QTexture2D::Linear );
66 mMapTexture->wrapMode()->setX( Qt3DRender::QTextureWrapMode::ClampToEdge );
67 mMapTexture->wrapMode()->setY( Qt3DRender::QTextureWrapMode::ClampToEdge );
68 mMapTexture->setObjectName( mViewName + "::MapTexture" );
69
70 Qt3DRender::QRenderTargetOutput *renderTargetOutput = new Qt3DRender::QRenderTargetOutput;
71 renderTargetOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Depth );
72 renderTargetOutput->setTexture( mMapTexture );
73
74 Qt3DRender::QRenderTarget *renderTarget = new Qt3DRender::QRenderTarget;
75 renderTarget->setObjectName( mViewName + "::RenderTarget" );
76 renderTarget->addOutput( renderTargetOutput );
77
78 return renderTarget;
79}
80
81void QgsShadowRenderView::buildRenderPass()
82{
83 // build render pass
84 Qt3DRender::QCameraSelector *lightCameraSelector = new Qt3DRender::QCameraSelector( mRendererEnabler );
85 lightCameraSelector->setObjectName( mViewName + "::CameraSelector" );
86 lightCameraSelector->setCamera( mLightCamera );
87
88 mLayerFilter = new Qt3DRender::QLayerFilter( lightCameraSelector );
89 mLayerFilter->addLayer( mEntityCastingShadowsLayer );
90
91 Qt3DRender::QRenderTargetSelector *renderTargetSelector = new Qt3DRender::QRenderTargetSelector( mLayerFilter );
92
93 Qt3DRender::QClearBuffers *clearBuffers = new Qt3DRender::QClearBuffers( renderTargetSelector );
94 clearBuffers->setBuffers( Qt3DRender::QClearBuffers::BufferType::ColorDepthBuffer );
95 clearBuffers->setClearColor( QColor::fromRgbF( 0.0f, 1.0f, 0.0f ) );
96
97 Qt3DRender::QRenderStateSet *renderStateSet = new Qt3DRender::QRenderStateSet( clearBuffers );
98
99 Qt3DRender::QDepthTest *depthTest = new Qt3DRender::QDepthTest;
100 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
101 renderStateSet->addRenderState( depthTest );
102
103 Qt3DRender::QCullFace *cullFace = new Qt3DRender::QCullFace;
104 cullFace->setMode( Qt3DRender::QCullFace::CullingMode::Front );
105 renderStateSet->addRenderState( cullFace );
106
107 Qt3DRender::QPolygonOffset *polygonOffset = new Qt3DRender::QPolygonOffset;
108 polygonOffset->setDepthSteps( 4.0 );
109 polygonOffset->setScaleFactor( 1.1 );
110 renderStateSet->addRenderState( polygonOffset );
111
112 // build texture part
113 Qt3DRender::QRenderTarget *renderTarget = buildTextures();
114
115 renderTargetSelector->setTarget( renderTarget );
116}
117
119{
120 return mEntityCastingShadowsLayer;
121}
122
123void QgsShadowRenderView::setMapSize( int width, int height )
124{
125 mMapTexture->setSize( width, height );
126}
127
128Qt3DRender::QTexture2D *QgsShadowRenderView::mapTexture() const
129{
130 return mMapTexture;
131}
Base class for 3D render view.
Qt3DRender::QSubtreeEnabler * mRendererEnabler
virtual void setEnabled(bool enable)
Enable or disable via enable the render view sub tree.
Qt3DRender::QLayer * entityCastingShadowsLayer() const
Returns the layer to be used by entities to be included in this renderview.
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.
QgsShadowRenderView(const QString &viewName)
Default constructor.
Qt3DRender::QTexture2D * mapTexture() const
Returns shadow depth texture.