QGIS API Documentation 3.99.0-Master (21b3aa880ba)
Loading...
Searching...
No Matches
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"
17
19#include "qgsshadowsettings.h"
20
21#include <Qt3DRender/QCamera>
22#include <Qt3DRender/QCameraSelector>
23#include <Qt3DRender/QClearBuffers>
24#include <Qt3DRender/QCullFace>
25#include <Qt3DRender/QDepthTest>
26#include <Qt3DRender/QFrustumCulling>
27#include <Qt3DRender/QLayer>
28#include <Qt3DRender/QLayerFilter>
29#include <Qt3DRender/QParameter>
30#include <Qt3DRender/QPolygonOffset>
31#include <Qt3DRender/QRenderStateSet>
32#include <Qt3DRender/QRenderSurfaceSelector>
33#include <Qt3DRender/QRenderTarget>
34#include <Qt3DRender/QRenderTargetSelector>
35#include <Qt3DRender/QTexture>
36#include <Qt3DRender/QViewport>
37#include <Qt3DRender/qsubtreeenabler.h>
38
40 : QgsAbstractRenderView( viewName )
41{
42 mLightCamera = new Qt3DRender::QCamera;
43 mLightCamera->setObjectName( mViewName + "::LightCamera" );
44 mEntityCastingShadowsLayer = new Qt3DRender::QLayer;
45 mEntityCastingShadowsLayer->setRecursive( true );
46 mEntityCastingShadowsLayer->setObjectName( mViewName + "::Layer" );
47
48 // shadow rendering pass
49 buildRenderPass();
50}
51
53{
55 mLayerFilter->setEnabled( enable );
56}
57
58Qt3DRender::QRenderTarget *QgsShadowRenderView::buildTextures()
59{
60 mMapTexture = new Qt3DRender::QTexture2D;
61 mMapTexture->setWidth( mDefaultMapResolution );
62 mMapTexture->setHeight( mDefaultMapResolution );
63 mMapTexture->setFormat( Qt3DRender::QTexture2D::TextureFormat::DepthFormat );
64 mMapTexture->setGenerateMipMaps( false );
65 mMapTexture->setMagnificationFilter( Qt3DRender::QTexture2D::Linear );
66 mMapTexture->setMinificationFilter( Qt3DRender::QTexture2D::Linear );
67 mMapTexture->wrapMode()->setX( Qt3DRender::QTextureWrapMode::ClampToEdge );
68 mMapTexture->wrapMode()->setY( Qt3DRender::QTextureWrapMode::ClampToEdge );
69 mMapTexture->setObjectName( mViewName + "::MapTexture" );
70
71 Qt3DRender::QRenderTargetOutput *renderTargetOutput = new Qt3DRender::QRenderTargetOutput;
72 renderTargetOutput->setAttachmentPoint( Qt3DRender::QRenderTargetOutput::Depth );
73 renderTargetOutput->setTexture( mMapTexture );
74
75 Qt3DRender::QRenderTarget *renderTarget = new Qt3DRender::QRenderTarget;
76 renderTarget->setObjectName( mViewName + "::RenderTarget" );
77 renderTarget->addOutput( renderTargetOutput );
78
79 return renderTarget;
80}
81
82void QgsShadowRenderView::buildRenderPass()
83{
84 // build render pass
85 Qt3DRender::QCameraSelector *lightCameraSelector = new Qt3DRender::QCameraSelector( mRendererEnabler );
86 lightCameraSelector->setObjectName( mViewName + "::CameraSelector" );
87 lightCameraSelector->setCamera( mLightCamera );
88
89 mLayerFilter = new Qt3DRender::QLayerFilter( lightCameraSelector );
90 mLayerFilter->addLayer( mEntityCastingShadowsLayer );
91
92 Qt3DRender::QRenderTargetSelector *renderTargetSelector = new Qt3DRender::QRenderTargetSelector( mLayerFilter );
93
94 Qt3DRender::QClearBuffers *clearBuffers = new Qt3DRender::QClearBuffers( renderTargetSelector );
95 clearBuffers->setBuffers( Qt3DRender::QClearBuffers::BufferType::ColorDepthBuffer );
96 clearBuffers->setClearColor( QColor::fromRgbF( 0.0f, 1.0f, 0.0f ) );
97
98 Qt3DRender::QRenderStateSet *renderStateSet = new Qt3DRender::QRenderStateSet( clearBuffers );
99
100 Qt3DRender::QDepthTest *depthTest = new Qt3DRender::QDepthTest;
101 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Less );
102 renderStateSet->addRenderState( depthTest );
103
104 Qt3DRender::QCullFace *cullFace = new Qt3DRender::QCullFace;
105 cullFace->setMode( Qt3DRender::QCullFace::CullingMode::Front );
106 renderStateSet->addRenderState( cullFace );
107
108 Qt3DRender::QPolygonOffset *polygonOffset = new Qt3DRender::QPolygonOffset;
109 polygonOffset->setDepthSteps( 4.0 );
110 polygonOffset->setScaleFactor( 1.1 );
111 renderStateSet->addRenderState( polygonOffset );
112
113 // build texture part
114 Qt3DRender::QRenderTarget *renderTarget = buildTextures();
115
116 renderTargetSelector->setTarget( renderTarget );
117}
118
120{
121 return mEntityCastingShadowsLayer;
122}
123
124
125void QgsShadowRenderView::setMapSize( int width, int height )
126{
127 mMapTexture->setSize( width, height );
128}
129
130Qt3DRender::QTexture2D *QgsShadowRenderView::mapTexture() const
131{
132 return mMapTexture;
133}
Qt3DRender::QSubtreeEnabler * mRendererEnabler
virtual void setEnabled(bool enable)
Enable or disable via enable the render view sub tree.
QgsAbstractRenderView(const QString &viewName)
Constructor for QgsAbstractRenderView with the specified parent object.
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.
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.