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