diff --git a/src/Magnum/MaterialTools/Filter.cpp b/src/Magnum/MaterialTools/Filter.cpp index 5ea7213cd..6d6986bb3 100644 --- a/src/Magnum/MaterialTools/Filter.cpp +++ b/src/Magnum/MaterialTools/Filter.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "Magnum/Trade/MaterialData.h" @@ -99,13 +100,7 @@ Trade::MaterialData filterAttributesLayersImplementation(const Trade::MaterialDa /* Copy attributes that aren't filtered away. Not using NoInit in order to use the default deleter and have this usable from plugins. */ Containers::Array attributes{patchedInputAttributesToKeep.count()}; - /** @todo some copyMasked() utility */ - UnsignedInt attributeOffset = 0; - for(UnsignedInt i = 0; i != totalAttributeCount; ++i) { - if(!patchedInputAttributesToKeep[i]) continue; - attributes[attributeOffset++] = material.attributeData()[i]; - } - CORRADE_INTERNAL_ASSERT(attributeOffset == attributes.size()); + Utility::copyMasked(material.attributeData(), patchedInputAttributesToKeep, attributes); return Trade::MaterialData{material.types() & typesToKeep, std::move(attributes), std::move(layers)}; } diff --git a/src/Magnum/MeshTools/Filter.cpp b/src/Magnum/MeshTools/Filter.cpp index dd35e0f74..91df5bfe7 100644 --- a/src/Magnum/MeshTools/Filter.cpp +++ b/src/Magnum/MeshTools/Filter.cpp @@ -27,6 +27,7 @@ #include #include +#include #include "Magnum/Trade/MeshData.h" @@ -43,14 +44,8 @@ Trade::MeshData filterAttributes(const Trade::MeshData& mesh, const Containers:: /* Copy attributes that aren't filtered away. Not using NoInit in order to use the default deleter and have this usable from plugins. */ - Containers::Array filtered{attributesToKeep.count()}; - /** @todo some copyMasked() utility */ - UnsignedInt attributeOffset = 0; - for(UnsignedInt i = 0; i != attributesToKeep.size(); ++i) { - if(!attributesToKeep[i]) continue; - filtered[attributeOffset++] = mesh.attributeData()[i]; - } - CORRADE_INTERNAL_ASSERT(attributeOffset == filtered.size()); + Containers::Array filtered{ValueInit, attributesToKeep.count()}; + Utility::copyMasked(mesh.attributeData(), attributesToKeep, filtered); /* Can't do just Trade::MeshIndexData{data.indices()} as that would discard implementation-specific types. And can't do diff --git a/src/Magnum/SceneTools/Filter.cpp b/src/Magnum/SceneTools/Filter.cpp index b08cc318c..3f51758e4 100644 --- a/src/Magnum/SceneTools/Filter.cpp +++ b/src/Magnum/SceneTools/Filter.cpp @@ -42,14 +42,10 @@ Trade::SceneData filterFields(const Trade::SceneData& scene, const Containers::B CORRADE_ASSERT(fieldsToKeep.size() == scene.fieldCount(), "SceneTools::filterFields(): expected" << scene.fieldCount() << "bits but got" << fieldsToKeep.size(), (Trade::SceneData{Trade::SceneMappingType::UnsignedInt, 0, nullptr, {}})); + /* Copy fields that aren't filtered away. Not using NoInit in order to use + the default deleter and have this usable from plugins. */ Containers::Array filtered{ValueInit, fieldsToKeep.count()}; - std::size_t offset = 0; - /** @todo some "iterate set bits" API */ - for(std::size_t i = 0; i != fieldsToKeep.size(); ++i) { - if(!fieldsToKeep[i]) continue; - filtered[offset++] = scene.fieldData(i); - } - CORRADE_INTERNAL_ASSERT(offset == filtered.size()); + Utility::copyMasked(scene.fieldData(), fieldsToKeep, filtered); return Trade::SceneData{scene.mappingType(), scene.mappingBound(), {}, scene.data(), std::move(filtered)};