Browse Source

MaterialTools: fix filterAttributes() asserting with empty input.

The internal assert was too restrictive, remove.
pull/601/head
Vladimír Vondruš 3 years ago
parent
commit
0980b3b78c
  1. 2
      src/Magnum/MaterialTools/Filter.cpp
  2. 25
      src/Magnum/MaterialTools/Test/FilterTest.cpp

2
src/Magnum/MaterialTools/Filter.cpp

@ -42,8 +42,6 @@ namespace {
bits for all attributes in filtered-out layers, bits for all attributes in filtered-out layers,
- both can't be nullptr */ - both can't be nullptr */
Trade::MaterialData filterAttributesLayersImplementation(const Trade::MaterialData& material, const Containers::BitArrayView inputAttributesToKeep, const Containers::BitArrayView inputLayersToKeep) { 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()); const std::size_t totalAttributeCount = material.attributeDataOffset(material.layerCount());
/* Generate the input attribute bit array or make a mutable copy. Using an /* Generate the input attribute bit array or make a mutable copy. Using an

25
src/Magnum/MaterialTools/Test/FilterTest.cpp

@ -50,6 +50,8 @@ struct FilterTest: TestSuite::Tester {
void attributesLayers(); void attributesLayers();
void attributesLayersRemoveBaseLayer(); void attributesLayersRemoveBaseLayer();
void attributesLayersWrongBitCount(); void attributesLayersWrongBitCount();
void emptyInput();
}; };
FilterTest::FilterTest() { FilterTest::FilterTest() {
@ -63,7 +65,9 @@ FilterTest::FilterTest() {
&FilterTest::attributesLayers, &FilterTest::attributesLayers,
&FilterTest::attributesLayersRemoveBaseLayer, &FilterTest::attributesLayersRemoveBaseLayer,
&FilterTest::attributesLayersWrongBitCount}); &FilterTest::attributesLayersWrongBitCount,
&FilterTest::emptyInput});
} }
using namespace Math::Literals; using namespace Math::Literals;
@ -318,6 +322,25 @@ void FilterTest::attributesLayersWrongBitCount() {
"MaterialTools::filterAttributesLayers(): expected 2 layer bits but got 3\n"); "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) CORRADE_TEST_MAIN(Magnum::MaterialTools::Test::FilterTest)

Loading…
Cancel
Save