From 21ef0f66ebbd96f8c3a120a007e8feba20a9f95d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 19 May 2022 17:55:00 +0200 Subject: [PATCH] [wip] AnySceneImporter: correctly propagate custom scene field names. TODO: tests, also for file not open TODO: and also for mesh attribs file not open --- .../AnySceneImporter/AnySceneImporter.cpp | 22 +++++++++++++++++-- .../AnySceneImporter/AnySceneImporter.h | 2 ++ .../Test/AnySceneImporterTest.cpp | 14 +++++++++++- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp index f816d177c..88efab8ed 100644 --- a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp +++ b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp @@ -191,6 +191,16 @@ Long AnySceneImporter::doObjectForName(const Containers::StringView name) { retu Containers::String AnySceneImporter::doSceneName(const UnsignedInt id) { return _in->sceneName(id); } 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); } @@ -231,8 +241,16 @@ Int AnySceneImporter::doMeshForName(const Containers::StringView name) { return 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); } -MeshAttribute AnySceneImporter::doMeshAttributeForName(const Containers::StringView name) { return _in->meshAttributeForName(name); } -Containers::String AnySceneImporter::doMeshAttributeName(const UnsignedShort id) { return _in->meshAttributeName(meshAttributeCustom(id)); } +MeshAttribute AnySceneImporter::doMeshAttributeForName(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->meshAttributeForName(name) : MeshAttribute{}; +} +Containers::String AnySceneImporter::doMeshAttributeName(const UnsignedShort id) { + /* This API can be called even if no file is opened, in that case return + an invalid ID */ + return _in ? _in->meshAttributeName(meshAttributeCustom(id)) : Containers::String{}; +} #ifdef MAGNUM_BUILD_DEPRECATED CORRADE_IGNORE_DEPRECATED_PUSH diff --git a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h index 44a5bd8aa..97a98174b 100644 --- a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h +++ b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h @@ -177,6 +177,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 9c55cf167..58b5ba527 100644 --- a/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp +++ b/src/MagnumPlugins/AnySceneImporter/Test/AnySceneImporterTest.cpp @@ -63,6 +63,9 @@ struct AnySceneImporterTest: TestSuite::Tester { void propagateConfigurationUnknown(); void propagateFileCallback(); + void sceneFieldNameNoFileOpened(); + void meshAttributeNameNoFileOpened(); + /* Explicitly forbid system-wide plugin dependencies */ PluginManager::Manager _manager{"nonexistent"}; }; @@ -107,7 +110,10 @@ AnySceneImporterTest::AnySceneImporterTest() { &AnySceneImporterTest::propagateFlags, &AnySceneImporterTest::propagateConfiguration, &AnySceneImporterTest::propagateConfigurationUnknown, - &AnySceneImporterTest::propagateFileCallback}); + &AnySceneImporterTest::propagateFileCallback, + + &AnySceneImporterTest::sceneFieldNameNoFileOpened, + &AnySceneImporterTest::meshAttributeNameNoFileOpened}); /* Load the plugin directly from the build tree. Otherwise it's static and already loaded. */ @@ -303,6 +309,12 @@ void AnySceneImporterTest::propagateFileCallback() { CORRADE_VERIFY(!importer->isOpened()); } +void AnySceneImporterTest::sceneFieldNameNoFileOpened() { +} + +void AnySceneImporterTest::meshAttributeNameNoFileOpened() { +} + }}}} CORRADE_TEST_MAIN(Magnum::Trade::Test::AnySceneImporterTest)