Skip to content

Commit f317fd8

Browse files
authored
Merge pull request #60933 from qgis/backport-60880-to-release-3_40
[Backport release-3_40] Avoid crashing when a tiled scene texture is provided by an extension
2 parents 3131323 + c9304c1 commit f317fd8

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
@@ -306,6 +306,16 @@ static QgsMaterial *parseMaterial( tinygltf::Model &model, int materialIndex, QS
306306
{
307307
tinygltf::Texture &tex = model.textures[pbr.baseColorTexture.index];
308308

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

311321
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)