diff --git a/src/Magnum/DebugTools/CompareMaterial.cpp b/src/Magnum/DebugTools/CompareMaterial.cpp index 0424bcb5d..85fa63ac2 100644 --- a/src/Magnum/DebugTools/CompareMaterial.cpp +++ b/src/Magnum/DebugTools/CompareMaterial.cpp @@ -33,6 +33,9 @@ #include "Magnum/Math/Matrix.h" #include "Magnum/Math/Vector4.h" +/* Depending on MaterialTools isn't desirable at the moment, so it's just a + header and an anonymous namespace to avoid clashes */ +#include "Magnum/MaterialTools/Implementation/attributesEqual.h" #include "Magnum/Trade/MaterialData.h" namespace Corrade { namespace TestSuite { @@ -81,64 +84,6 @@ Comparator::Comparator(): _state{InPlaceInit} {} Comparator::~Comparator() = default; -namespace { - -bool attributesEqual(const Trade::MaterialAttributeData& a, const Trade::MaterialAttributeData& b) { - #ifdef CORRADE_TARGET_GCC - #pragma GCC diagnostic push - #pragma GCC diagnostic error "-Wswitch" - #endif - CORRADE_INTERNAL_ASSERT(a.type() == b.type()); - switch(a.type()) { - #define _c(type) case Trade::MaterialAttributeType::type: \ - return Math::TypeTraits::equals(a.value(), b.value()); - #define _ct(name, type) case Trade::MaterialAttributeType::name: \ - return Math::TypeTraits::equals(a.value(), b.value()); - _ct(Bool, bool) - /* LCOV_EXCL_START */ - _c(Float) - _c(Deg) - _c(Rad) - _c(UnsignedInt) - _c(Int) - _c(UnsignedLong) - _c(Long) - _c(Vector2) - _c(Vector2ui) - _c(Vector2i) - _c(Vector3) - _c(Vector3ui) - _c(Vector3i) - _c(Vector4) - _c(Vector4ui) - _c(Vector4i) - _c(Matrix2x2) - _c(Matrix2x3) - _c(Matrix2x4) - _c(Matrix3x2) - _c(Matrix3x3) - _c(Matrix3x4) - _c(Matrix4x2) - _c(Matrix4x3) - /* LCOV_EXCL_STOP */ - _ct(Pointer, const void*) - _ct(MutablePointer, void*) - _ct(String, Containers::StringView) - _ct(TextureSwizzle, Trade::MaterialTextureSwizzle) - #undef _c - #undef _ct - case Trade::MaterialAttributeType::Buffer: - return Containers::StringView{Containers::arrayCast(a.value>())} == Containers::StringView{Containers::arrayCast(b.value>())}; - } - #ifdef CORRADE_TARGET_GCC - #pragma GCC diagnostic pop - #endif - - CORRADE_INTERNAL_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ -} - -} - TestSuite::ComparisonStatusFlags Comparator::operator()(const Trade::MaterialData& actual, const Trade::MaterialData& expected) { _state->actual = &actual; _state->expected = &expected; @@ -164,7 +109,7 @@ TestSuite::ComparisonStatusFlags Comparator::operat if(actual.attributeType(layer, inActual) != expected.attributeType(layer, inExpected)) { attributeState = AttributeState::DifferentType; _state->materialState = Utility::max(_state->materialState, MaterialState::DifferentAttributeTypes); - } else if(!attributesEqual(actual.attributeData(layer, inActual), expected.attributeData(layer, inExpected))) { + } else if(!MaterialTools::Implementation::attributesEqual(actual.attributeData(layer, inActual), expected.attributeData(layer, inExpected))) { attributeState = AttributeState::DifferentValue; _state->materialState = Utility::max(_state->materialState, MaterialState::DifferentAttributeValues); } else { diff --git a/src/Magnum/MaterialTools/CMakeLists.txt b/src/Magnum/MaterialTools/CMakeLists.txt index 9326d3cb9..2f9d648a0 100644 --- a/src/Magnum/MaterialTools/CMakeLists.txt +++ b/src/Magnum/MaterialTools/CMakeLists.txt @@ -45,7 +45,8 @@ set(MagnumMaterialTools_HEADERS visibility.h) -set(MagnumSceneTools_PRIVATE_HEADERS ) +set(MagnumMaterialTools_PRIVATE_HEADERS + Implementation/attributesEqual.h) # Objects shared between main and test library add_library(MagnumMaterialToolsObjects OBJECT diff --git a/src/Magnum/MaterialTools/Implementation/attributesEqual.h b/src/Magnum/MaterialTools/Implementation/attributesEqual.h new file mode 100644 index 000000000..c65b66e64 --- /dev/null +++ b/src/Magnum/MaterialTools/Implementation/attributesEqual.h @@ -0,0 +1,93 @@ +#ifndef Magnum_MaterialTools_Implementation_attributesEqual_h +#define Magnum_MaterialTools_Implementation_attributesEqual_h +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, + 2020, 2021, 2022, 2023 Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include "Magnum/Trade/MaterialData.h" +#include "Magnum/Math/Matrix3.h" +#include "Magnum/Math/Vector4.h" + +/* Used by DebugTools::CompareMaterial as well, but depending on this library + isn't desirable at the moment so it's just a header and an anonymous + namespace to avoid clashes */ +namespace Magnum { namespace MaterialTools { namespace Implementation { namespace { + +bool attributesEqual(const Trade::MaterialAttributeData& a, const Trade::MaterialAttributeData& b) { + #ifdef CORRADE_TARGET_GCC + #pragma GCC diagnostic push + #pragma GCC diagnostic error "-Wswitch" + #endif + CORRADE_INTERNAL_ASSERT(a.type() == b.type()); + switch(a.type()) { + #define _c(type) case Trade::MaterialAttributeType::type: \ + return Math::TypeTraits::equals(a.value(), b.value()); + #define _ct(name, type) case Trade::MaterialAttributeType::name: \ + return Math::TypeTraits::equals(a.value(), b.value()); + _ct(Bool, bool) + /* LCOV_EXCL_START */ + _c(Float) + _c(Deg) + _c(Rad) + _c(UnsignedInt) + _c(Int) + _c(UnsignedLong) + _c(Long) + _c(Vector2) + _c(Vector2ui) + _c(Vector2i) + _c(Vector3) + _c(Vector3ui) + _c(Vector3i) + _c(Vector4) + _c(Vector4ui) + _c(Vector4i) + _c(Matrix2x2) + _c(Matrix2x3) + _c(Matrix2x4) + _c(Matrix3x2) + _c(Matrix3x3) + _c(Matrix3x4) + _c(Matrix4x2) + _c(Matrix4x3) + /* LCOV_EXCL_STOP */ + _ct(Pointer, const void*) + _ct(MutablePointer, void*) + _ct(String, Containers::StringView) + _ct(TextureSwizzle, Trade::MaterialTextureSwizzle) + #undef _c + #undef _ct + case Trade::MaterialAttributeType::Buffer: + return Containers::StringView{Containers::arrayCast(a.value>())} == Containers::StringView{Containers::arrayCast(b.value>())}; + } + #ifdef CORRADE_TARGET_GCC + #pragma GCC diagnostic pop + #endif + + CORRADE_INTERNAL_ASSERT_UNREACHABLE(); /* LCOV_EXCL_LINE */ +} + +}}}} + +#endif