From 7fd5eec964d4f00c5c496d59ad7351936ea912fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 21 May 2023 21:31:21 +0200 Subject: [PATCH] AnySceneImporter: properly propagate mesh level count. Importers with multi-level mesh support are here since 2020, yet somehow this plugin never exposed those. Another reason for proper test coverage. The original triangle.ply was used by AnySceneConverter tests, so it was moved there instead. --- .../Test/AnySceneConverterTest.cpp | 8 ++--- .../AnySceneConverter/Test/CMakeLists.txt | 6 ++-- .../AnySceneConverter/Test/configure.h.cmake | 1 - .../Test/triangle.ply | Bin .../AnySceneImporter/AnySceneImporter.cpp | 1 + .../AnySceneImporter/AnySceneImporter.h | 1 + .../Test/AnySceneImporterTest.cpp | 30 ++++++++++++++++-- .../AnySceneImporter/Test/CMakeLists.txt | 3 +- .../Test/per-face-colors-be.ply | Bin 0 -> 363 bytes 9 files changed, 35 insertions(+), 15 deletions(-) rename src/MagnumPlugins/{AnySceneImporter => AnySceneConverter}/Test/triangle.ply (100%) create mode 100644 src/MagnumPlugins/AnySceneImporter/Test/per-face-colors-be.ply diff --git a/src/MagnumPlugins/AnySceneConverter/Test/AnySceneConverterTest.cpp b/src/MagnumPlugins/AnySceneConverter/Test/AnySceneConverterTest.cpp index db4c62edd..feed3516e 100644 --- a/src/MagnumPlugins/AnySceneConverter/Test/AnySceneConverterTest.cpp +++ b/src/MagnumPlugins/AnySceneConverter/Test/AnySceneConverterTest.cpp @@ -160,9 +160,7 @@ void AnySceneConverterTest::convert() { Containers::Pointer converter = manager.instantiate("AnySceneConverter"); CORRADE_VERIFY(converter->convertToFile(mesh, filename)); - /* This file is reused in AnySceneImporter tests, so it's worth to save it - here */ - CORRADE_COMPARE_AS(filename, Utility::Path::join(ANYSCENEIMPORTER_TEST_DIR, "triangle.ply"), TestSuite::Compare::File); + CORRADE_COMPARE_AS(filename, Utility::Path::join(ANYSCENECONVERTER_TEST_DIR, "triangle.ply"), TestSuite::Compare::File); } void AnySceneConverterTest::convertBeginEnd() { @@ -193,9 +191,7 @@ void AnySceneConverterTest::convertBeginEnd() { CORRADE_COMPARE(converter->add(mesh), 0); CORRADE_VERIFY(converter->endFile()); - /* This file is reused in AnySceneImporter tests, so it's worth to save it - here */ - CORRADE_COMPARE_AS(filename, Utility::Path::join(ANYSCENEIMPORTER_TEST_DIR, "triangle.ply"), TestSuite::Compare::File); + CORRADE_COMPARE_AS(filename, Utility::Path::join(ANYSCENECONVERTER_TEST_DIR, "triangle.ply"), TestSuite::Compare::File); } void AnySceneConverterTest::detectConvert() { diff --git a/src/MagnumPlugins/AnySceneConverter/Test/CMakeLists.txt b/src/MagnumPlugins/AnySceneConverter/Test/CMakeLists.txt index 7a5c7fbf8..c770ba9a2 100644 --- a/src/MagnumPlugins/AnySceneConverter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AnySceneConverter/Test/CMakeLists.txt @@ -30,11 +30,9 @@ set(CMAKE_FOLDER "MagnumPlugins/AnySceneConverter/Test") if(CORRADE_TARGET_EMSCRIPTEN OR CORRADE_TARGET_ANDROID) set(ANYSCENECONVERTER_TEST_DIR .) set(ANYSCENECONVERTER_TEST_OUTPUT_DIR "write") - set(ANYSCENEIMPORTER_TEST_DIR .) else() set(ANYSCENECONVERTER_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(ANYSCENECONVERTER_TEST_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}) - set(ANYSCENEIMPORTER_TEST_DIR ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/AnySceneImporter/Test) endif() if(NOT MAGNUM_ANYSCENECONVERTER_BUILD_STATIC) @@ -53,8 +51,8 @@ file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/$/configure.h corrade_add_test(AnySceneConverterTest AnySceneConverterTest.cpp LIBRARIES MagnumTrade FILES - ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/AnySceneImporter/Test/triangle.ply - objectid.ply) + objectid.ply + triangle.ply) target_include_directories(AnySceneConverterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$) if(MAGNUM_ANYSCENECONVERTER_BUILD_STATIC) target_link_libraries(AnySceneConverterTest PRIVATE AnySceneConverter) diff --git a/src/MagnumPlugins/AnySceneConverter/Test/configure.h.cmake b/src/MagnumPlugins/AnySceneConverter/Test/configure.h.cmake index 9d4c17444..cc98fc5d8 100644 --- a/src/MagnumPlugins/AnySceneConverter/Test/configure.h.cmake +++ b/src/MagnumPlugins/AnySceneConverter/Test/configure.h.cmake @@ -26,7 +26,6 @@ #cmakedefine ANYSCENECONVERTER_PLUGIN_FILENAME "${ANYSCENECONVERTER_PLUGIN_FILENAME}" #define ANYSCENECONVERTER_TEST_OUTPUT_DIR "${ANYSCENECONVERTER_TEST_OUTPUT_DIR}" #define ANYSCENECONVERTER_TEST_DIR "${ANYSCENECONVERTER_TEST_DIR}" -#define ANYSCENEIMPORTER_TEST_DIR "${ANYSCENEIMPORTER_TEST_DIR}" #ifdef CORRADE_TARGET_WINDOWS #ifdef CORRADE_IS_DEBUG_BUILD diff --git a/src/MagnumPlugins/AnySceneImporter/Test/triangle.ply b/src/MagnumPlugins/AnySceneConverter/Test/triangle.ply similarity index 100% rename from src/MagnumPlugins/AnySceneImporter/Test/triangle.ply rename to src/MagnumPlugins/AnySceneConverter/Test/triangle.ply diff --git a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp index f213671ce..16a7e90a7 100644 --- a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp +++ b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp @@ -253,6 +253,7 @@ Containers::String AnySceneImporter::doSkin3DName(const UnsignedInt id) { return Containers::Optional AnySceneImporter::doSkin3D(const UnsignedInt id) { return _in->skin3D(id); } UnsignedInt AnySceneImporter::doMeshCount() const { return _in->meshCount(); } +UnsignedInt AnySceneImporter::doMeshLevelCount(UnsignedInt id) { return _in->meshLevelCount(id); } Int AnySceneImporter::doMeshForName(const Containers::StringView name) { return _in->meshForName(name); } Containers::String AnySceneImporter::doMeshName(const UnsignedInt id) { return _in->meshName(id); } Containers::Optional AnySceneImporter::doMesh(const UnsignedInt id, const UnsignedInt level) { return _in->mesh(id, level); } diff --git a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h index 5c22d8b05..0f7d2fb50 100644 --- a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h +++ b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h @@ -235,6 +235,7 @@ class MAGNUM_ANYSCENEIMPORTER_EXPORT AnySceneImporter: public AbstractImporter { MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doSkin3D(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doMeshCount() const override; + MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doMeshLevelCount(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Int doMeshForName(Containers::StringView name) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doMeshName(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doMesh(UnsignedInt id, UnsignedInt level) override; diff --git a/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp b/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp index b6f327993..56c921fae 100644 --- a/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp +++ b/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp @@ -93,6 +93,7 @@ struct AnySceneImporterTest: TestSuite::Tester { void meshesDeprecated2D(); void meshesDeprecated3D(); #endif + void meshLevels(); void meshAttributeNameNoFileOpened(); void materials(); @@ -180,6 +181,7 @@ AnySceneImporterTest::AnySceneImporterTest() { &AnySceneImporterTest::meshesDeprecated2D, &AnySceneImporterTest::meshesDeprecated3D, #endif + &AnySceneImporterTest::meshLevels, &AnySceneImporterTest::meshAttributeNameNoFileOpened, &AnySceneImporterTest::materials, @@ -263,7 +265,7 @@ void AnySceneImporterTest::propagateFlags() { /* Ensure Assimp is used for PLY files and not our StanfordImporter */ manager.setPreferredPlugins("StanfordImporter", {"AssimpImporter"}); - Containers::String filename = Utility::Path::join(ANYSCENEIMPORTER_TEST_DIR, "triangle.ply"); + Containers::String filename = Utility::Path::join(ANYSCENEIMPORTER_TEST_DIR, "per-face-colors-be.ply"); Containers::Pointer importer = manager.instantiate("AnySceneImporter"); importer->setFlags(ImporterFlag::Verbose); @@ -292,7 +294,7 @@ void AnySceneImporterTest::propagateConfiguration() { /* Ensure Assimp is used for PLY files and not our StanfordImporter */ manager.setPreferredPlugins("StanfordImporter", {"AssimpImporter"}); - Containers::String filename = Utility::Path::join(ANYSCENEIMPORTER_TEST_DIR, "triangle.ply"); + Containers::String filename = Utility::Path::join(ANYSCENEIMPORTER_TEST_DIR, "per-face-colors-be.ply"); Containers::Pointer importer = manager.instantiate("AnySceneImporter"); @@ -337,7 +339,7 @@ void AnySceneImporterTest::propagateConfigurationUnknown() { std::ostringstream out; Warning redirectWarning{&out}; - CORRADE_VERIFY(importer->openFile(Utility::Path::join(ANYSCENEIMPORTER_TEST_DIR, "triangle.ply"))); + CORRADE_VERIFY(importer->openFile(Utility::Path::join(ANYSCENEIMPORTER_TEST_DIR, "per-face-colors-be.ply"))); if(data.quiet) CORRADE_COMPARE(out.str(), ""); else @@ -640,6 +642,28 @@ void AnySceneImporterTest::meshesDeprecated3D() { } #endif +void AnySceneImporterTest::meshLevels() { + PluginManager::Manager manager{MAGNUM_PLUGINS_IMPORTER_INSTALL_DIR}; + #ifdef ANYSCENEIMPORTER_PLUGIN_FILENAME + CORRADE_VERIFY(manager.load(ANYSCENEIMPORTER_PLUGIN_FILENAME) & PluginManager::LoadState::Loaded); + #endif + + if(manager.load("StanfordImporter") < PluginManager::LoadState::Loaded) + CORRADE_SKIP("StanfordImporter plugin can't be loaded."); + + Containers::Pointer importer = manager.instantiate("AnySceneImporter"); + importer->configuration().setValue("perFaceToPerVertex", false); + + CORRADE_VERIFY(importer->openFile(Utility::Path::join(ANYSCENEIMPORTER_TEST_DIR, "per-face-colors-be.ply"))); + CORRADE_COMPARE(importer->meshCount(), 1); + CORRADE_COMPARE(importer->meshLevelCount(0), 2); + + /* Check only primitive, a good enough proof that it's working */ + Containers::Optional mesh = importer->mesh(0, 1); + CORRADE_VERIFY(mesh); + CORRADE_COMPARE(mesh->primitive(), MeshPrimitive::Faces); +} + void AnySceneImporterTest::meshAttributeNameNoFileOpened() { Containers::Pointer importer = _manager.instantiate("AnySceneImporter"); diff --git a/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt b/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt index 0390dd559..8499d30aa 100644 --- a/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt @@ -70,7 +70,8 @@ corrade_add_test(AnySceneImporterTest AnySceneImporterTest.cpp rgb.png 2d-mipmaps.ktx2 2d-mipmaps-and-layers.ktx2 - triangle.ply) + # Taken from StanfordImporter tests + per-face-colors-be.ply) target_include_directories(AnySceneImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$) if(MAGNUM_ANYSCENEIMPORTER_BUILD_STATIC) target_link_libraries(AnySceneImporterTest PRIVATE AnySceneImporter) diff --git a/src/MagnumPlugins/AnySceneImporter/Test/per-face-colors-be.ply b/src/MagnumPlugins/AnySceneImporter/Test/per-face-colors-be.ply new file mode 100644 index 0000000000000000000000000000000000000000..62ce8cf598e2a27c47438aeef9f88faa451d0c25 GIT binary patch literal 363 zcmZ9HJr2S!428|ll!=usGXvsBthDT00aYn=X{3-=X+SL#BOC!HX1EF*0nUOcf=W^H zr036$pOUGP#i>~f%R{M!DT7e10@RTdnh*N}h6>lHE#IQCSnvtUOq!7|d8|@;Rk)yZ z!S25!7E9!#y02tzxzu(%;(3yqUq~P+eu;TK_>D3cxoBk&wF^VFL6-@YC4$kvf&@i` zhIxAc-zNdU$5%D^iV>t+`9HsW>sf~y0BuqOn$Ys*_s8_3JLzyZ5^vFILfh+}&R*|& JtF|wmuQ!Fla=icm literal 0 HcmV?d00001