diff --git a/src/Magnum/Trade/MaterialData.cpp b/src/Magnum/Trade/MaterialData.cpp index 94e95f257..60b6c9571 100644 --- a/src/Magnum/Trade/MaterialData.cpp +++ b/src/Magnum/Trade/MaterialData.cpp @@ -748,6 +748,14 @@ UnsignedInt MaterialData::attributeId(const MaterialLayer layer, const MaterialA return attributeId(string, name); } +const MaterialAttributeData& MaterialData::attributeData(const UnsignedInt layer, const UnsignedInt id) const { + CORRADE_ASSERT(layer < layerCount(), + "Trade::MaterialData::attributeData(): index" << layer << "out of range for" << layerCount() << "layers", _data[0]); + CORRADE_ASSERT(id < attributeCount(layer), + "Trade::MaterialData::attributeData(): index" << id << "out of range for" << attributeCount(layer) << "attributes in layer" << layer, _data[0]); + return _data[layerOffset(layer) + id]; +} + Containers::StringView MaterialData::attributeName(const UnsignedInt layer, const UnsignedInt id) const { CORRADE_ASSERT(layer < layerCount(), "Trade::MaterialData::attributeName(): index" << layer << "out of range for" << layerCount() << "layers", {}); diff --git a/src/Magnum/Trade/MaterialData.h b/src/Magnum/Trade/MaterialData.h index 1ec0ac33d..c5d7a1101 100644 --- a/src/Magnum/Trade/MaterialData.h +++ b/src/Magnum/Trade/MaterialData.h @@ -2451,6 +2451,23 @@ class MAGNUM_TRADE_EXPORT MaterialData { return attributeId(0, name); } /**< @overload */ + /** + * @brief Raw attribute data + * + * The @p layer is expected to be smaller than @ref layerCount() const, + * @p id is expected to be smaller than @ref attributeCount(UnsignedInt) const. + */ + const MaterialAttributeData& attributeData(UnsignedInt layer, UnsignedInt id) const; + + /** + * @brief Raw attribute data in the base material + * + * The @p @p id is expected to be smaller than @ref attributeCount() const. + */ + const MaterialAttributeData& attributeData(UnsignedInt id) const { + return attributeData(0, id); + } + /** * @brief Name of an attribute in given material layer * diff --git a/src/Magnum/Trade/Test/MaterialDataTest.cpp b/src/Magnum/Trade/Test/MaterialDataTest.cpp index 709f63e43..67359128f 100644 --- a/src/Magnum/Trade/Test/MaterialDataTest.cpp +++ b/src/Magnum/Trade/Test/MaterialDataTest.cpp @@ -998,6 +998,11 @@ void MaterialDataTest::construct() { CORRADE_COMPARE(data.attributeName(3), "highlightColor"); /* Access by ID */ + CORRADE_COMPARE(data.attributeData(0).name(), "AmbientTextureMatrix"); + CORRADE_COMPARE(data.attributeData(1).name(), "DiffuseTextureCoordinates"); + CORRADE_COMPARE(data.attributeData(2).name(), "DoubleSided"); + CORRADE_COMPARE(data.attributeData(3).name(), "highlightColor"); + CORRADE_COMPARE(data.attributeType(0), MaterialAttributeType::Matrix3x3); CORRADE_COMPARE(data.attributeType(1), MaterialAttributeType::UnsignedInt); CORRADE_COMPARE(data.attributeType(2), MaterialAttributeType::Bool); @@ -1220,6 +1225,10 @@ void MaterialDataTest::constructLayers() { CORRADE_COMPARE(data.attributeName(3, 1), "thickness"); /* Access by layer ID and attribute ID */ + CORRADE_COMPARE(data.attributeData(0, 0).name(), "DiffuseTextureCoordinates"); + CORRADE_COMPARE(data.attributeData(1, 2).name(), "highlightColor"); + CORRADE_COMPARE(data.attributeData(3, 1).name(), "thickness"); + CORRADE_COMPARE(data.attributeType(0, 0), MaterialAttributeType::UnsignedInt); CORRADE_COMPARE(data.attributeType(1, 2), MaterialAttributeType::Vector4); CORRADE_COMPARE(data.attributeType(3, 1), MaterialAttributeType::Float); @@ -2587,6 +2596,7 @@ void MaterialDataTest::accessLayerOutOfBounds() { data.findAttributeId(2, MaterialAttribute::AlphaMask); data.attributeId(2, "AlphaMask"); data.attributeId(2, MaterialAttribute::AlphaMask); + data.attributeData(2, 0); data.attributeName(2, 0); data.attributeType(2, 0); data.attributeType(2, "AlphaMask"); @@ -2626,6 +2636,7 @@ void MaterialDataTest::accessLayerOutOfBounds() { "Trade::MaterialData::findAttributeId(): index 2 out of range for 2 layers\n" "Trade::MaterialData::attributeId(): index 2 out of range for 2 layers\n" "Trade::MaterialData::attributeId(): index 2 out of range for 2 layers\n" + "Trade::MaterialData::attributeData(): index 2 out of range for 2 layers\n" "Trade::MaterialData::attributeName(): index 2 out of range for 2 layers\n" "Trade::MaterialData::attributeType(): index 2 out of range for 2 layers\n" "Trade::MaterialData::attributeType(): index 2 out of range for 2 layers\n" @@ -2844,6 +2855,7 @@ void MaterialDataTest::accessOutOfBoundsInLayerIndex() { std::ostringstream out; Error redirectError{&out}; + data.attributeData(1, 2); data.attributeName(1, 2); data.attributeType(1, 2); data.attribute(1, 2); @@ -2853,6 +2865,7 @@ void MaterialDataTest::accessOutOfBoundsInLayerIndex() { data.mutableAttribute(1, 2); data.mutableAttribute(1, 2); CORRADE_COMPARE(out.str(), + "Trade::MaterialData::attributeData(): index 2 out of range for 2 attributes in layer 1\n" "Trade::MaterialData::attributeName(): index 2 out of range for 2 attributes in layer 1\n" "Trade::MaterialData::attributeType(): index 2 out of range for 2 attributes in layer 1\n" "Trade::MaterialData::attribute(): index 2 out of range for 2 attributes in layer 1\n"