Skip to content

Commit 2e03f5d

Browse files
committed
Update list of 3D entities when the list of active layers is changed
1 parent 82f608e commit 2e03f5d

File tree

2 files changed

+54
-10
lines changed

2 files changed

+54
-10
lines changed

src/3d/scene.cpp

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,13 @@ Scene::Scene( const Map3D &map, Qt3DExtras::QForwardRenderer *defaultFrameGraph,
6969

7070
Q_FOREACH ( QgsMapLayer *layer, map.layers() )
7171
{
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 );
72+
addLayerEntity( layer );
7973
// TODO: connect( layer, &QgsMapLayer::willBeDeleted, this, &Scene::onLayerWillBeDeleted );
8074
}
8175

76+
// listen to changes of layers in order to add/remove 3D renderer entities
77+
connect( &map, &Map3D::layersChanged, this, &Scene::onLayersChanged );
78+
8279
Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity;
8380
Qt3DCore::QTransform *lightTransform = new Qt3DCore::QTransform;
8481
lightTransform->setTranslation( QVector3D( 0, 1000, 0 ) );
@@ -211,16 +208,58 @@ void Scene::onLayerRenderer3DChanged()
211208
Q_ASSERT( layer );
212209

213210
// remove old entity - if any
214-
Qt3DCore::QEntity *entity = mLayerEntities.take( layer );
215-
if ( entity )
216-
entity->deleteLater();
211+
removeLayerEntity( layer );
217212

218213
// add new entity - if any 3D renderer
214+
addLayerEntity( layer );
215+
}
216+
217+
void Scene::onLayersChanged()
218+
{
219+
QSet<QgsMapLayer *> layersBefore = QSet<QgsMapLayer *>::fromList( mLayerEntities.keys() );
220+
QList<QgsMapLayer *> layersAdded;
221+
Q_FOREACH ( QgsMapLayer *layer, mMap.layers() )
222+
{
223+
if ( !layersBefore.contains( layer ) )
224+
{
225+
layersAdded << layer;
226+
}
227+
else
228+
{
229+
layersBefore.remove( layer );
230+
}
231+
}
232+
233+
// what is left in layersBefore are layers that have been removed
234+
Q_FOREACH ( QgsMapLayer *layer, layersBefore )
235+
{
236+
removeLayerEntity( layer );
237+
}
238+
239+
Q_FOREACH ( QgsMapLayer *layer, layersAdded )
240+
{
241+
addLayerEntity( layer );
242+
}
243+
}
244+
245+
void Scene::addLayerEntity( QgsMapLayer *layer )
246+
{
219247
QgsAbstract3DRenderer *renderer = layer->renderer3D();
220248
if ( renderer )
221249
{
222250
Qt3DCore::QEntity *newEntity = renderer->createEntity( mMap );
223251
newEntity->setParent( this );
224252
mLayerEntities.insert( layer, newEntity );
225253
}
254+
255+
connect( layer, &QgsMapLayer::renderer3DChanged, this, &Scene::onLayerRenderer3DChanged );
256+
}
257+
258+
void Scene::removeLayerEntity( QgsMapLayer *layer )
259+
{
260+
Qt3DCore::QEntity *entity = mLayerEntities.take( layer );
261+
if ( entity )
262+
entity->deleteLater();
263+
264+
disconnect( layer, &QgsMapLayer::renderer3DChanged, this, &Scene::onLayerRenderer3DChanged );
226265
}

src/3d/scene.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ class _3D_EXPORT Scene : public Qt3DCore::QEntity
4444
void onFrameTriggered( float dt );
4545
void createTerrain();
4646
void onLayerRenderer3DChanged();
47+
void onLayersChanged();
48+
49+
private:
50+
void addLayerEntity( QgsMapLayer *layer );
51+
void removeLayerEntity( QgsMapLayer *layer );
4752

4853
private:
4954
const Map3D &mMap;

0 commit comments

Comments
 (0)