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