QGIS API Documentation  3.27.0-Master (e113457133)
qgs3dmapscene.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgs3dmapscene.h
3  --------------------------------------
4  Date : July 2017
5  Copyright : (C) 2017 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 
16 #ifndef QGS3DMAPSCENE_H
17 #define QGS3DMAPSCENE_H
18 
19 #include "qgis_3d.h"
20 
21 #include <Qt3DCore/QEntity>
22 
23 #include "qgsfeatureid.h"
25 #include "qgsray3d.h"
26 #include "qgscameracontroller.h"
27 
28 namespace Qt3DRender
29 {
30  class QRenderSettings;
31  class QCamera;
32  class QPickEvent;
33  class QObjectPicker;
34 }
35 
36 namespace Qt3DLogic
37 {
38  class QFrameAction;
39 }
40 
41 namespace Qt3DExtras
42 {
43  class QForwardRenderer;
44  class QSkyboxEntity;
45 }
46 
47 class Qgs3DAxis;
50 class QgsMapLayer;
52 class Qgs3DMapSettings;
53 class QgsTerrainEntity;
54 class QgsChunkedEntity;
55 class QgsSkyboxEntity;
56 class QgsSkyboxSettings;
60 class QgsChunkNode;
61 
62 #define SIP_NO_FILE
63 
70 class _3D_EXPORT Qgs3DMapScene : public Qt3DCore::QEntity
71 {
72  Q_OBJECT
73  public:
76 
78  QgsCameraController *cameraController() { return mCameraController; }
80  QgsTerrainEntity *terrainEntity() { return mTerrain; }
81 
83  void viewZoomFull();
84 
90  void setViewFrom2DExtent( const QgsRectangle &extent );
91 
97  QVector<QgsPointXY> viewFrustum2DExtent();
98 
100  int terrainPendingJobsCount() const;
101 
106  int totalPendingJobsCount() const;
107 
110  {
113  };
114 
116  SceneState sceneState() const { return mSceneState; }
117 
119  void registerPickHandler( Qgs3DMapScenePickHandler *pickHandler );
121  void unregisterPickHandler( Qgs3DMapScenePickHandler *pickHandler );
122 
127  float worldSpaceError( float epsilon, float distance );
128 
130  void exportScene( const Qgs3DMapExportSettings &exportSettings );
131 
137  QVector<const QgsChunkNode *> getLayerActiveChunkNodes( QgsMapLayer *layer ) SIP_SKIP;
138 
144  QgsRectangle sceneExtent();
145 
151  Qgs3DAxis *get3DAxis() { return m3DAxis; }
152 
158  QgsAbstract3DEngine *engine() { return mEngine; }
159 
160  signals:
165 
173 
175  void fpsCountChanged( float fpsCount );
177  void fpsCounterEnabledChanged( bool fpsCounterEnabled );
178 
184  void viewed2DExtentFrom3DChanged( QVector<QgsPointXY> extent );
185 
186  public slots:
188  void updateTemporal();
189 
190  private slots:
191  void onCameraChanged();
192  void onFrameTriggered( float dt );
193  void createTerrain();
194  void onLayerRenderer3DChanged();
195  void onLayersChanged();
196  void createTerrainDeferred();
197  void onBackgroundColorChanged();
198  void onLayerEntityPickedObject( Qt3DRender::QPickEvent *pickEvent, QgsFeatureId fid );
199  void updateLights();
200  void updateCameraLens();
201  void onRenderersChanged();
202  void onSkyboxSettingsChanged();
203  void onShadowSettingsChanged();
204  void onEyeDomeShadingSettingsChanged();
205  void onDebugShadowMapSettingsChanged();
206  void onDebugDepthMapSettingsChanged();
207  void onCameraMovementSpeedChanged();
208  void onCameraNavigationModeChanged();
209  void onDebugOverlayEnabledChanged();
210 
211  void on3DAxisSettingsChanged();
212 
213  bool updateCameraNearFarPlanes();
214 
215  private:
216  void addLayerEntity( QgsMapLayer *layer );
217  void removeLayerEntity( QgsMapLayer *layer );
218  void addCameraViewCenterEntity( Qt3DRender::QCamera *camera );
219  void addCameraRotationCenterEntity( QgsCameraController *controller );
220  void setSceneState( SceneState state );
221  void updateSceneState();
222  void updateScene();
223  void finalizeNewEntity( Qt3DCore::QEntity *newEntity );
224  int maximumTextureSize() const;
225 
226  private:
227  Qgs3DMapSettings &mMap;
228  QgsAbstract3DEngine *mEngine = nullptr;
230  Qt3DLogic::QFrameAction *mFrameAction = nullptr;
231  QgsCameraController *mCameraController = nullptr;
232  QgsTerrainEntity *mTerrain = nullptr;
233  QList<QgsChunkedEntity *> mChunkEntities;
235  Qt3DCore::QEntity *mEntityCameraViewCenter = nullptr;
237  QMap<QgsMapLayer *, Qt3DCore::QEntity *> mLayerEntities;
238  QMap<const QgsAbstract3DRenderer *, Qt3DCore::QEntity *> mRenderersEntities;
239  bool mTerrainUpdateScheduled = false;
240  SceneState mSceneState = Ready;
242  QList<Qgs3DMapScenePickHandler *> mPickHandlers;
244  QList<Qt3DCore::QEntity *> mLightEntities;
245  QList<QgsMapLayer *> mModelVectorLayers;
246  QgsSkyboxEntity *mSkybox = nullptr;
248  Qt3DCore::QEntity *mEntityRotationCenter = nullptr;
249 
251  Qgs3DAxis *m3DAxis = nullptr;
252 
253 };
254 
255 #endif // QGS3DMAPSCENE_H
Manages the various settings the user can choose from when exporting a 3D scene 3.
void terrainPendingJobsCountChanged()
Emitted when the number of terrain's pending jobs changes.
void viewed2DExtentFrom3DChanged(QVector< QgsPointXY > extent)
Emitted when the viewed 2D extent seen by the 3D camera has changed.
void fpsCountChanged(float fpsCount)
Emitted when the FPS count changes.
Qgs3DAxis * get3DAxis()
Returns the 3D axis object.
SceneState
Enumeration of possible states of the 3D scene.
@ Ready
The scene is fully loaded/updated.
@ Updating
The scene is still being loaded/updated.
void totalPendingJobsCountChanged()
Emitted when the total number of pending jobs changes.
QgsAbstract3DEngine * engine()
Returns the abstract 3D engine.
void fpsCounterEnabledChanged(bool fpsCounterEnabled)
Emitted when the FPS counter is activated or deactivated.
QgsCameraController * cameraController()
Returns camera controller.
Definition: qgs3dmapscene.h:78
void sceneStateChanged()
Emitted when the scene's state has changed.
SceneState sceneState() const
Returns the current state of the scene.
void terrainEntityChanged()
Emitted when the current terrain entity is replaced by a new one.
QgsTerrainEntity * terrainEntity()
Returns terrain entity (may be temporarily nullptr)
Definition: qgs3dmapscene.h:80
Base class for all renderers that may to participate in 3D view.
Base class for all map layer types.
Definition: qgsmaplayer.h:73
A rectangle specified with double values.
Definition: qgsrectangle.h:42
Base class for all skybox types.
Contains the configuration of a skybox entity.
#define SIP_SKIP
Definition: qgis_sip.h:126
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
Definition: qgsfeatureid.h:28