Skip to content

Commit c9dba99

Browse files
committedJan 4, 2018
[3d] Fix a crash when restoring a project with bad layer ref (fixes #17687)
1 parent d6e43ef commit c9dba99

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed
 

‎src/3d/qgs3dmapscene.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "qgsterrainentity_p.h"
3838
#include "qgsterraingenerator.h"
3939
#include "qgsvectorlayer.h"
40+
#include "qgsvectorlayer3drenderer.h"
4041

4142

4243
Qgs3DMapScene::Qgs3DMapScene( const Qgs3DMapSettings &map, Qt3DExtras::QForwardRenderer *defaultFrameGraph, Qt3DRender::QRenderSettings *renderSettings, Qt3DRender::QCamera *camera, const QRect &viewportRect, Qt3DCore::QNode *parent )
@@ -376,9 +377,22 @@ void Qgs3DMapScene::addLayerEntity( QgsMapLayer *layer )
376377
QgsAbstract3DRenderer *renderer = layer->renderer3D();
377378
if ( renderer )
378379
{
380+
// Fix vector layer's renderer to make sure the renderer is pointing to its layer.
381+
// It has happened before that renderer pointed to a different layer (probably after copying a style).
382+
// This is a bit of a hack and it should be handled in QgsMapLayer::setRenderer3D() but in qgis_core
383+
// the vector layer 3D renderer class is not available. Maybe we need an intermediate map layer 3D renderer
384+
// class in qgis_core that can be used to handle this case nicely.
385+
if ( layer->type() == QgsMapLayer::VectorLayer && renderer->type() == "vector" )
386+
{
387+
static_cast<QgsVectorLayer3DRenderer *>( renderer )->setLayer( static_cast<QgsVectorLayer *>( layer ) );
388+
}
389+
379390
Qt3DCore::QEntity *newEntity = renderer->createEntity( mMap );
380-
newEntity->setParent( this );
381-
mLayerEntities.insert( layer, newEntity );
391+
if ( newEntity )
392+
{
393+
newEntity->setParent( this );
394+
mLayerEntities.insert( layer, newEntity );
395+
}
382396
}
383397

384398
connect( layer, &QgsMapLayer::renderer3DChanged, this, &Qgs3DMapScene::onLayerRenderer3DChanged );

0 commit comments

Comments
 (0)
Please sign in to comment.