From 5cfe3b88c744a5adc54162158b9b8066006bf68b Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Sat, 29 Oct 2022 11:38:20 +0200 Subject: [PATCH] Add unit test for `ModelTool::DetectLodIndex` and improve LOD index detection further #765 --- Source/Engine/Tests/TestModelTool.cpp | 24 +++++++++++++++++++++ Source/Engine/Tests/Tests.Build.cs | 9 ++++++++ Source/Engine/Tools/ModelTool/ModelTool.cpp | 12 ++++------- 3 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 Source/Engine/Tests/TestModelTool.cpp diff --git a/Source/Engine/Tests/TestModelTool.cpp b/Source/Engine/Tests/TestModelTool.cpp new file mode 100644 index 000000000..13aa2bf15 --- /dev/null +++ b/Source/Engine/Tests/TestModelTool.cpp @@ -0,0 +1,24 @@ +// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved. + +#include "Engine/Tools/ModelTool/ModelTool.h" +#include + +TEST_CASE("ModelTool") +{ + SECTION("Test DetectLodIndex") + { + CHECK(ModelTool::DetectLodIndex(TEXT("mesh")) == 0); + CHECK(ModelTool::DetectLodIndex(TEXT("mesh LOD")) == 0); + CHECK(ModelTool::DetectLodIndex(TEXT("mesh LOD0")) == 0); + CHECK(ModelTool::DetectLodIndex(TEXT("mesh LOD1")) == 1); + CHECK(ModelTool::DetectLodIndex(TEXT("mesh_LOD1")) == 1); + CHECK(ModelTool::DetectLodIndex(TEXT("mesh_lod1")) == 1); + CHECK(ModelTool::DetectLodIndex(TEXT("mesh_lod2")) == 2); + CHECK(ModelTool::DetectLodIndex(TEXT("lod0")) == 0); + CHECK(ModelTool::DetectLodIndex(TEXT("lod1")) == 1); + CHECK(ModelTool::DetectLodIndex(TEXT("lod_2")) == 2); + CHECK(ModelTool::DetectLodIndex(TEXT("mesh_lod_0")) == 0); + CHECK(ModelTool::DetectLodIndex(TEXT("mesh_lod_1")) == 1); + CHECK(ModelTool::DetectLodIndex(TEXT("mesh lod_2")) == 2); + } +} diff --git a/Source/Engine/Tests/Tests.Build.cs b/Source/Engine/Tests/Tests.Build.cs index 3d91dc7fd..ad64962a0 100644 --- a/Source/Engine/Tests/Tests.Build.cs +++ b/Source/Engine/Tests/Tests.Build.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using Flax.Build; +using Flax.Build.NativeCpp; /// /// Engine tests module. @@ -14,6 +15,14 @@ public class Tests : EngineModule Deploy = false; } + /// + public override void Setup(BuildOptions options) + { + base.Setup(options); + + options.PrivateDependencies.Add("ModelTool"); + } + /// public override void GetFilesToDeploy(List files) { diff --git a/Source/Engine/Tools/ModelTool/ModelTool.cpp b/Source/Engine/Tools/ModelTool/ModelTool.cpp index 571c9a7bd..53fd90de4 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.cpp @@ -1552,25 +1552,21 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op int32 ModelTool::DetectLodIndex(const String& nodeName) { - int32 index = nodeName.FindLast(TEXT("LOD")); + int32 index = nodeName.FindLast(TEXT("LOD"), StringSearchCase::IgnoreCase); if (index != -1) { - int32 num; - //PE: Many models use LOD_0... to indentify LOD levels. - if (nodeName.Length() > 4 && nodeName[3] == '_') + // Some models use LOD_0 to identify LOD levels + if (nodeName.Length() > index + 4 && nodeName[index + 3] == '_') index++; + int32 num; if (!StringUtils::Parse(nodeName.Get() + index + 3, &num)) { if (num >= 0 && num < MODEL_MAX_LODS) - { return num; - } - LOG(Warning, "Invalid mesh level of detail index at node \'{0}\'. Maximum supported amount of LODs is {1}.", nodeName, MODEL_MAX_LODS); } } - return 0; }