From 0980b3b78ca5b20c85ae8bbfe8dc264af91a1f8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 15 Feb 2023 19:14:54 +0100 Subject: [PATCH] MaterialTools: fix filterAttributes() asserting with empty input. The internal assert was too restrictive, remove. --- src/Magnum/MaterialTools/Filter.cpp | 2 -- src/Magnum/MaterialTools/Test/FilterTest.cpp | 25 +++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/Magnum/MaterialTools/Filter.cpp b/src/Magnum/MaterialTools/Filter.cpp index 7803df824..2ff9faaeb 100644 --- a/src/Magnum/MaterialTools/Filter.cpp +++ b/src/Magnum/MaterialTools/Filter.cpp @@ -42,8 +42,6 @@ namespace { bits for all attributes in filtered-out layers, - both can't be nullptr */ Trade::MaterialData filterAttributesLayersImplementation(const Trade::MaterialData& material, const Containers::BitArrayView inputAttributesToKeep, const Containers::BitArrayView inputLayersToKeep) { - CORRADE_INTERNAL_ASSERT(inputAttributesToKeep.data() || inputLayersToKeep.data()); - const std::size_t totalAttributeCount = material.attributeDataOffset(material.layerCount()); /* Generate the input attribute bit array or make a mutable copy. Using an diff --git a/src/Magnum/MaterialTools/Test/FilterTest.cpp b/src/Magnum/MaterialTools/Test/FilterTest.cpp index d4e712ccf..89d98330a 100644 --- a/src/Magnum/MaterialTools/Test/FilterTest.cpp +++ b/src/Magnum/MaterialTools/Test/FilterTest.cpp @@ -50,6 +50,8 @@ struct FilterTest: TestSuite::Tester { void attributesLayers(); void attributesLayersRemoveBaseLayer(); void attributesLayersWrongBitCount(); + + void emptyInput(); }; FilterTest::FilterTest() { @@ -63,7 +65,9 @@ FilterTest::FilterTest() { &FilterTest::attributesLayers, &FilterTest::attributesLayersRemoveBaseLayer, - &FilterTest::attributesLayersWrongBitCount}); + &FilterTest::attributesLayersWrongBitCount, + + &FilterTest::emptyInput}); } using namespace Math::Literals; @@ -318,6 +322,25 @@ void FilterTest::attributesLayersWrongBitCount() { "MaterialTools::filterAttributesLayers(): expected 2 layer bits but got 3\n"); } +void FilterTest::emptyInput() { + Trade::MaterialData empty{Trade::MaterialType::PbrClearCoat, {}}; + + /* We have no attributes but we always have one implicit layer */ + const bool yes[1]{}; + Containers::BitArrayView layersToKeep{yes, 0, 1}; + + /* It shouldn't assert or do any other crazy thing */ + CORRADE_COMPARE_AS(filterAttributes(empty, nullptr), + empty, + DebugTools::CompareMaterial); + CORRADE_COMPARE_AS(filterLayers(empty, layersToKeep), + empty, + DebugTools::CompareMaterial); + CORRADE_COMPARE_AS(filterAttributesLayers(empty, nullptr, layersToKeep), + empty, + DebugTools::CompareMaterial); +} + }}}} CORRADE_TEST_MAIN(Magnum::MaterialTools::Test::FilterTest)