Skip to content

Commit 3b86c51

Browse files
vcloarecnyalldawson
authored andcommittedJun 2, 2020
avoid 3D crash if terrain layer is null
1 parent 7b8bd80 commit 3b86c51

File tree

7 files changed

+23
-1
lines changed

7 files changed

+23
-1
lines changed
 

‎src/3d/chunks/qgschunkedentity_p.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ QgsChunkedEntity::~QgsChunkedEntity()
123123

124124
void QgsChunkedEntity::update( const SceneState &state )
125125
{
126+
if ( !mIsValid )
127+
return;
128+
126129
QElapsedTimer t;
127130
t.start();
128131

@@ -399,7 +402,8 @@ void QgsChunkedEntity::startJobs()
399402
delete entry;
400403

401404
QgsChunkQueueJob *job = startJob( node );
402-
mActiveJobs.append( job );
405+
if ( job )
406+
mActiveJobs.append( job );
403407
}
404408
}
405409

@@ -411,6 +415,8 @@ QgsChunkQueueJob *QgsChunkedEntity::startJob( QgsChunkNode *node )
411415
QgsEventTracing::addEvent( QgsEventTracing::AsyncBegin, QStringLiteral( "3D" ), QStringLiteral( "Load " ) + node->tileId().text(), node->tileId().text() );
412416

413417
QgsChunkLoader *loader = mChunkLoaderFactory->createChunkLoader( node );
418+
if ( !loader )
419+
return nullptr;
414420
connect( loader, &QgsChunkQueueJob::finished, this, &QgsChunkedEntity::onActiveJobFinished );
415421
node->setLoading( loader );
416422
return loader;

‎src/3d/chunks/qgschunkedentity_p.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,8 @@ class QgsChunkedEntity : public Qt3DCore::QEntity
172172

173173
//! If picking is enabled, QObjectPicker objects will be assigned to chunks and pickedObject() signals fired on mouse click
174174
bool mPickingEnabled = false;
175+
176+
bool mIsValid = true;
175177
};
176178

177179
/// @endcond

‎src/3d/mesh/qgsmeshterraingenerator.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ void QgsMeshTerrainGenerator::resolveReferences( const QgsProject &project )
9999
void QgsMeshTerrainGenerator::setLayer( QgsMeshLayer *layer )
100100
{
101101
mLayer = QgsMapLayerRef( layer );
102+
mIsValid = layer != nullptr;
102103
}
103104

104105
QgsMeshLayer *QgsMeshTerrainGenerator::meshLayer() const

‎src/3d/terrain/qgsdemterraingenerator.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,13 @@ void QgsDemTerrainGenerator::updateGenerator()
113113
mTerrainTilingScheme = QgsTilingScheme( te, mCrs );
114114
delete mHeightMapGenerator;
115115
mHeightMapGenerator = new QgsDemHeightMapGenerator( dem, mTerrainTilingScheme, mResolution, mTransformContext );
116+
mIsValid = true;
116117
}
117118
else
118119
{
119120
mTerrainTilingScheme = QgsTilingScheme();
120121
delete mHeightMapGenerator;
121122
mHeightMapGenerator = nullptr;
123+
mIsValid = false;
122124
}
123125
}

‎src/3d/terrain/qgsterrainentity_p.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ QgsTerrainEntity::QgsTerrainEntity( int maxLevel, const Qgs3DMapSettings &map, Q
6464
, mMap( map )
6565
{
6666
map.terrainGenerator()->setTerrain( this );
67+
mIsValid = map.terrainGenerator()->isValid();
6768

6869
connect( &map, &Qgs3DMapSettings::showTerrainBoundingBoxesChanged, this, &QgsTerrainEntity::onShowBoundingBoxesChanged );
6970
connect( &map, &Qgs3DMapSettings::showTerrainTilesInfoChanged, this, &QgsTerrainEntity::invalidateMapImages );

‎src/3d/terrain/qgsterraingenerator.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,8 @@ QString QgsTerrainGenerator::typeToString( QgsTerrainGenerator::Type type )
7171
}
7272
return QString();
7373
}
74+
75+
bool QgsTerrainGenerator::isValid() const
76+
{
77+
return mIsValid;
78+
}

‎src/3d/terrain/qgsterraingenerator.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,14 @@ class _3D_EXPORT QgsTerrainGenerator : public QgsChunkLoaderFactory
9999
//! Returns CRS of the terrain
100100
QgsCoordinateReferenceSystem crs() const { return mTerrainTilingScheme.crs(); }
101101

102+
//! Returns whether the terrain generator is valid
103+
bool isValid() const;
104+
102105
protected:
103106
QgsTilingScheme mTerrainTilingScheme; //!< Tiling scheme of the terrain
104107
QgsTerrainEntity *mTerrain = nullptr;
108+
109+
bool mIsValid = true;
105110
};
106111

107112

0 commit comments

Comments
 (0)
Please sign in to comment.