From a215381d4b816146b31ec80be2ebacc074e3dbd2 Mon Sep 17 00:00:00 2001 From: Roman Zhu Date: Fri, 28 Aug 2026 21:27:37 +0200 Subject: [PATCH] tsk tsk no crash a simp --- .../Tools/ModelTool/ModelTool.Assimp.cpp | 70 ++++++++++++++----- 1 file changed, 53 insertions(+), 17 deletions(-) diff --git a/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp b/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp index 4509d287d..bdc768704 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.Assimp.cpp @@ -20,26 +20,29 @@ #include #include #include -#include #include #include -class AssimpLogStream : public Assimp::LogStream +class AssimpLogger final : public Assimp::Logger { public: - AssimpLogStream() + AssimpLogger() + : Logger(NORMAL) { - Assimp::DefaultLogger::create(""); - Assimp::DefaultLogger::get()->attachStream(this); } - ~AssimpLogStream() + bool attachStream(Assimp::LogStream*, unsigned int) override { - Assimp::DefaultLogger::get()->detachStream(this); - Assimp::DefaultLogger::kill(); + return false; } - void write(const char* message) override + bool detachStream(Assimp::LogStream*, unsigned int) override + { + return false; + } + +private: + static void Write(const Char* type, const char* message) { String s(message); if (s.Length() <= 0) @@ -52,10 +55,49 @@ public: else if (c >= 255) c = '?'; } - LOG(Info, "[Assimp]: {0}", s); + LOG(Info, "[Assimp]: {0}: {1}", type, s); + } + + void OnDebug(const char* message) override + { + if (m_Severity >= DEBUGGING) + Write(TEXT("Debug"), message); + } + + void OnVerboseDebug(const char* message) override + { + if (m_Severity >= VERBOSE) + Write(TEXT("Debug"), message); + } + + void OnInfo(const char* message) override + { + Write(TEXT("Info"), message); + } + + void OnWarn(const char* message) override + { + Write(TEXT("Warn"), message); + } + + void OnError(const char* message) override + { + Write(TEXT("Error"), message); } }; +Assimp::Logger* GetAssimpLogger() +{ + static Assimp::Logger* logger = []() + { + auto result = new AssimpLogger(); + Assimp::DefaultLogger::set(result); + LOG(Info, "Assimp {0}.{1}.{2}", aiGetVersionMajor(), aiGetVersionMinor(), aiGetVersionRevision()); + return result; + }(); + return logger; +} + Float2 ToFloat2(const aiVector2D& v) { return Float2(v.x, v.y); @@ -148,7 +190,6 @@ struct AssimpBone struct AssimpImporterData { Assimp::Importer AssimpImporter; - AssimpLogStream AssimpLogStream; const String Path; const aiScene* Scene = nullptr; const ModelTool::Options& Options; @@ -699,12 +740,7 @@ void ImportAnimation(int32 index, ModelData& data, AssimpImporterData& importerD bool ModelTool::ImportDataAssimp(const String& path, ModelData& data, Options& options, String& errorMsg) { - static bool AssimpInited = false; - if (!AssimpInited) - { - AssimpInited = true; - LOG(Info, "Assimp {0}.{1}.{2}", aiGetVersionMajor(), aiGetVersionMinor(), aiGetVersionRevision()); - } + GetAssimpLogger(); bool importMeshes = EnumHasAnyFlags(options.ImportTypes, ImportDataTypes::Geometry); bool importAnimations = EnumHasAnyFlags(options.ImportTypes, ImportDataTypes::Animations); AssimpImporterData context(path, options);