Skip to content

Commit

Permalink
Update list of 3D entities when the list of active layers is changed
Browse files Browse the repository at this point in the history
  • Loading branch information
wonder-sk committed Sep 15, 2017
1 parent 82f608e commit 2e03f5d
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 10 deletions.
59 changes: 49 additions & 10 deletions src/3d/scene.cpp
Expand Up @@ -69,16 +69,13 @@ Scene::Scene( const Map3D &map, Qt3DExtras::QForwardRenderer *defaultFrameGraph,


Q_FOREACH ( QgsMapLayer *layer, map.layers() ) Q_FOREACH ( QgsMapLayer *layer, map.layers() )
{ {
if ( layer->renderer3D() ) addLayerEntity( layer );
{
Qt3DCore::QEntity *p = layer->renderer3D()->createEntity( map );
p->setParent( this );
mLayerEntities.insert( layer, p );
}
connect( layer, &QgsMapLayer::renderer3DChanged, this, &Scene::onLayerRenderer3DChanged );
// TODO: connect( layer, &QgsMapLayer::willBeDeleted, this, &Scene::onLayerWillBeDeleted ); // TODO: connect( layer, &QgsMapLayer::willBeDeleted, this, &Scene::onLayerWillBeDeleted );
} }


// listen to changes of layers in order to add/remove 3D renderer entities
connect( &map, &Map3D::layersChanged, this, &Scene::onLayersChanged );

Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity; Qt3DCore::QEntity *lightEntity = new Qt3DCore::QEntity;
Qt3DCore::QTransform *lightTransform = new Qt3DCore::QTransform; Qt3DCore::QTransform *lightTransform = new Qt3DCore::QTransform;
lightTransform->setTranslation( QVector3D( 0, 1000, 0 ) ); lightTransform->setTranslation( QVector3D( 0, 1000, 0 ) );
Expand Down Expand Up @@ -211,16 +208,58 @@ void Scene::onLayerRenderer3DChanged()
Q_ASSERT( layer ); Q_ASSERT( layer );


// remove old entity - if any // remove old entity - if any
Qt3DCore::QEntity *entity = mLayerEntities.take( layer ); removeLayerEntity( layer );
if ( entity )
entity->deleteLater();


// add new entity - if any 3D renderer // add new entity - if any 3D renderer
addLayerEntity( layer );
}

void Scene::onLayersChanged()
{
QSet<QgsMapLayer *> layersBefore = QSet<QgsMapLayer *>::fromList( mLayerEntities.keys() );
QList<QgsMapLayer *> layersAdded;
Q_FOREACH ( QgsMapLayer *layer, mMap.layers() )
{
if ( !layersBefore.contains( layer ) )
{
layersAdded << layer;
}
else
{
layersBefore.remove( layer );
}
}

// what is left in layersBefore are layers that have been removed
Q_FOREACH ( QgsMapLayer *layer, layersBefore )
{
removeLayerEntity( layer );
}

Q_FOREACH ( QgsMapLayer *layer, layersAdded )
{
addLayerEntity( layer );
}
}

void Scene::addLayerEntity( QgsMapLayer *layer )
{
QgsAbstract3DRenderer *renderer = layer->renderer3D(); QgsAbstract3DRenderer *renderer = layer->renderer3D();
if ( renderer ) if ( renderer )
{ {
Qt3DCore::QEntity *newEntity = renderer->createEntity( mMap ); Qt3DCore::QEntity *newEntity = renderer->createEntity( mMap );
newEntity->setParent( this ); newEntity->setParent( this );
mLayerEntities.insert( layer, newEntity ); mLayerEntities.insert( layer, newEntity );
} }

connect( layer, &QgsMapLayer::renderer3DChanged, this, &Scene::onLayerRenderer3DChanged );
}

void Scene::removeLayerEntity( QgsMapLayer *layer )
{
Qt3DCore::QEntity *entity = mLayerEntities.take( layer );
if ( entity )
entity->deleteLater();

disconnect( layer, &QgsMapLayer::renderer3DChanged, this, &Scene::onLayerRenderer3DChanged );
} }
5 changes: 5 additions & 0 deletions src/3d/scene.h
Expand Up @@ -44,6 +44,11 @@ class _3D_EXPORT Scene : public Qt3DCore::QEntity
void onFrameTriggered( float dt ); void onFrameTriggered( float dt );
void createTerrain(); void createTerrain();
void onLayerRenderer3DChanged(); void onLayerRenderer3DChanged();
void onLayersChanged();

private:
void addLayerEntity( QgsMapLayer *layer );
void removeLayerEntity( QgsMapLayer *layer );


private: private:
const Map3D &mMap; const Map3D &mMap;
Expand Down

0 comments on commit 2e03f5d

Please sign in to comment.