From a9a4caf740f0ae0683f3d4362ebef43e21621824 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 22 Aug 2022 18:42:27 +0200 Subject: [PATCH] Trade: add MaterialData::findAttributeId() and findLayerId(). Similar to SceneData::findFieldId() and MeshData::findAttributeId(), useful to avoid a double lookup with hasAttribute() + attribute(). --- src/Magnum/Trade/MaterialData.cpp | 58 ++++++++++++++ src/Magnum/Trade/MaterialData.h | 54 +++++++++++-- src/Magnum/Trade/MaterialLayerData.h | 34 ++++++++ src/Magnum/Trade/Test/MaterialDataTest.cpp | 93 +++++++++++++++++++++- 4 files changed, 230 insertions(+), 9 deletions(-) diff --git a/src/Magnum/Trade/MaterialData.cpp b/src/Magnum/Trade/MaterialData.cpp index debe4ecce..555984052 100644 --- a/src/Magnum/Trade/MaterialData.cpp +++ b/src/Magnum/Trade/MaterialData.cpp @@ -334,6 +334,17 @@ bool MaterialData::hasLayer(const MaterialLayer layer) const { return hasLayer(string); } +Containers::Optional MaterialData::findLayerId(const Containers::StringView layer) const { + const UnsignedInt id = findLayerIdInternal(layer); + return id == ~UnsignedInt{} ? Containers::Optional{} : id; +} + +Containers::Optional MaterialData::findLayerId(const MaterialLayer layer) const { + const Containers::StringView string = layerString(layer); + CORRADE_ASSERT(string, "Trade::MaterialData::findLayerId(): invalid name" << layer, {}); + return findLayerId(string); +} + UnsignedInt MaterialData::layerId(const Containers::StringView layer) const { const UnsignedInt id = findLayerIdInternal(layer); CORRADE_ASSERT(id != ~UnsignedInt{}, @@ -594,6 +605,53 @@ bool MaterialData::hasAttribute(const MaterialLayer layer, const MaterialAttribu return hasAttribute(string, name); } +Containers::Optional MaterialData::findAttributeId(const UnsignedInt layer, const Containers::StringView name) const { + CORRADE_ASSERT(layer < layerCount(), + "Trade::MaterialData::findAttributeId(): index" << layer << "out of range for" << layerCount() << "layers", {}); + const UnsignedInt id = findAttributeIdInternal(layer, name); + return id == ~UnsignedInt{} ? Containers::Optional{} : id; +} + +Containers::Optional MaterialData::findAttributeId(const UnsignedInt layer, const MaterialAttribute name) const { + const Containers::StringView string = attributeString(name); + CORRADE_ASSERT(string, "Trade::MaterialData::findAttributeId(): invalid name" << name, {}); + return findAttributeId(layer, string); +} + +Containers::Optional MaterialData::findAttributeId(const Containers::StringView layer, const Containers::StringView name) const { + const UnsignedInt layerId = findLayerIdInternal(layer); + CORRADE_ASSERT(layerId != ~UnsignedInt{}, + "Trade::MaterialData::findAttributeId(): layer" << layer << "not found", {}); + const UnsignedInt id = findAttributeIdInternal(layerId, name); + return id == ~UnsignedInt{} ? Containers::Optional{} : id; +} + +Containers::Optional MaterialData::findAttributeId(const Containers::StringView layer, const MaterialAttribute name) const { + const Containers::StringView string = attributeString(name); + CORRADE_ASSERT(string, "Trade::MaterialData::findAttributeId(): invalid name" << name, {}); + return findAttributeId(layer, string); +} + +Containers::Optional MaterialData::findAttributeId(const MaterialLayer layer, const Containers::StringView name) const { + const Containers::StringView string = layerString(layer); + CORRADE_ASSERT(string, "Trade::MaterialData::findAttributeId(): invalid name" << layer, {}); + return findAttributeId(string, name); +} + +Containers::Optional MaterialData::findAttributeId(const MaterialLayer layer, const MaterialAttribute name) const { + const Containers::StringView string = layerString(layer); + CORRADE_ASSERT(string, "Trade::MaterialData::findAttributeId(): invalid name" << layer, {}); + return findAttributeId(string, name); +} + +Containers::Optional MaterialData::findAttributeId(const Containers::StringView name) const { + return findAttributeId(0, name); +} + +Containers::Optional MaterialData::findAttributeId(const MaterialAttribute name) const { + return findAttributeId(0, name); +} + UnsignedInt MaterialData::attributeId(const UnsignedInt layer, const Containers::StringView name) const { CORRADE_ASSERT(layer < layerCount(), "Trade::MaterialData::attributeId(): index" << layer << "out of range for" << layerCount() << "layers", {}); diff --git a/src/Magnum/Trade/MaterialData.h b/src/Magnum/Trade/MaterialData.h index e4b96bbd9..8c76236c6 100644 --- a/src/Magnum/Trade/MaterialData.h +++ b/src/Magnum/Trade/MaterialData.h @@ -2043,10 +2043,19 @@ class MAGNUM_TRADE_EXPORT MaterialData { bool hasLayer(Containers::StringView layer) const; bool hasLayer(MaterialLayer layer) const; /**< @overload */ + /** + * @brief Find ID of a named layer + * + * The @p layer doesn't exist, returns @ref Containers::NullOpt. + * @see @ref hasLayer() + */ + Containers::Optional findLayerId(Containers::StringView layer) const; + Containers::Optional findLayerId(MaterialLayer layer) const; /**< @overload */ + /** * @brief ID of a named layer * - * The @p layer is expected to exist. + * Like @ref findLayerId(), but the @p layer is expected to exist. * @see @ref hasLayer() */ UnsignedInt layerId(Containers::StringView layer) const; @@ -2280,12 +2289,45 @@ class MAGNUM_TRADE_EXPORT MaterialData { return hasAttribute(0, name); } /**< @overload */ + /** + * @brief Find ID of a named attribute in given material layer + * + * If @p name doesn't exist, returns @ref Containers::NullOpt. The + * @p layer is expected to be smaller than @ref layerCount() const. + * @see @ref hasAttribute(), @ref attributeId() + */ + Containers::Optional findAttributeId(UnsignedInt layer, Containers::StringView name) const; + Containers::Optional findAttributeId(UnsignedInt layer, MaterialAttribute name) const; /**< @overload */ + + /** + * @brief Find ID of a named attribute in a named material layer + * + * If @p name doesn't exist, returns @ref Containers::NullOpt. The + * @p layer is expected to exist. + * @see @ref hasLayer(), @ref hasAttribute(), @ref attributeId(), + * @ref findLayerId() + */ + Containers::Optional findAttributeId(Containers::StringView layer, Containers::StringView name) const; + Containers::Optional findAttributeId(Containers::StringView layer, MaterialAttribute name) const; /**< @overload */ + Containers::Optional findAttributeId(MaterialLayer layer, Containers::StringView name) const; /**< @overload */ + Containers::Optional findAttributeId(MaterialLayer layer, MaterialAttribute name) const; /**< @overload */ + + /** + * @brief Find ID of a named attribute in the base material + * + * Equivalent to calling @ref findAttributeId(UnsignedInt, Containers::StringView) const + * with @p layer set to @cpp 0 @ce. + */ + Containers::Optional findAttributeId(Containers::StringView name) const; + Containers::Optional findAttributeId(MaterialAttribute name) const; /**< @overload */ + /** * @brief ID of a named attribute in given material layer * - * The @p layer is expected to be smaller than @ref layerCount() const - * and @p name is expected to exist in that layer. - * @see @ref hasAttribute() + * Like @ref findAttributeId(UnsignedInt, Containers::StringView) const, + * but the @p name is expected to exist. + * @see @ref hasAttribute(), + * @ref attributeName(UnsignedInt, UnsignedInt) const */ UnsignedInt attributeId(UnsignedInt layer, Containers::StringView name) const; UnsignedInt attributeId(UnsignedInt layer, MaterialAttribute name) const; /**< @overload */ @@ -2293,8 +2335,8 @@ class MAGNUM_TRADE_EXPORT MaterialData { /** * @brief ID of a named attribute in a named material layer * - * The @p layer is expected to exist and @p name is expected to exist - * in that layer. + * Like @ref findAttributeId(Containers::StringView, Containers::StringView) const, + * but the @p name is expected to exist. * @see @ref hasLayer(), @ref hasAttribute() */ UnsignedInt attributeId(Containers::StringView layer, Containers::StringView name) const; diff --git a/src/Magnum/Trade/MaterialLayerData.h b/src/Magnum/Trade/MaterialLayerData.h index 7ca98eff1..6af51c24c 100644 --- a/src/Magnum/Trade/MaterialLayerData.h +++ b/src/Magnum/Trade/MaterialLayerData.h @@ -30,6 +30,8 @@ * @m_since_latest */ +#include + #include "Magnum/Math/Matrix3.h" #include "Magnum/Trade/MaterialData.h" @@ -141,6 +143,18 @@ template class MaterialLayerData: public MaterialData { return MaterialData::hasAttribute(layer, name); } /**< @overload */ + /** + * @brief Find ID of a named attribute in this layer + * + * Same as calling @ref MaterialData::findAttributeId() with @p layer. + */ + Containers::Optional findAttributeId(Containers::StringView name) const { + return MaterialData::findAttributeId(layer, name); + } + Containers::Optional findAttributeId(MaterialAttribute name) const { + return MaterialData::findAttributeId(layer, name); + } /**< @overload */ + /** * @brief ID of a named attribute in this layer * @@ -294,6 +308,7 @@ template class MaterialLayerData: public MaterialData { #if !defined(CORRADE_TARGET_MSVC) || defined(CORRADE_TARGET_CLANG_CL) using MaterialData::attributeCount; using MaterialData::hasAttribute; + using MaterialData::findAttributeId; using MaterialData::attributeId; using MaterialData::attributeName; using MaterialData::attributeType; @@ -331,6 +346,25 @@ template class MaterialLayerData: public MaterialData { return MaterialData::hasAttribute(layer_, name); } + Containers::Optional findAttributeId(UnsignedInt layer_, Containers::StringView name) const { + return MaterialData::findAttributeId(layer_, name); + } + Containers::Optional findAttributeId(UnsignedInt layer_, MaterialAttribute name) const { + return MaterialData::findAttributeId(layer_, name); + } + Containers::Optional findAttributeId(Containers::StringView layer_, Containers::StringView name) const { + return MaterialData::findAttributeId(layer_, name); + } + Containers::Optional findAttributeId(Containers::StringView layer_, MaterialAttribute name) const { + return MaterialData::findAttributeId(layer_, name); + } + Containers::Optional findAttributeId(MaterialLayer layer_, Containers::StringView name) const { + return MaterialData::findAttributeId(layer_, name); + } + Containers::Optional findAttributeId(MaterialLayer layer_, MaterialAttribute name) const { + return MaterialData::findAttributeId(layer_, name); + } + UnsignedInt attributeId(UnsignedInt layer_, Containers::StringView name) const { return MaterialData::attributeId(layer_, name); } diff --git a/src/Magnum/Trade/Test/MaterialDataTest.cpp b/src/Magnum/Trade/Test/MaterialDataTest.cpp index 1cbd5854c..07133c214 100644 --- a/src/Magnum/Trade/Test/MaterialDataTest.cpp +++ b/src/Magnum/Trade/Test/MaterialDataTest.cpp @@ -885,8 +885,14 @@ void MaterialDataTest::construct() { /* Access by name */ CORRADE_VERIFY(data.hasAttribute(MaterialAttribute::DoubleSided)); CORRADE_VERIFY(data.hasAttribute(MaterialAttribute::AmbientTextureMatrix)); + CORRADE_VERIFY(data.hasAttribute(MaterialAttribute::DiffuseTextureCoordinates)); CORRADE_VERIFY(!data.hasAttribute(MaterialAttribute::TextureMatrix)); + CORRADE_COMPARE(data.findAttributeId(MaterialAttribute::DoubleSided), 2); + CORRADE_COMPARE(data.findAttributeId(MaterialAttribute::AmbientTextureMatrix), 0); + CORRADE_COMPARE(data.findAttributeId(MaterialAttribute::DiffuseTextureCoordinates), 1); + CORRADE_VERIFY(!data.findAttributeId(MaterialAttribute::TextureMatrix)); + CORRADE_COMPARE(data.attributeId(MaterialAttribute::DoubleSided), 2); CORRADE_COMPARE(data.attributeId(MaterialAttribute::AmbientTextureMatrix), 0); CORRADE_COMPARE(data.attributeId(MaterialAttribute::DiffuseTextureCoordinates), 1); @@ -912,8 +918,16 @@ void MaterialDataTest::construct() { /* Access by string */ CORRADE_VERIFY(data.hasAttribute("DoubleSided")); CORRADE_VERIFY(data.hasAttribute("highlightColor")); + CORRADE_VERIFY(data.hasAttribute("DiffuseTextureCoordinates")); + CORRADE_VERIFY(data.hasAttribute("highlightColor")); CORRADE_VERIFY(!data.hasAttribute("TextureMatrix")); + CORRADE_COMPARE(data.findAttributeId("DoubleSided"), 2); + CORRADE_COMPARE(data.findAttributeId("AmbientTextureMatrix"), 0); + CORRADE_COMPARE(data.findAttributeId("DiffuseTextureCoordinates"), 1); + CORRADE_COMPARE(data.findAttributeId("highlightColor"), 3); + CORRADE_VERIFY(!data.findAttributeId("TextureMatrix")); + CORRADE_COMPARE(data.attributeId("DoubleSided"), 2); CORRADE_COMPARE(data.attributeId("AmbientTextureMatrix"), 0); CORRADE_COMPARE(data.attributeId("DiffuseTextureCoordinates"), 1); @@ -1044,6 +1058,13 @@ void MaterialDataTest::constructLayers() { CORRADE_VERIFY(data.hasLayer(MaterialLayer::ClearCoat)); CORRADE_VERIFY(!data.hasLayer("")); CORRADE_VERIFY(!data.hasLayer("DoubleSided")); + /** @todo test hasLayer(MaterialLayer) once there's more than ClearCoat */ + + CORRADE_COMPARE(data.findLayerId("ClearCoat"), 1); + CORRADE_COMPARE(data.findLayerId(MaterialLayer::ClearCoat), 1); + CORRADE_VERIFY(!data.findLayerId("")); + CORRADE_VERIFY(!data.findLayerId("DoubleSided")); + /** @todo test findLayerId(MaterialLayer) once there's more than ClearCoat */ CORRADE_COMPARE(data.layerId("ClearCoat"), 1); CORRADE_COMPARE(data.layerId(MaterialLayer::ClearCoat), 1); @@ -1087,6 +1108,14 @@ void MaterialDataTest::constructLayers() { CORRADE_VERIFY(!data.hasAttribute(2, MaterialAttribute::NormalTexture)); CORRADE_VERIFY(data.hasAttribute(3, MaterialAttribute::NormalTexture)); + CORRADE_COMPARE(data.findAttributeId(0, MaterialAttribute::DiffuseTextureCoordinates), 0); + CORRADE_VERIFY(!data.findAttributeId(0, MaterialAttribute::AlphaBlend)); + CORRADE_COMPARE(data.findAttributeId(1, MaterialAttribute::AlphaBlend), 1); + CORRADE_COMPARE(data.findAttributeId(1, MaterialAttribute::LayerName), 0); + CORRADE_VERIFY(!data.findAttributeId(2, MaterialAttribute::LayerName)); + CORRADE_VERIFY(!data.findAttributeId(2, MaterialAttribute::NormalTexture)); + CORRADE_COMPARE(data.findAttributeId(3, MaterialAttribute::NormalTexture), 0); + CORRADE_COMPARE(data.attributeId(0, MaterialAttribute::DiffuseTextureCoordinates), 0); CORRADE_COMPARE(data.attributeId(1, MaterialAttribute::AlphaBlend), 1); CORRADE_COMPARE(data.attributeId(1, MaterialAttribute::LayerName), 0); @@ -1124,6 +1153,14 @@ void MaterialDataTest::constructLayers() { CORRADE_VERIFY(!data.hasAttribute(2, "NormalTexture")); CORRADE_VERIFY(data.hasAttribute(3, "NormalTexture")); + CORRADE_COMPARE(data.findAttributeId(0, "DoubleSided"), 1); + CORRADE_VERIFY(!data.findAttributeId(0, "highlightColor")); + CORRADE_COMPARE(data.findAttributeId(1, "highlightColor"), 2); + CORRADE_COMPARE(data.findAttributeId(1, " LayerName"), 0); + CORRADE_VERIFY(!data.findAttributeId(2, " LayerName")); + CORRADE_VERIFY(!data.findAttributeId(2, " NormalTexture")); + CORRADE_COMPARE(data.findAttributeId(3, "NormalTexture"), 0); + CORRADE_COMPARE(data.attributeId(0, "DoubleSided"), 1); CORRADE_COMPARE(data.attributeId(1, "highlightColor"), 2); CORRADE_COMPARE(data.attributeId(1, " LayerName"), 0); @@ -1172,6 +1209,11 @@ void MaterialDataTest::constructLayers() { /* Access by layer name and attribute name */ CORRADE_VERIFY(data.hasAttribute(MaterialLayer::ClearCoat, MaterialAttribute::AlphaBlend)); CORRADE_VERIFY(data.hasAttribute(MaterialLayer::ClearCoat, MaterialAttribute::LayerName)); + CORRADE_VERIFY(!data.hasAttribute(MaterialLayer::ClearCoat, MaterialAttribute::BaseColor)); + + CORRADE_COMPARE(data.findAttributeId(MaterialLayer::ClearCoat, MaterialAttribute::AlphaBlend), 1); + CORRADE_COMPARE(data.findAttributeId(MaterialLayer::ClearCoat, MaterialAttribute::LayerName), 0); + CORRADE_VERIFY(!data.findAttributeId(MaterialLayer::ClearCoat, MaterialAttribute::BaseColor)); CORRADE_COMPARE(data.attributeId(MaterialLayer::ClearCoat, MaterialAttribute::AlphaBlend), 1); CORRADE_COMPARE(data.attributeId(MaterialLayer::ClearCoat, MaterialAttribute::LayerName), 0); @@ -1192,6 +1234,11 @@ void MaterialDataTest::constructLayers() { /* Access by layer name and attribute string */ CORRADE_VERIFY(data.hasAttribute(MaterialLayer::ClearCoat, "highlightColor")); CORRADE_VERIFY(data.hasAttribute(MaterialLayer::ClearCoat, " LayerName")); + CORRADE_VERIFY(!data.hasAttribute(MaterialLayer::ClearCoat, "BaseColor")); + + CORRADE_COMPARE(data.findAttributeId(MaterialLayer::ClearCoat, "highlightColor"), 2); + CORRADE_COMPARE(data.findAttributeId(MaterialLayer::ClearCoat, " LayerName"), 0); + CORRADE_VERIFY(!data.findAttributeId(MaterialLayer::ClearCoat, "BaseColor")); CORRADE_COMPARE(data.attributeId(MaterialLayer::ClearCoat, "highlightColor"), 2); CORRADE_COMPARE(data.attributeId(MaterialLayer::ClearCoat, " LayerName"), 0); @@ -1229,6 +1276,11 @@ void MaterialDataTest::constructLayers() { /* Access by layer string and attribute name */ CORRADE_VERIFY(data.hasAttribute("ClearCoat", MaterialAttribute::AlphaBlend)); CORRADE_VERIFY(data.hasAttribute("ClearCoat", MaterialAttribute::LayerName)); + CORRADE_VERIFY(!data.hasAttribute("ClearCoat", MaterialAttribute::BaseColor)); + + CORRADE_COMPARE(data.findAttributeId("ClearCoat", MaterialAttribute::AlphaBlend), 1); + CORRADE_COMPARE(data.findAttributeId("ClearCoat", MaterialAttribute::LayerName), 0); + CORRADE_VERIFY(!data.findAttributeId("ClearCoat", MaterialAttribute::BaseColor)); CORRADE_COMPARE(data.attributeId("ClearCoat", MaterialAttribute::AlphaBlend), 1); CORRADE_COMPARE(data.attributeId("ClearCoat", MaterialAttribute::LayerName), 0); @@ -1249,6 +1301,11 @@ void MaterialDataTest::constructLayers() { /* Access by layer string and attribute string */ CORRADE_VERIFY(data.hasAttribute("ClearCoat", "highlightColor")); CORRADE_VERIFY(data.hasAttribute("ClearCoat", " LayerName")); + CORRADE_VERIFY(!data.hasAttribute("ClearCoat", "BaseColor")); + + CORRADE_COMPARE(data.findAttributeId("ClearCoat", "highlightColor"), 2); + CORRADE_COMPARE(data.findAttributeId("ClearCoat", " LayerName"), 0); + CORRADE_VERIFY(!data.findAttributeId("ClearCoat", "BaseColor")); CORRADE_COMPARE(data.attributeId("ClearCoat", "highlightColor"), 2); CORRADE_COMPARE(data.attributeId("ClearCoat", " LayerName"), 0); @@ -1763,7 +1820,9 @@ void MaterialDataTest::accessNotFound() { {"DiffuseColor", 0xff3366aa_rgbaf} }}; + /* These are fine */ CORRADE_VERIFY(!data.hasAttribute("DiffuseColour")); + CORRADE_VERIFY(!data.findAttributeId("DiffuseColour")); std::ostringstream out; Error redirectError{&out}; @@ -2325,6 +2384,8 @@ void MaterialDataTest::accessLayerOutOfBounds() { data.attributeCount(2); data.hasAttribute(2, "AlphaMask"); data.hasAttribute(2, MaterialAttribute::AlphaMask); + data.findAttributeId(2, "AlphaMask"); + data.findAttributeId(2, MaterialAttribute::AlphaMask); data.attributeId(2, "AlphaMask"); data.attributeId(2, MaterialAttribute::AlphaMask); data.attributeName(2, 0); @@ -2362,6 +2423,8 @@ void MaterialDataTest::accessLayerOutOfBounds() { "Trade::MaterialData::attributeCount(): index 2 out of range for 2 layers\n" "Trade::MaterialData::hasAttribute(): index 2 out of range for 2 layers\n" "Trade::MaterialData::hasAttribute(): index 2 out of range for 2 layers\n" + "Trade::MaterialData::findAttributeId(): index 2 out of range for 2 layers\n" + "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::attributeName(): index 2 out of range for 2 layers\n" @@ -2398,6 +2461,9 @@ void MaterialDataTest::accessLayerNotFound() { {MaterialAttribute::AlphaMask, 0.5f}, }, {0, 2}}; + /* This is fine */ + CORRADE_VERIFY(!data.findLayerId("ClearCoat")); + std::ostringstream out; Error redirectError{&out}; data.layerId("ClearCoat"); @@ -2410,6 +2476,8 @@ void MaterialDataTest::accessLayerNotFound() { data.attributeCount("ClearCoat"); data.hasAttribute("ClearCoat", "AlphaMask"); data.hasAttribute("ClearCoat", MaterialAttribute::AlphaMask); + data.findAttributeId("ClearCoat", "AlphaMask"); + data.findAttributeId("ClearCoat", MaterialAttribute::AlphaMask); data.attributeId("ClearCoat", "AlphaMask"); data.attributeId("ClearCoat", MaterialAttribute::AlphaMask); data.attributeName("ClearCoat", 0); @@ -2447,6 +2515,8 @@ void MaterialDataTest::accessLayerNotFound() { "Trade::MaterialData::attributeCount(): layer ClearCoat not found\n" "Trade::MaterialData::hasAttribute(): layer ClearCoat not found\n" "Trade::MaterialData::hasAttribute(): layer ClearCoat not found\n" + "Trade::MaterialData::findAttributeId(): layer ClearCoat not found\n" + "Trade::MaterialData::findAttributeId(): layer ClearCoat not found\n" "Trade::MaterialData::attributeId(): layer ClearCoat not found\n" "Trade::MaterialData::attributeId(): layer ClearCoat not found\n" "Trade::MaterialData::attributeName(): layer ClearCoat not found\n" @@ -2482,7 +2552,8 @@ void MaterialDataTest::accessInvalidLayerName() { std::ostringstream out; Error redirectError{&out}; - data.layerId(MaterialLayer(0x0)); + data.findLayerId(MaterialLayer(0x0)); + data.findLayerId(MaterialLayer(0xfefe)); data.layerId(MaterialLayer(0xfefe)); data.layerFactor(MaterialLayer(0xfefe)); data.layerFactorTexture(MaterialLayer(0xfefe)); @@ -2493,6 +2564,8 @@ void MaterialDataTest::accessInvalidLayerName() { data.attributeCount(MaterialLayer(0xfefe)); data.hasAttribute(MaterialLayer(0xfefe), "AlphaMask"); data.hasAttribute(MaterialLayer(0xfefe), MaterialAttribute::AlphaMask); + data.findAttributeId(MaterialLayer(0xfefe), "AlphaMask"); + data.findAttributeId(MaterialLayer(0xfefe), MaterialAttribute::AlphaMask); data.attributeId(MaterialLayer(0xfefe), "AlphaMask"); data.attributeId(MaterialLayer(0xfefe), MaterialAttribute::AlphaMask); data.attributeName(MaterialLayer(0xfefe), 0); @@ -2520,7 +2593,8 @@ void MaterialDataTest::accessInvalidLayerName() { data.attributeOr(MaterialLayer(0xfefe), "AlphaMask", false); data.attributeOr(MaterialLayer(0xfefe), MaterialAttribute::AlphaMask, false); CORRADE_COMPARE(out.str(), - "Trade::MaterialData::layerId(): invalid name Trade::MaterialLayer(0x0)\n" + "Trade::MaterialData::findLayerId(): invalid name Trade::MaterialLayer(0x0)\n" + "Trade::MaterialData::findLayerId(): invalid name Trade::MaterialLayer(0xfefe)\n" "Trade::MaterialData::layerId(): invalid name Trade::MaterialLayer(0xfefe)\n" "Trade::MaterialData::layerFactor(): invalid name Trade::MaterialLayer(0xfefe)\n" "Trade::MaterialData::layerFactorTexture(): invalid name Trade::MaterialLayer(0xfefe)\n" @@ -2531,6 +2605,8 @@ void MaterialDataTest::accessInvalidLayerName() { "Trade::MaterialData::attributeCount(): invalid name Trade::MaterialLayer(0xfefe)\n" "Trade::MaterialData::hasAttribute(): invalid name Trade::MaterialLayer(0xfefe)\n" "Trade::MaterialData::hasAttribute(): invalid name Trade::MaterialLayer(0xfefe)\n" + "Trade::MaterialData::findAttributeId(): invalid name Trade::MaterialLayer(0xfefe)\n" + "Trade::MaterialData::findAttributeId(): invalid name Trade::MaterialLayer(0xfefe)\n" "Trade::MaterialData::attributeId(): invalid name Trade::MaterialLayer(0xfefe)\n" "Trade::MaterialData::attributeId(): invalid name Trade::MaterialLayer(0xfefe)\n" "Trade::MaterialData::attributeName(): invalid name Trade::MaterialLayer(0xfefe)\n" @@ -2624,7 +2700,9 @@ void MaterialDataTest::accessNotFoundInLayerIndex() { {"DiffuseColor", 0xff3366aa_rgbaf} }, {0, 1}}; + /* These are fine */ CORRADE_VERIFY(!data.hasAttribute(1, "DiffuseColour")); + CORRADE_VERIFY(!data.findAttributeId(1, "DiffuseColour")); std::ostringstream out; Error redirectError{&out}; @@ -2651,7 +2729,9 @@ void MaterialDataTest::accessNotFoundInLayerString() { {"DiffuseColor", 0xff3366aa_rgbaf} }, {0, 1}}; - CORRADE_VERIFY(!data.hasAttribute(1, "DiffuseColour")); + /* These are fine */ + CORRADE_VERIFY(!data.hasAttribute("ClearCoat", "DiffuseColour")); + CORRADE_VERIFY(!data.findAttributeId("ClearCoat", "DiffuseColour")); std::ostringstream out; Error redirectError{&out}; @@ -2682,6 +2762,8 @@ void MaterialDataTest::accessInvalidAttributeName() { Error redirectError{&out}; data.hasAttribute(0, MaterialAttribute(0x0)); data.hasAttribute("Layer", MaterialAttribute(0xfefe)); + data.findAttributeId(0, MaterialAttribute(0x0)); + data.findAttributeId("Layer", MaterialAttribute(0xfefe)); data.attributeId(0, MaterialAttribute(0x0)); data.attributeId("Layer", MaterialAttribute(0xfefe)); data.attributeType(0, MaterialAttribute(0x0)); @@ -2703,6 +2785,8 @@ void MaterialDataTest::accessInvalidAttributeName() { CORRADE_COMPARE(out.str(), "Trade::MaterialData::hasAttribute(): invalid name Trade::MaterialAttribute(0x0)\n" "Trade::MaterialData::hasAttribute(): invalid name Trade::MaterialAttribute(0xfefe)\n" + "Trade::MaterialData::findAttributeId(): invalid name Trade::MaterialAttribute(0x0)\n" + "Trade::MaterialData::findAttributeId(): invalid name Trade::MaterialAttribute(0xfefe)\n" "Trade::MaterialData::attributeId(): invalid name Trade::MaterialAttribute(0x0)\n" "Trade::MaterialData::attributeId(): invalid name Trade::MaterialAttribute(0xfefe)\n" "Trade::MaterialData::attributeType(): invalid name Trade::MaterialAttribute(0x0)\n" @@ -2881,6 +2965,9 @@ void MaterialDataTest::templateLayerAccess() { CORRADE_VERIFY(data.hasAttribute(0, MaterialAttribute::BaseColor)); CORRADE_VERIFY(data.hasAttribute(0, "BaseColor")); + CORRADE_COMPARE(data.findAttributeId(MaterialAttribute::LayerFactorTexture), 2); + CORRADE_COMPARE(data.findAttributeId("LayerFactorTexture"), 2); + CORRADE_COMPARE(data.attributeId(MaterialAttribute::LayerFactorTexture), 2); CORRADE_COMPARE(data.attributeId("LayerFactorTexture"), 2);