QGIS API Documentation 4.3.0-Master (1930e81c918)
Loading...
Searching...
No Matches
qgsrubberbandrenderview.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsrubberbandrenderview.cpp
3 --------------------------------------
4 Date : June 2026
5 Copyright : (C) 2026 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
17
18#include <Qt3DRender/QBlendEquation>
19#include <Qt3DRender/QBlendEquationArguments>
20#include <Qt3DRender/QCamera>
21#include <Qt3DRender/QCameraSelector>
22#include <Qt3DRender/QDepthTest>
23#include <Qt3DRender/QLayer>
24#include <Qt3DRender/QLayerFilter>
25#include <Qt3DRender/QRenderStateSet>
26#include <Qt3DRender/QRenderTargetSelector>
27#include <Qt3DRender/qsubtreeenabler.h>
28
29QgsRubberBandRenderView::QgsRubberBandRenderView( const QString &viewName, Qt3DRender::QCamera *mainCamera, Qt3DCore::QEntity *rootSceneEntity, Qt3DRender::QRenderTarget *fwdRenderTarget )
30 : QgsAbstractRenderView( viewName )
31 , mMainCamera( mainCamera )
32{
33 mLayer = new Qt3DRender::QLayer;
34 mLayer->setRecursive( true );
35 mLayer->setObjectName( mViewName + "::Layer" );
36
37 // rubberband rendering pass
38 constructRenderPass( fwdRenderTarget ); //#spellok
39
40 mRootEntity = new Qt3DCore::QEntity( rootSceneEntity );
41 mRootEntity->setObjectName( "mRubberBandsRootEntity" );
42 mRootEntity->addComponent( mLayer );
43}
44
45void QgsRubberBandRenderView::constructRenderPass( Qt3DRender::QRenderTarget *fwdRenderTarget ) //#spellok
46{
47 Qt3DRender::QCameraSelector *cameraSelector = new Qt3DRender::QCameraSelector( mRendererEnabler );
48 cameraSelector->setObjectName( mViewName + "::CameraSelector" );
49 cameraSelector->setCamera( mMainCamera );
50
51 Qt3DRender::QLayerFilter *layerFilter = new Qt3DRender::QLayerFilter( cameraSelector );
52 layerFilter->addLayer( mLayer );
53
54 Qt3DRender::QRenderStateSet *stateSet = new Qt3DRender::QRenderStateSet( layerFilter );
55
56 Qt3DRender::QDepthTest *depthTest = new Qt3DRender::QDepthTest;
57 depthTest->setDepthFunction( Qt3DRender::QDepthTest::Always );
58 stateSet->addRenderState( depthTest );
59
60 Qt3DRender::QBlendEquationArguments *blendState = new Qt3DRender::QBlendEquationArguments;
61 blendState->setSourceRgb( Qt3DRender::QBlendEquationArguments::SourceAlpha );
62 blendState->setDestinationRgb( Qt3DRender::QBlendEquationArguments::OneMinusSourceAlpha );
63 stateSet->addRenderState( blendState );
64
65 Qt3DRender::QBlendEquation *blendEquation = new Qt3DRender::QBlendEquation;
66 blendEquation->setBlendFunction( Qt3DRender::QBlendEquation::Add );
67 stateSet->addRenderState( blendEquation );
68
69 // Here we attach our drawings to the render target also used by forward pass.
70 // This is kind of okay, but as a result, post-processing effects get applied
71 // to rubber bands too. Ideally we would want them on top of everything.
72 mRenderTargetSelector = new Qt3DRender::QRenderTargetSelector( stateSet );
73
74 mRenderTargetSelector->setTarget( fwdRenderTarget );
75}
76
78{
79 return mRootEntity;
80}
81
82Qt3DRender::QRenderTargetSelector *QgsRubberBandRenderView::renderTargetSelector() const
83{
84 return mRenderTargetSelector;
85};
Qt3DRender::QSubtreeEnabler * mRendererEnabler
QgsAbstractRenderView(const QString &viewName)
Constructor for QgsAbstractRenderView with the specified parent object.
Qt3DRender::QRenderTargetSelector * renderTargetSelector() const
Returns rubberband tard selector.
QgsRubberBandRenderView(const QString &viewName, Qt3DRender::QCamera *mainCamera, Qt3DCore::QEntity *rootSceneEntity, Qt3DRender::QRenderTarget *fwdRenderTarget)
Default constructor.
Qt3DCore::QEntity * rubberBandEntity() const
Returns entity for all rubber bands (to show them always on top).