Skip to content

Commit ba7573a

Browse files
committed
GUI for configuration of 3D polygon symbols for vector layers
In the style dock there is a new "3D View" tab - so far working just for polygon layers. It is possible to select a polygon layer, enable 3D renderer and adjust its properties. If a 3D Map View is open, it will be immediately updated (if auto-apply is enabled) Very exciting! :-)
1 parent b9dd6bc commit ba7573a

37 files changed

+850
-60
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,7 @@ IF(WITH_CORE)
284284
FIND_PACKAGE(Qt53DInput REQUIRED)
285285
FIND_PACKAGE(Qt53DLogic REQUIRED)
286286
FIND_PACKAGE(Qt53DExtras REQUIRED)
287+
SET(HAVE_3D TRUE) # used in qgsconfig.h
287288
ENDIF (WITH_3D)
288289
INCLUDE("cmake/modules/ECMQt4To5Porting.cmake")
289290
MESSAGE(STATUS "Found Qt version: ${Qt5Core_VERSION_STRING}")

cmake_templates/qgsconfig.h.in

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
//used in vim src/core/qgis.cpp
1414
//The way below should work but it resolves to a number like 0110 which the compiler treats as octal I think
1515
//because debuggin it out shows the decimal number 72 which results in incorrect version status.
16-
//As a short term fix I (Tim) am defining the version in top level cmake. It would be good to
16+
//As a short term fix I (Tim) am defining the version in top level cmake. It would be good to
1717
//reinstate this more generic approach below at some point though
1818
//#define VERSION_INT ${CPACK_PACKAGE_VERSION_MAJOR}${CPACK_PACKAGE_VERSION_MINOR}${CPACK_PACKAGE_VERSION_PATCH}
1919
#define VERSION_INT ${QGIS_VERSION_INT}
@@ -58,5 +58,7 @@
5858

5959
#cmakedefine ENABLE_MODELTEST
6060

61+
#cmakedefine HAVE_3D
62+
6163
#endif
6264

images/images.qrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,7 @@
570570
<file>themes/default/mGeoPackage.svg</file>
571571
<file>themes/default/mActionAddGeoPackageLayer.svg</file>
572572
<file>icons/qgis_icon.svg</file>
573+
<file>themes/default/3d.svg</file>
573574
</qresource>
574575
<qresource prefix="/images/tips">
575576
<file alias="symbol_levels.png">qgis_tips/symbol_levels.png</file>

images/themes/default/3d.svg

Lines changed: 38 additions & 0 deletions
Loading

python/core/qgsapplication.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,7 @@ Returns path to the build output directory. Valid only when running from build d
704704
:rtype: QgsFieldFormatterRegistry
705705
%End
706706

707+
707708
static QString nullRepresentation();
708709
%Docstring
709710
This string is used to represent the value `NULL` throughout QGIS.

python/core/qgsmaplayer.sip

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,8 @@ Return pointer to layer's undo stack
754754
:rtype: QgsMapLayerStyleManager
755755
%End
756756

757+
758+
757759
bool isInScaleRange( double scale ) const;
758760
%Docstring
759761
Tests whether the layer should be visible at the specified ``scale``.
@@ -1014,6 +1016,12 @@ Signal emitted when the blend mode is changed, through QgsMapLayer.setBlendMode(
10141016
%Docstring
10151017
Signal emitted when legend of the layer has changed
10161018
.. versionadded:: 2.6
1019+
%End
1020+
1021+
void renderer3DChanged();
1022+
%Docstring
1023+
Signal emitted when 3D renderer associated with the layer has changed.
1024+
.. versionadded:: 3.0
10171025
%End
10181026

10191027
void configChanged();

src/3d/CMakeLists.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
# sources
33

44
SET(QGIS_3D_SRCS
5-
abstract3drenderer.cpp
65
abstract3dsymbol.cpp
76
cameracontroller.cpp
87
lineentity.cpp
@@ -15,6 +14,7 @@ SET(QGIS_3D_SRCS
1514
tessellator.cpp
1615
tilingscheme.cpp
1716
utils.cpp
17+
vectorlayer3drenderer.cpp
1818

1919
chunks/chunkboundsentity.cpp
2020
chunks/chunkedentity.cpp
@@ -63,7 +63,6 @@ QT5_ADD_RESOURCES(QGIS_3D_RCC_SRCS shaders.qrc)
6363

6464
SET(QGIS_3D_HDRS
6565
aabb.h
66-
abstract3drenderer.h
6766
abstract3dsymbol.h
6867
cameracontroller.h
6968
lineentity.h
@@ -76,6 +75,7 @@ SET(QGIS_3D_HDRS
7675
tessellator.h
7776
tilingscheme.h
7877
utils.h
78+
vectorlayer3drenderer.h
7979

8080
chunks/chunkboundsentity.h
8181
chunks/chunkedentity.h
@@ -105,6 +105,7 @@ INCLUDE_DIRECTORIES(
105105
${CMAKE_SOURCE_DIR}/src/core/symbology-ng
106106
${CMAKE_SOURCE_DIR}/src/core/metadata
107107
${CMAKE_SOURCE_DIR}/src/core/expression
108+
${CMAKE_SOURCE_DIR}/src/core/3d
108109
${CMAKE_BINARY_DIR}/src/core
109110
${CMAKE_BINARY_DIR}/src/3d
110111
)

src/3d/map3d.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
#include "map3d.h"
22

3-
#include "abstract3drenderer.h"
43
#include "flatterraingenerator.h"
54
#include "demterraingenerator.h"
65
//#include "quantizedmeshterraingenerator.h"
6+
#include "vectorlayer3drenderer.h"
77

88
#include <QDomDocument>
99
#include <QDomElement>
@@ -44,7 +44,7 @@ Map3D::Map3D( const Map3D &other )
4444
, mShowTerrainTileInfo( other.mShowTerrainTileInfo )
4545
, mLayers( other.mLayers )
4646
{
47-
Q_FOREACH ( Abstract3DRenderer *renderer, other.renderers )
47+
Q_FOREACH ( QgsAbstract3DRenderer *renderer, other.renderers )
4848
{
4949
renderers << renderer->clone();
5050
}
@@ -108,7 +108,7 @@ void Map3D::readXml( const QDomElement &elem, const QgsReadWriteContext &context
108108
QDomElement elemRenderer = elemRenderers.firstChildElement( "renderer" );
109109
while ( !elemRenderer.isNull() )
110110
{
111-
Abstract3DRenderer *renderer = nullptr;
111+
QgsAbstract3DRenderer *renderer = nullptr;
112112
QString type = elemRenderer.attribute( "type" );
113113
if ( type == "vector" )
114114
{
@@ -167,7 +167,7 @@ QDomElement Map3D::writeXml( QDomDocument &doc, const QgsReadWriteContext &conte
167167
elem.appendChild( elemTerrain );
168168

169169
QDomElement elemRenderers = doc.createElement( "renderers" );
170-
Q_FOREACH ( const Abstract3DRenderer *renderer, renderers )
170+
Q_FOREACH ( const QgsAbstract3DRenderer *renderer, renderers )
171171
{
172172
QDomElement elemRenderer = doc.createElement( "renderer" );
173173
elemRenderer.setAttribute( "type", renderer->type() );
@@ -203,7 +203,7 @@ void Map3D::resolveReferences( const QgsProject &project )
203203

204204
for ( int i = 0; i < renderers.count(); ++i )
205205
{
206-
Abstract3DRenderer *renderer = renderers[i];
206+
QgsAbstract3DRenderer *renderer = renderers[i];
207207
renderer->resolveReferences( project );
208208
}
209209
}

src/3d/map3d.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
class QgsMapLayer;
1414
class QgsRasterLayer;
1515

16-
class Abstract3DRenderer;
16+
class QgsAbstract3DRenderer;
1717
class TerrainGenerator;
1818

1919

@@ -61,7 +61,7 @@ class _3D_EXPORT Map3D : public QObject
6161
// 3D renderers
6262
//
6363

64-
QList<Abstract3DRenderer *> renderers; //!< Stuff to render as 3D object
64+
QList<QgsAbstract3DRenderer *> renderers; //!< Stuff to render as 3D object
6565

6666
bool skybox; //!< Whether to render skybox
6767
QString skyboxFileBase;

src/3d/phongmaterialsettings.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ class _3D_EXPORT PhongMaterialSettings
1212
{
1313
public:
1414
PhongMaterialSettings()
15-
: mAmbient( QColor::fromRgbF( 0.05f, 0.05f, 0.05f, 1.0f ) )
15+
: mAmbient( QColor::fromRgbF( 0.1f, 0.1f, 0.1f, 1.0f ) )
1616
, mDiffuse( QColor::fromRgbF( 0.7f, 0.7f, 0.7f, 1.0f ) )
17-
, mSpecular( QColor::fromRgbF( 0.01f, 0.01f, 0.01f, 1.0f ) )
18-
, mShininess( 150.0f )
17+
, mSpecular( QColor::fromRgbF( 1.0f, 1.0f, 1.0f, 1.0f ) )
18+
, mShininess( 0.0f )
1919
{
2020
}
2121

src/3d/scene.cpp

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include <Qt3DLogic/QFrameAction>
99

1010
#include "aabb.h"
11-
#include "abstract3drenderer.h"
11+
#include "qgsabstract3drenderer.h"
1212
#include "cameracontroller.h"
1313
#include "map3d.h"
1414
#include "terrain.h"
@@ -59,12 +59,26 @@ Scene::Scene( const Map3D &map, Qt3DExtras::QForwardRenderer *defaultFrameGraph,
5959

6060
// create entities of renderers
6161

62-
Q_FOREACH ( const Abstract3DRenderer *renderer, map.renderers )
62+
Q_FOREACH ( const QgsAbstract3DRenderer *renderer, map.renderers )
6363
{
6464
Qt3DCore::QEntity *p = renderer->createEntity( map );
6565
p->setParent( this );
6666
}
6767

68+
// create entities of renderers of layers
69+
70+
Q_FOREACH ( QgsMapLayer *layer, map.layers() )
71+
{
72+
if ( layer->renderer3D() )
73+
{
74+
Qt3DCore::QEntity *p = layer->renderer3D()->createEntity( map );
75+
p->setParent( this );
76+
mLayerEntities.insert( layer, p );
77+
}
78+
connect( layer, &QgsMapLayer::renderer3DChanged, this, &Scene::onLayerRenderer3DChanged );
79+
// TODO: connect( layer, &QgsMapLayer::willBeDeleted, this, &Scene::onLayerWillBeDeleted );
80+
}
81+
6882
Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity;
6983
Qt3DCore::QTransform *lightTransform = new Qt3DCore::QTransform;
7084
lightTransform->setTranslation( QVector3D( 0, 1000, 0 ) );
@@ -83,10 +97,10 @@ Scene::Scene( const Map3D &map, Qt3DExtras::QForwardRenderer *defaultFrameGraph,
8397
ChunkedEntity *testChunkEntity = new ChunkedEntity( AABB( -500, 0, -500, 500, 100, 500 ), 2.f, 3.f, 7, new TestChunkLoaderFactory );
8498
testChunkEntity->setEnabled( false );
8599
testChunkEntity->setParent( this );
86-
chunkEntities << testChunkEntity
100+
chunkEntities << testChunkEntity;
87101
#endif
88102

89-
connect( mCameraController, &CameraController::cameraChanged, this, &Scene::onCameraChanged );
103+
connect( mCameraController, &CameraController::cameraChanged, this, &Scene::onCameraChanged );
90104
connect( mCameraController, &CameraController::viewportChanged, this, &Scene::onCameraChanged );
91105

92106
#if 0
@@ -190,3 +204,23 @@ void Scene::createTerrain()
190204

191205
onCameraChanged(); // force update of the new terrain
192206
}
207+
208+
void Scene::onLayerRenderer3DChanged()
209+
{
210+
QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() );
211+
Q_ASSERT( layer );
212+
213+
// remove old entity - if any
214+
Qt3DCore::QEntity *entity = mLayerEntities.take( layer );
215+
if ( entity )
216+
entity->deleteLater();
217+
218+
// add new entity - if any 3D renderer
219+
QgsAbstract3DRenderer *renderer = layer->renderer3D();
220+
if ( renderer )
221+
{
222+
Qt3DCore::QEntity *newEntity = renderer->createEntity( mMap );
223+
newEntity->setParent( this );
224+
mLayerEntities.insert( layer, newEntity );
225+
}
226+
}

src/3d/scene.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ namespace Qt3DExtras
2121
class QForwardRenderer;
2222
}
2323

24+
class QgsMapLayer;
2425
class CameraController;
2526
class Map3D;
2627
class Terrain;
@@ -42,6 +43,7 @@ class _3D_EXPORT Scene : public Qt3DCore::QEntity
4243
void onCameraChanged();
4344
void onFrameTriggered( float dt );
4445
void createTerrain();
46+
void onLayerRenderer3DChanged();
4547

4648
private:
4749
const Map3D &mMap;
@@ -50,6 +52,8 @@ class _3D_EXPORT Scene : public Qt3DCore::QEntity
5052
CameraController *mCameraController;
5153
Terrain *mTerrain;
5254
QList<ChunkedEntity *> chunkEntities;
55+
//! Keeps track of entities that belong to a particular layer
56+
QMap<QgsMapLayer *, Qt3DCore::QEntity *> mLayerEntities;
5357
};
5458

5559
#endif // SCENE_H

src/3d/testapp/main.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
#include <Qt3DRender>
66
#include <Qt3DExtras>
77

8-
#include "abstract3drenderer.h"
98
#include "abstract3dsymbol.h"
109
#include "maptexturegenerator.h"
1110
#include "sidepanel.h"
11+
#include "vectorlayer3drenderer.h"
1212
#include "window3d.h"
1313
#include "map3d.h"
1414
#include "flatterraingenerator.h"
@@ -239,6 +239,7 @@ int main( int argc, char *argv[] )
239239
hLayout->addWidget( container, 1 );
240240
hLayout->addWidget( sidePanel );
241241

242+
widget.setWindowTitle( "QGIS 3D" );
242243
widget.resize( 800, 600 );
243244
widget.show();
244245

src/3d/abstract3drenderer.cpp renamed to src/3d/vectorlayer3drenderer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include "abstract3drenderer.h"
1+
#include "vectorlayer3drenderer.h"
22

33
#include "abstract3dsymbol.h"
44
#include "lineentity.h"
@@ -18,7 +18,7 @@ VectorLayer3DRenderer::~VectorLayer3DRenderer()
1818
{
1919
}
2020

21-
Abstract3DRenderer *VectorLayer3DRenderer::clone() const
21+
VectorLayer3DRenderer *VectorLayer3DRenderer::clone() const
2222
{
2323
VectorLayer3DRenderer *r = new VectorLayer3DRenderer( mSymbol ? mSymbol->clone() : nullptr );
2424
r->layerRef = layerRef;

0 commit comments

Comments
 (0)