Skip to content

Commit

Permalink
[3d] fix crash when switching terrain generator (fixes #21538)
Browse files Browse the repository at this point in the history
The problem was introduced in PR #8828 when fixing issue #20963

This fix immediately deletes terrain entity on generator change
and informs other code about that + identify map tool is now aware
of the fact that terrain entity may be temporarily null.

(cherry picked from commit 4a6151a)
  • Loading branch information
wonder-sk committed Mar 10, 2019
1 parent d620ca1 commit bb7ac8f
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 7 deletions.
2 changes: 2 additions & 0 deletions src/3d/qgs3dmapscene.cpp
Expand Up @@ -365,6 +365,8 @@ void Qgs3DMapScene::createTerrain()


mTerrain->deleteLater(); mTerrain->deleteLater();
mTerrain = nullptr; mTerrain = nullptr;

emit terrainEntityChanged();
} }


if ( !mTerrainUpdateScheduled ) if ( !mTerrainUpdateScheduled )
Expand Down
2 changes: 1 addition & 1 deletion src/3d/qgs3dmapscene.h
Expand Up @@ -59,7 +59,7 @@ class _3D_EXPORT Qgs3DMapScene : public Qt3DCore::QEntity


//! Returns camera controller //! Returns camera controller
QgsCameraController *cameraController() { return mCameraController; } QgsCameraController *cameraController() { return mCameraController; }
//! Returns terrain entity //! Returns terrain entity (may be temporarily null)
QgsTerrainEntity *terrainEntity() { return mTerrain; } QgsTerrainEntity *terrainEntity() { return mTerrain; }


//! Resets camera view to show the whole scene (top view) //! Resets camera view to show the whole scene (top view)
Expand Down
18 changes: 12 additions & 6 deletions src/app/3d/qgs3dmaptoolidentify.cpp
Expand Up @@ -77,16 +77,20 @@ void Qgs3DMapToolIdentify::mousePressEvent( QMouseEvent *event )


void Qgs3DMapToolIdentify::activate() void Qgs3DMapToolIdentify::activate()
{ {
Qt3DRender::QObjectPicker *picker = mCanvas->scene()->terrainEntity()->terrainPicker(); if ( QgsTerrainEntity *terrainEntity = mCanvas->scene()->terrainEntity() )
connect( picker, &Qt3DRender::QObjectPicker::clicked, this, &Qgs3DMapToolIdentify::onTerrainPicked ); {
connect( terrainEntity->terrainPicker(), &Qt3DRender::QObjectPicker::clicked, this, &Qgs3DMapToolIdentify::onTerrainPicked );
}


mCanvas->scene()->registerPickHandler( mPickHandler.get() ); mCanvas->scene()->registerPickHandler( mPickHandler.get() );
} }


void Qgs3DMapToolIdentify::deactivate() void Qgs3DMapToolIdentify::deactivate()
{ {
Qt3DRender::QObjectPicker *picker = mCanvas->scene()->terrainEntity()->terrainPicker(); if ( QgsTerrainEntity *terrainEntity = mCanvas->scene()->terrainEntity() )
disconnect( picker, &Qt3DRender::QObjectPicker::clicked, this, &Qgs3DMapToolIdentify::onTerrainPicked ); {
disconnect( terrainEntity->terrainPicker(), &Qt3DRender::QObjectPicker::clicked, this, &Qgs3DMapToolIdentify::onTerrainPicked );
}


mCanvas->scene()->unregisterPickHandler( mPickHandler.get() ); mCanvas->scene()->unregisterPickHandler( mPickHandler.get() );
} }
Expand Down Expand Up @@ -137,6 +141,8 @@ void Qgs3DMapToolIdentify::onTerrainEntityChanged()
{ {
// no need to disconnect from the previous entity: it has been destroyed // no need to disconnect from the previous entity: it has been destroyed
// start listening to the new terrain entity // start listening to the new terrain entity
Qt3DRender::QObjectPicker *picker = mCanvas->scene()->terrainEntity()->terrainPicker(); if ( QgsTerrainEntity *terrainEntity = mCanvas->scene()->terrainEntity() )
connect( picker, &Qt3DRender::QObjectPicker::clicked, this, &Qgs3DMapToolIdentify::onTerrainPicked ); {
connect( terrainEntity->terrainPicker(), &Qt3DRender::QObjectPicker::clicked, this, &Qgs3DMapToolIdentify::onTerrainPicked );
}
} }

0 comments on commit bb7ac8f

Please sign in to comment.