QGIS API Documentation 3.43.0-Master (c4a2e9c6d2f)
qgsoffscreen3dengine.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsoffscreen3dengine.cpp
3 --------------------------------------
4 Date : July 2018
5 Copyright : (C) 2018 by Martin Dobias
6 Email : wonder dot sk at gmail 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#include "moc_qgsoffscreen3dengine.cpp"
18
19#include "qgsframegraph.h"
20
21#include <QCoreApplication>
22#include <QOffscreenSurface>
23#include <QSurfaceFormat>
24#include <QOpenGLFunctions>
25
26#include <Qt3DCore/QAspectEngine>
27#include <Qt3DLogic/QLogicAspect>
28#include <Qt3DRender/QCamera>
29#include <Qt3DRender/QCameraSelector>
30#include <Qt3DRender/QClearBuffers>
31#include <Qt3DRender/QRenderAspect>
32#include <Qt3DRender/QRenderSettings>
33#include <Qt3DRender/QRenderTarget>
34#include <Qt3DRender/QRenderTargetOutput>
35#include <Qt3DRender/QRenderTargetSelector>
36#include <Qt3DRender/QRenderSurfaceSelector>
37#include <Qt3DRender/QTexture>
38#include <Qt3DRender/QViewport>
39#include "qgsshadowrenderview.h"
41
43{
44 // Set up a camera to point at the shapes.
45 mCamera = new Qt3DRender::QCamera;
46 mCamera->lens()->setPerspectiveProjection( 45.0f, float( mSize.width() ) / float( mSize.height() ), 0.1f, 1000.0f );
47 mCamera->setPosition( QVector3D( 0, 0, 20.0f ) );
48 mCamera->setUpVector( QVector3D( 0, 1, 0 ) );
49 mCamera->setViewCenter( QVector3D( 0, 0, 0 ) );
50
51 // Set up the engine and the aspects that we want to use.
52 mAspectEngine = new Qt3DCore::QAspectEngine();
53
54#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 )
55 mRenderAspect = new Qt3DRender::QRenderAspect( Qt3DRender::QRenderAspect::Threaded ); // Only threaded mode seems to work right now.
56#else
57 mRenderAspect = new Qt3DRender::QRenderAspect();
58#endif
59
60 mLogicAspect = new Qt3DLogic::QLogicAspect();
61
62 mAspectEngine->registerAspect( mRenderAspect );
63 mAspectEngine->registerAspect( mLogicAspect );
64
65 // Create the root entity of the engine.
66 // This is not the same as the 3D scene root: the QRenderSettings
67 // component must be held by the root of the QEntity tree,
68 // so it is added to this one. The 3D scene is added as a subtree later,
69 // in setRootEntity().
70 mRoot = new Qt3DCore::QEntity;
71 mRenderSettings = new Qt3DRender::QRenderSettings( mRoot );
72 mRoot->addComponent( mRenderSettings );
73
74 mCamera->setParent( mRoot );
75
76 // Create the offscreen frame graph, which will manage all of the resources required
77 // for rendering without a QWindow.
78 mOffscreenSurface = new QOffscreenSurface();
79
80 QSurfaceFormat format;
81
82 //Use default format when shared OpenGL context is enabled
83 if ( QCoreApplication::instance() && QCoreApplication::instance()->testAttribute( Qt::AA_ShareOpenGLContexts ) )
84 {
85 format = QSurfaceFormat::defaultFormat();
86 }
87 //Set the surface format when used outside of QGIS application
88 else
89 {
90 format.setRenderableType( QSurfaceFormat::OpenGL );
91#ifdef Q_OS_MAC
92 format.setVersion( 4, 1 ); //OpenGL is deprecated on MacOS, use last supported version
93 format.setProfile( QSurfaceFormat::CoreProfile );
94#else
95 format.setVersion( 4, 3 );
96 format.setProfile( QSurfaceFormat::CoreProfile );
97#endif
98 format.setDepthBufferSize( 24 );
99 format.setSamples( 4 );
100 format.setStencilBufferSize( 8 );
101 }
102
103 mOffscreenSurface->setFormat( format );
104 mOffscreenSurface->create();
105
106 mFrameGraph = new QgsFrameGraph( mOffscreenSurface, mSize, mCamera, mRoot );
109 // Set this frame graph to be in use.
110 // the render settings also sets itself as the parent of mSurfaceSelector
111 mRenderSettings->setActiveFrameGraph( mFrameGraph->frameGraphRoot() );
112
113 // Set the root entity of the engine. This causes the engine to begin running.
114 mAspectEngine->setRootEntity( Qt3DCore::QEntityPtr( mRoot ) );
115}
116
118{
119 delete mAspectEngine;
120 delete mOffscreenSurface;
121}
122
124{
125 mSize = s;
126
127 mFrameGraph->setSize( mSize );
128 mCamera->setAspectRatio( float( mSize.width() ) / float( mSize.height() ) );
129 emit sizeChanged();
130}
131
132void QgsOffscreen3DEngine::setClearColor( const QColor &color )
133{
134 mFrameGraph->setClearColor( color );
135}
136
141
142void QgsOffscreen3DEngine::setRootEntity( Qt3DCore::QEntity *root )
143{
144 // Make sure any existing scene root is unparented.
145 if ( mSceneRoot )
146 {
147 mSceneRoot->setParent( static_cast<Qt3DCore::QNode *>( nullptr ) );
148 }
149
150 // Parent the incoming scene root to our current root entity.
151 mSceneRoot = root;
152 mSceneRoot->setParent( mRoot );
153 root->addComponent( mFrameGraph->forwardRenderView().renderLayer() );
154 root->addComponent( mFrameGraph->shadowRenderView().entityCastingShadowsLayer() );
155}
156
157Qt3DRender::QRenderSettings *QgsOffscreen3DEngine::renderSettings()
158{
159 return mRenderSettings;
160}
161
162Qt3DRender::QCamera *QgsOffscreen3DEngine::camera()
163{
164 return mCamera;
165}
166
168{
169 return mSize;
170}
171
173{
174 return mOffscreenSurface;
175}
void sizeChanged()
Emitted after a call to setSize()
QgsFrameGraph * mFrameGraph
Qt3DRender::QLayer * renderLayer()
Returns a layer object used to indicate that the object is transparent.
Container class that holds different objects related to frame graphs of 3D scenes.
void setRenderCaptureEnabled(bool enabled)
Sets whether it will be possible to render to an image.
Qt3DRender::QFrameGraphNode * frameGraphRoot()
Returns the root of the frame graph object.
void setClearColor(const QColor &clearColor)
Sets the clear color of the scene (background color)
void setFrustumCullingEnabled(bool enabled)
Sets whether frustum culling is enabled.
QgsForwardRenderView & forwardRenderView()
Returns forward renderview.
QgsShadowRenderView & shadowRenderView()
Returns shadow renderview.
void setSize(QSize s)
Sets the size of the buffers used for rendering.
void setSize(QSize s) override
Sets the size of the rendering area (in pixels)
void setClearColor(const QColor &color) override
Sets background color of the scene.
QSize size() const override
Returns size of the engine's rendering area in pixels.
void setRootEntity(Qt3DCore::QEntity *root) override
Sets root entity of the 3D scene.
void setFrustumCullingEnabled(bool enabled) override
Sets whether frustum culling is enabled (this should make rendering faster by not rendering entities ...
Qt3DRender::QCamera * camera() override
Returns pointer to the engine's camera entity.
Qt3DRender::QRenderSettings * renderSettings() override
Returns access to the engine's render settings (the frame graph can be accessed from here)
QSurface * surface() const override
Returns the surface of the engine.
Qt3DRender::QLayer * entityCastingShadowsLayer() const
Returns the layer to be used by entities to be included in this renderview.
virtual void setEnabled(bool enable) override
Enable or disable via enable the renderview sub tree.