QGIS API Documentation 3.39.0-Master (47f7b3a4989)
Loading...
Searching...
No Matches
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
18#include "qgsframegraph.h"
19
20#include <QCoreApplication>
21#include <QOffscreenSurface>
22#include <QSurfaceFormat>
23#include <QOpenGLFunctions>
24
25#include <Qt3DCore/QAspectEngine>
26#include <Qt3DLogic/QLogicAspect>
27#include <Qt3DRender/QCamera>
28#include <Qt3DRender/QCameraSelector>
29#include <Qt3DRender/QClearBuffers>
30#include <Qt3DRender/QRenderAspect>
31#include <Qt3DRender/QRenderSettings>
32#include <Qt3DRender/QRenderTarget>
33#include <Qt3DRender/QRenderTargetOutput>
34#include <Qt3DRender/QRenderTargetSelector>
35#include <Qt3DRender/QRenderSurfaceSelector>
36#include <Qt3DRender/QTexture>
37#include <Qt3DRender/QViewport>
38
40{
41 // Set up a camera to point at the shapes.
42 mCamera = new Qt3DRender::QCamera;
43 mCamera->lens()->setPerspectiveProjection( 45.0f, float( mSize.width() ) / float( mSize.height() ), 0.1f, 1000.0f );
44 mCamera->setPosition( QVector3D( 0, 0, 20.0f ) );
45 mCamera->setUpVector( QVector3D( 0, 1, 0 ) );
46 mCamera->setViewCenter( QVector3D( 0, 0, 0 ) );
47
48 // Set up the engine and the aspects that we want to use.
49 mAspectEngine = new Qt3DCore::QAspectEngine();
50
51#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
52 mRenderAspect = new Qt3DRender::QRenderAspect( Qt3DRender::QRenderAspect::Threaded ); // Only threaded mode seems to work right now.
53#else
54 mRenderAspect = new Qt3DRender::QRenderAspect();
55#endif
56
57 mLogicAspect = new Qt3DLogic::QLogicAspect();
58
59 mAspectEngine->registerAspect( mRenderAspect );
60 mAspectEngine->registerAspect( mLogicAspect );
61
62 // Create the root entity of the engine.
63 // This is not the same as the 3D scene root: the QRenderSettings
64 // component must be held by the root of the QEntity tree,
65 // so it is added to this one. The 3D scene is added as a subtree later,
66 // in setRootEntity().
67 mRoot = new Qt3DCore::QEntity;
68 mRenderSettings = new Qt3DRender::QRenderSettings( mRoot );
69 mRoot->addComponent( mRenderSettings );
70
71 mCamera->setParent( mRoot );
72
73 // Create the offscreen frame graph, which will manage all of the resources required
74 // for rendering without a QWindow.
75 mOffscreenSurface = new QOffscreenSurface();
76
77 QSurfaceFormat format;
78
79 //Use default format when shared OpenGL context is enabled
80 if ( QCoreApplication::instance() && QCoreApplication::instance()->testAttribute( Qt::AA_ShareOpenGLContexts ) )
81 {
82 format = QSurfaceFormat::defaultFormat();
83 }
84 //Set the surface format when used outside of QGIS application
85 else
86 {
87 format.setRenderableType( QSurfaceFormat::OpenGL );
88#ifdef Q_OS_MAC
89 format.setVersion( 4, 1 ); //OpenGL is deprecated on MacOS, use last supported version
90 format.setProfile( QSurfaceFormat::CoreProfile );
91#else
92 format.setVersion( 4, 3 );
93 format.setProfile( QSurfaceFormat::CoreProfile );
94#endif
95 format.setDepthBufferSize( 24 );
96 format.setSamples( 4 );
97 format.setStencilBufferSize( 8 );
98 }
99
100 mOffscreenSurface->setFormat( format );
101 mOffscreenSurface->create();
102
103 mFrameGraph = new QgsFrameGraph( mOffscreenSurface, mSize, mCamera, mRoot );
106 // Set this frame graph to be in use.
107 // the render settings also sets itself as the parent of mSurfaceSelector
108 mRenderSettings->setActiveFrameGraph( mFrameGraph->frameGraphRoot() );
109
110 // Set the root entity of the engine. This causes the engine to begin running.
111 mAspectEngine->setRootEntity( Qt3DCore::QEntityPtr( mRoot ) );
112
113}
114
116{
117 delete mAspectEngine;
118 delete mOffscreenSurface;
119}
120
122{
123 mSize = s;
124
125 mFrameGraph->setSize( mSize );
126 mCamera->setAspectRatio( float( mSize.width() ) / float( mSize.height() ) );
127 emit sizeChanged();
128}
129
130void QgsOffscreen3DEngine::setClearColor( const QColor &color )
131{
132 mFrameGraph->setClearColor( color );
133}
134
139
140void QgsOffscreen3DEngine::setRootEntity( Qt3DCore::QEntity *root )
141{
142 // Make sure any existing scene root is unparented.
143 if ( mSceneRoot )
144 {
145 mSceneRoot->setParent( static_cast<Qt3DCore::QNode *>( nullptr ) );
146 }
147
148 // Parent the incoming scene root to our current root entity.
149 mSceneRoot = root;
150 mSceneRoot->setParent( mRoot );
151 root->addComponent( mFrameGraph->forwardRenderLayer() );
152 root->addComponent( mFrameGraph->castShadowsLayer() );
153}
154
155Qt3DRender::QRenderSettings *QgsOffscreen3DEngine::renderSettings()
156{
157 return mRenderSettings;
158}
159
160Qt3DRender::QCamera *QgsOffscreen3DEngine::camera()
161{
162 return mCamera;
163}
164
166{
167 return mSize;
168}
169
171{
172 return mOffscreenSurface;
173}
void sizeChanged()
Emitted after a call to setSize()
QgsFrameGraph * mFrameGraph
Qt3DRender::QLayer * forwardRenderLayer()
Returns a layer object used to indicate that an entity will be rendered during the forward rendering ...
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.
void setShadowRenderingEnabled(bool enabled)
Sets whether the shadow rendering is enabled.
Qt3DRender::QLayer * castShadowsLayer()
Returns a layer object used to indicate that an entity will cast shadows.
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.