Browse Source

{Material,Mesh,SceneTools}: use Utility::copyMasked() in filter*().

It's not really implemented in a fast way yet, but that doesn't mean the
custom loops were any better.
pull/623/head
Vladimír Vondruš 3 years ago
parent
commit
f50c88b392
  1. 9
      src/Magnum/MaterialTools/Filter.cpp
  2. 11
      src/Magnum/MeshTools/Filter.cpp
  3. 10
      src/Magnum/SceneTools/Filter.cpp

9
src/Magnum/MaterialTools/Filter.cpp

@ -28,6 +28,7 @@
#include <Corrade/Containers/BitArray.h>
#include <Corrade/Containers/StridedBitArrayView.h>
#include <Corrade/Utility/Algorithms.h>
#include <Corrade/Utility/BitAlgorithms.h>
#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<Trade::MaterialAttributeData> 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)};
}

11
src/Magnum/MeshTools/Filter.cpp

@ -27,6 +27,7 @@
#include <Corrade/Containers/BitArray.h>
#include <Corrade/Containers/BitArrayView.h>
#include <Corrade/Utility/BitAlgorithms.h>
#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<Trade::MeshAttributeData> 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<Trade::MeshAttributeData> 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

10
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<Trade::SceneFieldData> 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)};

Loading…
Cancel
Save