-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
qgs3dmapscene.h
184 lines (158 loc) · 6.35 KB
/
qgs3dmapscene.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
/***************************************************************************
qgs3dmapscene.h
--------------------------------------
Date : July 2017
Copyright : (C) 2017 by Martin Dobias
Email : wonder dot sk at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGS3DMAPSCENE_H
#define QGS3DMAPSCENE_H
#include "qgis_3d.h"
#include <Qt3DCore/QEntity>
#include "qgsfeatureid.h"
#include "qgsshadowrenderingframegraph.h"
namespace Qt3DRender
{
class QRenderSettings;
class QCamera;
class QPickEvent;
class QObjectPicker;
}
namespace Qt3DLogic
{
class QFrameAction;
}
namespace Qt3DExtras
{
class QForwardRenderer;
class QSkyboxEntity;
}
class QgsAbstract3DEngine;
class QgsAbstract3DRenderer;
class QgsMapLayer;
class QgsCameraController;
class Qgs3DMapScenePickHandler;
class Qgs3DMapSettings;
class QgsTerrainEntity;
class QgsChunkedEntity;
class QgsSkyboxEntity;
class QgsSkyboxSettings;
class Qgs3DMapExportSettings;
class QgsShadowRenderingFrameGraph;
class QgsPostprocessingEntity;
#define SIP_NO_FILE
/**
* \ingroup 3d
* Entity that encapsulates our 3D scene - contains all other entities (such as terrain) as children.
* \note Not available in Python bindings
* \since QGIS 3.0
*/
class _3D_EXPORT Qgs3DMapScene : public Qt3DCore::QEntity
{
Q_OBJECT
public:
//! Constructs a 3D scene based on map settings and Qt 3D renderer configuration
Qgs3DMapScene( const Qgs3DMapSettings &map, QgsAbstract3DEngine *engine );
//! Returns camera controller
QgsCameraController *cameraController() { return mCameraController; }
//! Returns terrain entity (may be temporarily NULLPTR)
QgsTerrainEntity *terrainEntity() { return mTerrain; }
//! Resets camera view to show the whole scene (top view)
void viewZoomFull();
//! Returns number of pending jobs of the terrain entity
int terrainPendingJobsCount() const;
/**
* Returns number of pending jobs for all chunked entities
* \since QGIS 3.12
*/
int totalPendingJobsCount() const;
//! Enumeration of possible states of the 3D scene
enum SceneState
{
Ready, //!< The scene is fully loaded/updated
Updating, //!< The scene is still being loaded/updated
};
//! Returns the current state of the scene
SceneState sceneState() const { return mSceneState; }
//! Registers an object that will get results of pick events on 3D entities. Does not take ownership of the pick handler. Adds object picker components to 3D entities.
void registerPickHandler( Qgs3DMapScenePickHandler *pickHandler );
//! Unregisters previously registered pick handler. Pick handler is not deleted. Also removes object picker components from 3D entities.
void unregisterPickHandler( Qgs3DMapScenePickHandler *pickHandler );
/**
* Given screen error (in pixels) and distance from camera (in 3D world coordinates), this function
* estimates the error in world space. Takes into account camera's field of view and the screen (3D view) size.
*/
float worldSpaceError( float epsilon, float distance );
//! Exports the scene according to the scene export settings
void exportScene( const Qgs3DMapExportSettings &exportSettings );
signals:
//! Emitted when the current terrain entity is replaced by a new one
void terrainEntityChanged();
//! Emitted when the number of terrain's pending jobs changes
void terrainPendingJobsCountChanged();
/**
* Emitted when the total number of pending jobs changes
* \since QGIS 3.12
*/
void totalPendingJobsCountChanged();
//! Emitted when the scene's state has changed
void sceneStateChanged();
public slots:
//! Updates the temporale entities
void updateTemporal();
private slots:
void onCameraChanged();
void onFrameTriggered( float dt );
void createTerrain();
void onLayerRenderer3DChanged();
void onLayersChanged();
void createTerrainDeferred();
void onBackgroundColorChanged();
void onLayerEntityPickedObject( Qt3DRender::QPickEvent *pickEvent, QgsFeatureId fid );
void updateLights();
void updateCameraLens();
void onRenderersChanged();
void onSkyboxSettingsChanged();
void onShadowSettingsChanged();
private:
void addLayerEntity( QgsMapLayer *layer );
void removeLayerEntity( QgsMapLayer *layer );
void addCameraViewCenterEntity( Qt3DRender::QCamera *camera );
void setSceneState( SceneState state );
void updateSceneState();
void updateScene();
bool updateCameraNearFarPlanes();
void finalizeNewEntity( Qt3DCore::QEntity *newEntity );
int maximumTextureSize() const;
private:
const Qgs3DMapSettings &mMap;
QgsAbstract3DEngine *mEngine = nullptr;
//! Provides a way to have a synchronous function executed each frame
Qt3DLogic::QFrameAction *mFrameAction = nullptr;
QgsCameraController *mCameraController = nullptr;
QgsTerrainEntity *mTerrain = nullptr;
QList<QgsChunkedEntity *> mChunkEntities;
//! Entity that shows view center - useful for debugging camera issues
Qt3DCore::QEntity *mEntityCameraViewCenter = nullptr;
//! Keeps track of entities that belong to a particular layer
QMap<QgsMapLayer *, Qt3DCore::QEntity *> mLayerEntities;
QMap<const QgsAbstract3DRenderer *, Qt3DCore::QEntity *> mRenderersEntities;
bool mTerrainUpdateScheduled = false;
SceneState mSceneState = Ready;
//! List of currently registered pick handlers (used by identify tool)
QList<Qgs3DMapScenePickHandler *> mPickHandlers;
//! List of lights in the scene
QList<Qt3DCore::QEntity *> mLightEntities;
//! List of light origins in the scene
QList<Qt3DCore::QEntity *> mLightOriginEntities;
QList<QgsMapLayer *> mModelVectorLayers;
QgsSkyboxEntity *mSkybox = nullptr;
};
#endif // QGS3DMAPSCENE_H