Skip to content

Commit 2739454

Browse files
uclarosnyalldawson
authored andcommitted
Avoid crashing when a texture is provided by an extension
1 parent af94d6d commit 2739454

File tree

2 files changed

+26
-12
lines changed

2 files changed

+26
-12
lines changed

src/3d/qgsgltf3dutils.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,16 @@ static QgsMaterial *parseMaterial( tinygltf::Model &model, int materialIndex, QS
305305
{
306306
tinygltf::Texture &tex = model.textures[pbr.baseColorTexture.index];
307307

308+
// Source can be undefined if texture is provided by an extension
309+
if ( tex.source < 0 )
310+
{
311+
QgsMetalRoughMaterial *pbrMaterial = new QgsMetalRoughMaterial;
312+
pbrMaterial->setMetalness( pbr.metallicFactor ); // [0..1] or texture
313+
pbrMaterial->setRoughness( pbr.roughnessFactor );
314+
pbrMaterial->setBaseColor( QColor::fromRgbF( pbr.baseColorFactor[0], pbr.baseColorFactor[1], pbr.baseColorFactor[2], pbr.baseColorFactor[3] ) );
315+
return pbrMaterial;
316+
}
317+
308318
tinygltf::Image &img = model.images[tex.source];
309319

310320
if ( !img.uri.empty() )

src/core/tiledscene/qgstiledscenelayerrenderer.cpp

+16-12
Original file line numberDiff line numberDiff line change
@@ -610,22 +610,26 @@ void QgsTiledSceneLayerRenderer::renderTrianglePrimitive( const tinygltf::Model
610610
{
611611
const tinygltf::Texture &tex = model.textures[pbr.baseColorTexture.index];
612612

613-
switch ( QgsGltfUtils::imageResourceType( model, tex.source ) )
613+
// Source can be undefined if texture is provided by an extension
614+
if ( tex.source >= 0 )
614615
{
615-
case QgsGltfUtils::ResourceType::Embedded:
616-
textureImage = QgsGltfUtils::extractEmbeddedImage( model, tex.source );
617-
break;
618-
619-
case QgsGltfUtils::ResourceType::Linked:
616+
switch ( QgsGltfUtils::imageResourceType( model, tex.source ) )
620617
{
621-
const QString linkedPath = QgsGltfUtils::linkedImagePath( model, tex.source );
622-
const QString textureUri = QUrl( contentUri ).resolved( linkedPath ).toString();
623-
const QByteArray rep = mIndex.retrieveContent( textureUri, feedback() );
624-
if ( !rep.isEmpty() )
618+
case QgsGltfUtils::ResourceType::Embedded:
619+
textureImage = QgsGltfUtils::extractEmbeddedImage( model, tex.source );
620+
break;
621+
622+
case QgsGltfUtils::ResourceType::Linked:
625623
{
626-
textureImage = QImage::fromData( rep );
624+
const QString linkedPath = QgsGltfUtils::linkedImagePath( model, tex.source );
625+
const QString textureUri = QUrl( contentUri ).resolved( linkedPath ).toString();
626+
const QByteArray rep = mIndex.retrieveContent( textureUri, feedback() );
627+
if ( !rep.isEmpty() )
628+
{
629+
textureImage = QImage::fromData( rep );
630+
}
631+
break;
627632
}
628-
break;
629633
}
630634
}
631635

0 commit comments

Comments
 (0)