From 248304a78f3ded68bc05e2cc0b488e02619f54a5 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 22 Sep 2023 19:43:00 +0200 Subject: [PATCH] Fix regression of importing only a single material for models with split objects enabled #1483 --- .../Tools/ModelTool/ModelTool.Assimp.cpp | 7 ++++++- .../Tools/ModelTool/ModelTool.OpenFBX.cpp | 18 ++++++++++++++++-- Source/Engine/Tools/ModelTool/ModelTool.cpp | 4 ---- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp b/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp index ab9b6b606..7eff75514 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp @@ -566,12 +566,17 @@ bool ImportMaterials(ImportedModelData& result, AssimpImporterData& data, String return false; } +bool IsMeshInvalid(const aiMesh* aMesh) +{ + return aMesh->mPrimitiveTypes != aiPrimitiveType_TRIANGLE || aMesh->mNumVertices == 0 || aMesh->mNumFaces == 0 || aMesh->mFaces[0].mNumIndices != 3; +} + bool ImportMesh(int32 i, ImportedModelData& result, AssimpImporterData& data, String& errorMsg) { const auto aMesh = data.Scene->mMeshes[i]; // Skip invalid meshes - if (aMesh->mPrimitiveTypes != aiPrimitiveType_TRIANGLE || aMesh->mNumVertices == 0 || aMesh->mNumFaces == 0 || aMesh->mFaces[0].mNumIndices != 3) + if (IsMeshInvalid(aMesh)) return false; // Skip unused meshes diff --git a/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp b/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp index ab55df7f6..215eadaba 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.OpenFBX.cpp @@ -923,8 +923,6 @@ bool ImportMesh(int32 index, ImportedModelData& result, OpenFbxImporterData& dat const auto aMesh = data.Scene->getMesh(index); const auto aGeometry = aMesh->getGeometry(); const auto trianglesCount = aGeometry->getVertexCount() / 3; - - // Skip invalid meshes if (IsMeshInvalid(aMesh)) return false; @@ -1272,6 +1270,22 @@ bool ModelTool::ImportDataOpenFBX(const char* path, ImportedModelData& data, Opt const auto meshIndex = Math::Clamp(options.ObjectIndex, 0, meshCount - 1); if (ImportMesh(meshIndex, data, *context, errorMsg)) return true; + + // Let the firstly imported mesh import all materials from all meshes (index 0 is importing all following ones before itself during splitting - see code above) + if (options.ObjectIndex == 1) + { + for (int32 i = 0; i < meshCount; i++) + { + const auto aMesh = context->Scene->getMesh(i); + if (i == 1 || IsMeshInvalid(aMesh)) + continue; + for (int32 j = 0; j < aMesh->getMaterialCount(); j++) + { + const ofbx::Material* aMaterial = aMesh->getMaterial(j); + context->AddMaterial(data, aMaterial); + } + } + } } else { diff --git a/Source/Engine/Tools/ModelTool/ModelTool.cpp b/Source/Engine/Tools/ModelTool/ModelTool.cpp index 99873c016..15c7cbc32 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.cpp @@ -910,10 +910,6 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op { auto& texture = data.Textures[i]; - // When splitting imported meshes allow only the first mesh to import assets (mesh[0] is imported after all following ones so import assets during mesh[1]) - if (!options.SplitObjects && options.ObjectIndex != 1 && options.ObjectIndex != -1) - continue; - // Auto-import textures if (autoImportOutput.IsEmpty() || (data.Types & ImportDataTypes::Textures) == ImportDataTypes::None || texture.FilePath.IsEmpty()) continue;