From 0f063fe86a14acf37d4ca3a4a70c016524ce2ed7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 8 Jun 2022 13:06:24 +0200 Subject: [PATCH] AnySceneImporter: propagate sceneField[For]Name() as well. --- .../AnySceneImporter/AnySceneImporter.cpp | 11 +++++++ .../AnySceneImporter/AnySceneImporter.h | 8 +++-- .../Test/AnySceneImporterTest.cpp | 30 +++++++++++++++++++ .../AnySceneImporter/Test/CMakeLists.txt | 1 + .../Test/scene-custom-field.gltf | 12 ++++++++ 5 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 src/MagnumPlugins/AnySceneImporter/Test/scene-custom-field.gltf diff --git a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp index bc4c09f4f..83f5a2d72 100644 --- a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp +++ b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp @@ -192,6 +192,17 @@ Containers::String AnySceneImporter::doSceneName(const UnsignedInt id) { return Containers::String AnySceneImporter::doObjectName(const UnsignedLong id) { return _in->objectName(id); } Containers::Optional AnySceneImporter::doScene(const UnsignedInt id) { return _in->scene(id); } +SceneField AnySceneImporter::doSceneFieldForName(const Containers::StringView name) { + /* This API can be called even if no file is opened, in that case return + an invalid ID */ + return _in ? _in->sceneFieldForName(name) : SceneField{}; +} +Containers::String AnySceneImporter::doSceneFieldName(const UnsignedInt name) { + /* This API can be called even if no file is opened, in that case return + an invalid ID */ + return _in ? _in->sceneFieldName(sceneFieldCustom(name)) : Containers::String{}; +} + UnsignedInt AnySceneImporter::doLightCount() const { return _in->lightCount(); } Int AnySceneImporter::doLightForName(const Containers::StringView name) { return _in->lightForName(name); } Containers::String AnySceneImporter::doLightName(const UnsignedInt id) { return _in->lightName(id); } diff --git a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h index 262c838b1..d54477d46 100644 --- a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h +++ b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h @@ -147,9 +147,9 @@ and corresponding count-/name-related functions are then proxied to the concrete implementation. The @ref close() function closes and discards the internally instantiated plugin; @ref isOpened() works as usual. -While the @ref meshAttributeName() and @ref meshAttributeForName() APIs can -be called without a file opened, they return an empty string or an invalid -attribute in that case. +While the @ref meshAttributeName(), @ref meshAttributeForName(), +@ref sceneFieldName() and @ref sceneFieldForName() APIs can be called without a +file opened, they return an empty string or an invalid attribute in that case. */ class MAGNUM_ANYSCENEIMPORTER_EXPORT AnySceneImporter: public AbstractImporter { public: @@ -181,6 +181,8 @@ class MAGNUM_ANYSCENEIMPORTER_EXPORT AnySceneImporter: public AbstractImporter { MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doSceneName(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doObjectName(UnsignedLong id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doScene(UnsignedInt id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL SceneField doSceneFieldForName(Containers::StringView name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doSceneFieldName(Magnum::UnsignedInt name) override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doLightCount() const override; MAGNUM_ANYSCENEIMPORTER_LOCAL Int doLightForName(Containers::StringView name) override; diff --git a/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp b/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp index 5416b2416..267916528 100644 --- a/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp +++ b/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp @@ -37,6 +37,7 @@ #include "Magnum/Math/Vector3.h" #include "Magnum/Trade/AbstractImporter.h" #include "Magnum/Trade/MeshData.h" +#include "Magnum/Trade/SceneData.h" #ifdef MAGNUM_BUILD_DEPRECATED #define _MAGNUM_NO_DEPRECATED_MESHDATA /* So it doesn't yell here */ @@ -64,6 +65,8 @@ struct AnySceneImporterTest: TestSuite::Tester { void propagateConfigurationUnknown(); void propagateFileCallback(); + void sceneFieldName(); + void sceneFieldNameNoFileOpened(); void meshAttributeName(); void meshAttributeNameNoFileOpened(); @@ -113,6 +116,8 @@ AnySceneImporterTest::AnySceneImporterTest() { &AnySceneImporterTest::propagateConfigurationUnknown, &AnySceneImporterTest::propagateFileCallback, + &AnySceneImporterTest::sceneFieldName, + &AnySceneImporterTest::sceneFieldNameNoFileOpened, &AnySceneImporterTest::meshAttributeName, &AnySceneImporterTest::meshAttributeNameNoFileOpened}); @@ -313,6 +318,31 @@ void AnySceneImporterTest::propagateFileCallback() { CORRADE_VERIFY(!importer->isOpened()); } +void AnySceneImporterTest::sceneFieldName() { + 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("GltfImporter") < PluginManager::LoadState::Loaded) + CORRADE_SKIP("GltfImporter plugin can't be loaded."); + + Containers::Pointer importer = manager.instantiate("AnySceneImporter"); + + CORRADE_VERIFY(importer->openFile(Utility::Path::join(ANYSCENEIMPORTER_TEST_DIR, "scene-custom-field.gltf"))); + CORRADE_COMPARE(importer->sceneFieldForName("radius"), sceneFieldCustom(0)); + CORRADE_COMPARE(importer->sceneFieldForName("nonexistent"), SceneField{}); + CORRADE_COMPARE(importer->sceneFieldName(sceneFieldCustom(0)), "radius"); + CORRADE_COMPARE(importer->sceneFieldName(sceneFieldCustom(3)), ""); +} + +void AnySceneImporterTest::sceneFieldNameNoFileOpened() { + Containers::Pointer importer = _manager.instantiate("AnySceneImporter"); + + CORRADE_COMPARE(importer->sceneFieldForName(""), SceneField{}); + CORRADE_COMPARE(importer->sceneFieldName(sceneFieldCustom(0)), ""); +} + void AnySceneImporterTest::meshAttributeName() { PluginManager::Manager manager{MAGNUM_PLUGINS_IMPORTER_INSTALL_DIR}; #ifdef ANYSCENEIMPORTER_PLUGIN_FILENAME diff --git a/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt b/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt index 33046b858..cff963e02 100644 --- a/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt +++ b/src/MagnumPlugins/AnySceneImporter/Test/CMakeLists.txt @@ -57,6 +57,7 @@ corrade_add_test(AnySceneImporterTest AnySceneImporterTest.cpp FILES ${PROJECT_SOURCE_DIR}/src/MagnumPlugins/ObjImporter/Test/pointMesh.obj mesh-custom-attribute.gltf + scene-custom-field.gltf triangle.ply) target_include_directories(AnySceneImporterTest PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/$) if(MAGNUM_ANYSCENEIMPORTER_BUILD_STATIC) diff --git a/src/MagnumPlugins/AnySceneImporter/Test/scene-custom-field.gltf b/src/MagnumPlugins/AnySceneImporter/Test/scene-custom-field.gltf new file mode 100644 index 000000000..4dbcea128 --- /dev/null +++ b/src/MagnumPlugins/AnySceneImporter/Test/scene-custom-field.gltf @@ -0,0 +1,12 @@ +{ + "asset": { + "version": "2.0" + }, + "nodes": [ + { + "extras": { + "radius": 56 + } + } + ] +}