From 3daf2b712a257a686f49486c7981ec3bd30116e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CBrandon?= Date: Tue, 9 Jul 2019 11:41:53 -0400 Subject: [PATCH] Fix issue where code segfaults when surface material is missing Ignores missing material and warns user of bad FBX Only edge case is handled while previously working models should operate as before --- src/fbx/materials/FbxMaterials.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/fbx/materials/FbxMaterials.cpp b/src/fbx/materials/FbxMaterials.cpp index 7aeebcc..f553193 100644 --- a/src/fbx/materials/FbxMaterials.cpp +++ b/src/fbx/materials/FbxMaterials.cpp @@ -12,6 +12,8 @@ #include "RoughnessMetallicMaterials.hpp" #include "TraditionalMaterials.hpp" +static int warnMtrCount = 0; + FbxMaterialsAccess::FbxMaterialsAccess( const FbxMesh* pMesh, const std::map& textureLocations) @@ -43,9 +45,16 @@ FbxMaterialsAccess::FbxMaterialsAccess( continue; } - FbxSurfaceMaterial* surfaceMaterial = + auto* surfaceMaterial = mesh->GetNode()->GetSrcObject(materialNum); + if (!surfaceMaterial) { + if (++warnMtrCount == 1) { + fmt::printf("Warning: Reference to missing surface material.\n"); + fmt::printf(" (Further warnings of this type squelched.)\n"); + } + } + if (materialNum >= summaries.size()) { summaries.resize(materialNum + 1); } @@ -57,7 +66,8 @@ FbxMaterialsAccess::FbxMaterialsAccess( if (materialNum >= userProperties.size()) { userProperties.resize(materialNum + 1); } - if (userProperties[materialNum].empty()) { + if (surfaceMaterial && userProperties[materialNum].empty()) { + FbxProperty objectProperty = surfaceMaterial->GetFirstProperty(); while (objectProperty.IsValid()) { if (objectProperty.GetFlag(FbxPropertyFlags::eUserDefined)) { @@ -97,6 +107,9 @@ const std::vector FbxMaterialsAccess::GetUserProperties(const int p std::unique_ptr FbxMaterialsAccess::GetMaterialInfo( FbxSurfaceMaterial* material, const std::map& textureLocations) { + if (!material) { + return nullptr; + } std::unique_ptr res = FbxStingrayPBSMaterialResolver(material, textureLocations).resolve(); if (res == nullptr) {