From 36a9550940c29bbdeffc524cfd58e9699be2a89c Mon Sep 17 00:00:00 2001 From: Mathieu Westphal Date: Sun, 5 Jan 2025 12:22:44 +0100 Subject: [PATCH] scene: Improve behavior when failing to load a file --- application/testing/CMakeLists.txt | 1 + library/public/scene.h | 2 ++ library/src/scene_impl.cxx | 4 +++- library/testing/TestSDKSceneInvalid.cxx | 4 ++++ testing/baselines/TestMultiFileInvalid.png | 3 +++ 5 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 testing/baselines/TestMultiFileInvalid.png diff --git a/application/testing/CMakeLists.txt b/application/testing/CMakeLists.txt index 91e77eff61..2b94eb082c 100644 --- a/application/testing/CMakeLists.txt +++ b/application/testing/CMakeLists.txt @@ -234,6 +234,7 @@ f3d_test(NAME TestMultiFileColoring DATA mb/recursive ARGS --multi-file-mode=all f3d_test(NAME TestMultiFileVolume DATA multi ARGS --multi-file-mode=all -vsb --coloring-array=Scalars_) f3d_test(NAME TestMultiFileColoringTexture DATA mb/recursive/mb_1_0.vtp mb/recursive/mb_2_0.vtp world.obj ARGS --multi-file-mode=all -sb --coloring-array=Normals --coloring-component=1) f3d_test(NAME TestMultiFilePositionals DATA mb/recursive/mb_0_0.vtu mb/recursive/mb_1_0.vtp ARGS --multi-file-mode=all -s --coloring-array=Polynomial -b) +f3d_test(NAME TestMultiFileInvalid DATA cow.vtp invalid.vtp dragon.vtu ARGS --multi-file-mode=all NO_DATA_FORCE_RENDER UI) f3d_test(NAME TestMultiFileNonCoherentComponentNames DATA bluntfin.vts bluntfin_t.vtu ARGS --multi-file-mode=all --scalar-coloring --coloring-array=Momentum --coloring-component=2 --coloring-scalar-bar) f3d_test(NAME TestMultiInputArg ARGS --input ${F3D_SOURCE_DIR}/testing/data/mb/recursive/mb_0_0.vtu ${F3D_SOURCE_DIR}/testing/data/mb/recursive/mb_1_0.vtp --multi-file-mode=all -s --coloring-array=Polynomial -b) f3d_test(NAME TestMultiInputMultiArgs ARGS --input ${F3D_SOURCE_DIR}/testing/data/mb/recursive/mb_0_0.vtu --input ${F3D_SOURCE_DIR}/testing/data/mb/recursive/mb_1_0.vtp --multi-file-mode=all -s --coloring-array=Polynomial -b) diff --git a/library/public/scene.h b/library/public/scene.h index 960975f6c6..5238c0f711 100644 --- a/library/public/scene.h +++ b/library/public/scene.h @@ -47,6 +47,8 @@ class F3D_EXPORT scene /** * Add and load provided files into the scene * Already added file will NOT be reloaded + * If it fails to loads a file, it clear the scene and + * throw a load_failure_exception. */ virtual scene& add(const std::filesystem::path& filePath) = 0; virtual scene& add(const std::vector& filePath) = 0; diff --git a/library/src/scene_impl.cxx b/library/src/scene_impl.cxx index 5303b23f1e..ff10327b42 100644 --- a/library/src/scene_impl.cxx +++ b/library/src/scene_impl.cxx @@ -114,10 +114,12 @@ class scene_impl::internals &callbackData, this->MetaImporter, this->Interactor); } - // Update the meta importer, the will only update importers that have not been update before + // Update the meta importer, the will only update importers that have not been updated before #if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 3, 20240707) if (!this->MetaImporter->Update()) { + this->MetaImporter->Clear(); + this->Window.Initialize(); throw scene::load_failure_exception("failed to load scene"); } #else diff --git a/library/testing/TestSDKSceneInvalid.cxx b/library/testing/TestSDKSceneInvalid.cxx index 5a2a4d9c5a..2adaef2060 100644 --- a/library/testing/TestSDKSceneInvalid.cxx +++ b/library/testing/TestSDKSceneInvalid.cxx @@ -12,8 +12,10 @@ int TestSDKSceneInvalid(int argc, char* argv[]) f3d::engine eng = f3d::engine::createNone(); f3d::scene& sce = eng.getScene(); + std::string validFilename = "cow.vtp"; std::string invalidDefaultSceneFilename = "invalid.vtp"; std::string invalidFullSceneFilename = "duck_invalid.gltf"; + std::string validePath = std::string(argv[1]) + "data/" + validFilename; std::string invalidDefaultScene = std::string(argv[1]) + "data/" + invalidDefaultSceneFilename; std::string invalidFullScene = std::string(argv[1]) + "data/" + invalidFullSceneFilename; @@ -21,6 +23,8 @@ int TestSDKSceneInvalid(int argc, char* argv[]) "add with invalid default scene file", [&]() { sce.add(invalidDefaultScene); }); test.expect( "add with invalid full scene file", [&]() { sce.add(invalidFullScene); }); + test.expect( + "add with invalid multiple files", [&]() { sce.add({validFilename, invalidFullScene, invalidDefaultScene}); }); return test.result(); } diff --git a/testing/baselines/TestMultiFileInvalid.png b/testing/baselines/TestMultiFileInvalid.png new file mode 100644 index 0000000000..78d1763b50 --- /dev/null +++ b/testing/baselines/TestMultiFileInvalid.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6adfa41454f7cbd349d87b154d13646221cb02f9bc35cf8eefd7e97214debb79 +size 6743