@@ -69,16 +69,13 @@ Scene::Scene( const Map3D &map, Qt3DExtras::QForwardRenderer *defaultFrameGraph,
69
69
70
70
Q_FOREACH ( QgsMapLayer *layer, map.layers () )
71
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 );
72
+ addLayerEntity ( layer );
79
73
// TODO: connect( layer, &QgsMapLayer::willBeDeleted, this, &Scene::onLayerWillBeDeleted );
80
74
}
81
75
76
+ // listen to changes of layers in order to add/remove 3D renderer entities
77
+ connect ( &map, &Map3D::layersChanged, this , &Scene::onLayersChanged );
78
+
82
79
Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity;
83
80
Qt3DCore::QTransform *lightTransform = new Qt3DCore::QTransform;
84
81
lightTransform->setTranslation ( QVector3D ( 0 , 1000 , 0 ) );
@@ -211,16 +208,58 @@ void Scene::onLayerRenderer3DChanged()
211
208
Q_ASSERT ( layer );
212
209
213
210
// remove old entity - if any
214
- Qt3DCore::QEntity *entity = mLayerEntities .take ( layer );
215
- if ( entity )
216
- entity->deleteLater ();
211
+ removeLayerEntity ( layer );
217
212
218
213
// 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
+ {
219
247
QgsAbstract3DRenderer *renderer = layer->renderer3D ();
220
248
if ( renderer )
221
249
{
222
250
Qt3DCore::QEntity *newEntity = renderer->createEntity ( mMap );
223
251
newEntity->setParent ( this );
224
252
mLayerEntities .insert ( layer, newEntity );
225
253
}
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 );
226
265
}
0 commit comments