QGIS API Documentation 3.99.0-Master (2fe06baccd8)
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
19#include "qgsframegraph.h"
20#include "qgsshadowrenderview.h"
21
22#include <QCoreApplication>
23#include <QOffscreenSurface>
24#include <QOpenGLFunctions>
25#include <QSurfaceFormat>
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/QRenderSurfaceSelector>
34#include <Qt3DRender/QRenderTarget>
35#include <Qt3DRender/QRenderTargetOutput>
36#include <Qt3DRender/QRenderTargetSelector>
37#include <Qt3DRender/QTexture>
38#include <Qt3DRender/QViewport>
39
40#include "moc_qgsoffscreen3dengine.cpp"
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 );
107 mFrameGraph->shadowRenderView().setEnabled( false );
108 // Set this frame graph to be in use.
109 // the render settings also sets itself as the parent of mSurfaceSelector
110 mRenderSettings->setActiveFrameGraph( mFrameGraph->frameGraphRoot() );
111
112 // Set the root entity of the engine. This causes the engine to begin running.
113 mAspectEngine->setRootEntity( Qt3DCore::QEntityPtr( mRoot ) );
114}
115
117{
118 delete mAspectEngine;
119 delete mOffscreenSurface;
120}
121
123{
124 mSize = s;
125
126 mFrameGraph->setSize( mSize );
127 mCamera->setAspectRatio( float( mSize.width() ) / float( mSize.height() ) );
128 emit sizeChanged();
129}
130
131void QgsOffscreen3DEngine::setClearColor( const QColor &color )
132{
133 mFrameGraph->setClearColor( color );
134}
135
137{
138 mFrameGraph->setFrustumCullingEnabled( enabled );
139}
140
141void QgsOffscreen3DEngine::setRootEntity( Qt3DCore::QEntity *root )
142{
143 // Make sure any existing scene root is unparented.
144 if ( mSceneRoot )
145 {
146 mSceneRoot->setParent( static_cast<Qt3DCore::QNode *>( nullptr ) );
147 }
148
149 // Parent the incoming scene root to our current root entity.
150 mSceneRoot = root;
151 mSceneRoot->setParent( mRoot );
152 root->addComponent( mFrameGraph->forwardRenderView().renderLayer() );
153 root->addComponent( mFrameGraph->shadowRenderView().entityCastingShadowsLayer() );
154}
155
156Qt3DRender::QRenderSettings *QgsOffscreen3DEngine::renderSettings()
157{
158 return mRenderSettings;
159}
160
161Qt3DRender::QCamera *QgsOffscreen3DEngine::camera()
162{
163 return mCamera;
164}
165
167{
168 return mSize;
169}
170
172{
173 return mOffscreenSurface;
174}
void sizeChanged()
Emitted after a call to setSize().
QgsFrameGraph * mFrameGraph
Container class that holds different objects related to frame graphs of 3D scenes.
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.