Browse Source

Moved swizzle() functions to root namespace.

They aren't much useful in Math namespace and here it allows to handle
also Color3/Color4 types. Moreover all RGBA component names were removed
from Math namespace, so it would be inconsistent to have them there only
in swizzle() functions.
pull/279/head
Vladimír Vondruš 14 years ago
parent
commit
0177ec8b5d
  1. 1
      src/CMakeLists.txt
  2. 1
      src/Math/CMakeLists.txt
  3. 2
      src/Math/Test/CMakeLists.txt
  4. 34
      src/Swizzle.h
  5. 1
      src/Test/CMakeLists.txt
  6. 17
      src/Test/SwizzleTest.cpp
  7. 8
      src/Test/SwizzleTest.h

1
src/CMakeLists.txt

@ -56,6 +56,7 @@ set(Magnum_HEADERS
Scene.h Scene.h
Shader.h Shader.h
SizeTraits.h SizeTraits.h
Swizzle.h
Texture.h Texture.h
TypeTraits.h TypeTraits.h

1
src/Math/CMakeLists.txt

@ -6,7 +6,6 @@ set(MagnumMath_HEADERS
Matrix.h Matrix.h
Matrix3.h Matrix3.h
Matrix4.h Matrix4.h
Swizzle.h
Vector.h Vector.h
Vector2.h Vector2.h
Vector3.h Vector3.h

2
src/Math/Test/CMakeLists.txt

@ -6,8 +6,6 @@ corrade_add_test2(MathVector2Test Vector2Test.cpp)
corrade_add_test2(MathVector3Test Vector3Test.cpp) corrade_add_test2(MathVector3Test Vector3Test.cpp)
corrade_add_test2(MathVector4Test Vector4Test.cpp) corrade_add_test2(MathVector4Test Vector4Test.cpp)
corrade_add_test2(MathSwizzleTest SwizzleTest.cpp)
corrade_add_test2(MathMatrixTest MatrixTest.cpp) corrade_add_test2(MathMatrixTest MatrixTest.cpp)
corrade_add_test2(MathMatrix3Test Matrix3Test.cpp) corrade_add_test2(MathMatrix3Test Matrix3Test.cpp)
corrade_add_test2(MathMatrix4Test Matrix4Test.cpp) corrade_add_test2(MathMatrix4Test Matrix4Test.cpp)

34
src/Math/Swizzle.h → src/Swizzle.h

@ -1,5 +1,5 @@
#ifndef Magnum_Math_Swizzle_h #ifndef Magnum_Swizzle_h
#define Magnum_Math_Swizzle_h #define Magnum_Swizzle_h
/* /*
Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz> Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz>
@ -19,12 +19,15 @@
* @brief Function Magnum::Math::swizzle() * @brief Function Magnum::Math::swizzle()
*/ */
#include "Vector4.h" #include "Color.h"
namespace Magnum { namespace Math { namespace Magnum {
#ifndef DOXYGEN_GENERATING_OUTPUT #ifndef DOXYGEN_GENERATING_OUTPUT
namespace Implementation { namespace Implementation {
using Math::Implementation::Sequence;
using Math::Implementation::GenerateSequence;
template<size_t size, size_t position> struct GetPosition { template<size_t size, size_t position> struct GetPosition {
static_assert(size > position, "Swizzle parameter out of range of base vector"); static_assert(size > position, "Swizzle parameter out of range of base vector");
@ -42,12 +45,15 @@ namespace Implementation {
template<size_t size> struct GetComponent<size, 'a'>: public GetPosition<size, 3> {}; template<size_t size> struct GetComponent<size, 'a'>: public GetPosition<size, 3> {};
template<size_t size, class T> struct TypeForSize { template<size_t size, class T> struct TypeForSize {
typedef Vector<size, T> Type; typedef Math::Vector<size, typename T::Type> Type;
}; };
template<class T> struct TypeForSize<2, T> { typedef Math::Vector2<typename T::Type> Type; };
template<class T> struct TypeForSize<2, T> { typedef Vector2<T> Type; }; template<class T> struct TypeForSize<3, T> { typedef Math::Vector3<typename T::Type> Type; };
template<class T> struct TypeForSize<3, T> { typedef Vector3<T> Type; }; template<class T> struct TypeForSize<4, T> { typedef Math::Vector4<typename T::Type> Type; };
template<class T> struct TypeForSize<4, T> { typedef Vector4<T> Type; }; template<class T> struct TypeForSize<3, Color3<T>> { typedef Color3<T> Type; };
template<class T> struct TypeForSize<3, Color4<T>> { typedef Color3<T> Type; };
template<class T> struct TypeForSize<4, Color3<T>> { typedef Color4<T> Type; };
template<class T> struct TypeForSize<4, Color4<T>> { typedef Color4<T> Type; };
inline constexpr size_t getPosition(size_t size, size_t position) { inline constexpr size_t getPosition(size_t size, size_t position) {
return size > position ? position : throw; return size > position ? position : throw;
@ -65,7 +71,7 @@ namespace Implementation {
throw; throw;
} }
template<size_t size, class T, size_t ...sequence> inline constexpr Vector<sizeof...(sequence), T> swizzleFrom(Sequence<sequence...>, const Vector<size, T>& vector, const char(&components)[sizeof...(sequence)+1]) { template<size_t size, class T, size_t ...sequence> inline constexpr Math::Vector<sizeof...(sequence), T> swizzleFrom(Sequence<sequence...>, const Math::Vector<size, T>& vector, const char(&components)[sizeof...(sequence)+1]) {
return {vector[getComponent<size>(components[sequence])]...}; return {vector[getComponent<size>(components[sequence])]...};
} }
} }
@ -93,8 +99,8 @@ instead of at runtime.
@see Vector4::xyz(), Vector4::rgb(), Vector4::xy(), Vector3::xy() @see Vector4::xyz(), Vector4::rgb(), Vector4::xy(), Vector3::xy()
*/ */
template<char ...components, size_t size, class T> inline constexpr typename Implementation::TypeForSize<sizeof...(components), T>::Type swizzle(const Vector<size, T>& vector) { template<char ...components, class T> inline constexpr typename Implementation::TypeForSize<sizeof...(components), T>::Type swizzle(const T& vector) {
return {vector[Implementation::GetComponent<size, components>::value()]...}; return {vector[Implementation::GetComponent<T::Size, components>::value()]...};
} }
/** /**
@ -119,10 +125,10 @@ evaluated at compile time, but at runtime.
@see Vector4::xyz(), Vector4::rgb(), Vector4::xy(), Vector3::xy() @see Vector4::xyz(), Vector4::rgb(), Vector4::xy(), Vector3::xy()
*/ */
template<size_t size, class T, size_t newSize> inline constexpr typename Implementation::TypeForSize<newSize-1, T>::Type swizzle(const Vector<size, T>& vector, const char(&components)[newSize]) { template<class T, size_t newSize> inline constexpr typename Implementation::TypeForSize<newSize-1, T>::Type swizzle(const T& vector, const char(&components)[newSize]) {
return Implementation::swizzleFrom(typename Implementation::GenerateSequence<newSize-1>::Type(), vector, components); return Implementation::swizzleFrom(typename Implementation::GenerateSequence<newSize-1>::Type(), vector, components);
} }
}} }
#endif #endif

1
src/Test/CMakeLists.txt

@ -3,3 +3,4 @@ corrade_add_test2(CameraTest CameraTest.cpp LIBRARIES Magnum)
corrade_add_test2(SceneTest SceneTest.cpp LIBRARIES Magnum) corrade_add_test2(SceneTest SceneTest.cpp LIBRARIES Magnum)
corrade_add_test2(ColorTest ColorTest.cpp) corrade_add_test2(ColorTest ColorTest.cpp)
corrade_add_test2(SwizzleTest SwizzleTest.cpp)

17
src/Math/Test/SwizzleTest.cpp → src/Test/SwizzleTest.cpp

@ -19,9 +19,9 @@
using namespace std; using namespace std;
CORRADE_TEST_MAIN(Magnum::Math::Test::SwizzleTest) CORRADE_TEST_MAIN(Magnum::Test::SwizzleTest)
namespace Magnum { namespace Math { namespace Test { namespace Magnum { namespace Test {
typedef Math::Vector2<int> Vector2; typedef Math::Vector2<int> Vector2;
typedef Math::Vector3<int> Vector3; typedef Math::Vector3<int> Vector3;
@ -66,6 +66,17 @@ void SwizzleTest::type() {
CORRADE_VERIFY((is_same<decltype(swizzle(orig, "yza")), Vector3>::value)); CORRADE_VERIFY((is_same<decltype(swizzle(orig, "yza")), Vector3>::value));
CORRADE_VERIFY((is_same<decltype(swizzle<'y', 'a', 'y', 'x'>(orig)), Vector4>::value)); CORRADE_VERIFY((is_same<decltype(swizzle<'y', 'a', 'y', 'x'>(orig)), Vector4>::value));
CORRADE_VERIFY((is_same<decltype(swizzle(orig, "yayx")), Vector4>::value)); CORRADE_VERIFY((is_same<decltype(swizzle(orig, "yayx")), Vector4>::value));
Color3<float> origColor3;
Color4<double> origColor4;
CORRADE_VERIFY((is_same<decltype(swizzle<'y', 'z', 'r'>(origColor3)), Color3<float>>::value));
CORRADE_VERIFY((is_same<decltype(swizzle<'y', 'z', 'a'>(origColor4)), Color3<double>>::value));
CORRADE_VERIFY((is_same<decltype(swizzle(origColor3, "yzr")), Color3<float>>::value));
CORRADE_VERIFY((is_same<decltype(swizzle(origColor4, "yza")), Color3<double>>::value));
CORRADE_VERIFY((is_same<decltype(swizzle<'y', 'z', 'y', 'x'>(origColor3)), Color4<float>>::value));
CORRADE_VERIFY((is_same<decltype(swizzle<'y', 'a', 'y', 'x'>(origColor4)), Color4<double>>::value));
CORRADE_VERIFY((is_same<decltype(swizzle(origColor3, "yzyx")), Color4<float>>::value));
CORRADE_VERIFY((is_same<decltype(swizzle(origColor4, "yayx")), Color4<double>>::value));
} }
void SwizzleTest::defaultType() { void SwizzleTest::defaultType() {
@ -76,4 +87,4 @@ void SwizzleTest::defaultType() {
CORRADE_COMPARE(swizzle(orig, "bragzyx"), Vector<7>(3, 1, 4, 2, 3, 2, 1)); CORRADE_COMPARE(swizzle(orig, "bragzyx"), Vector<7>(3, 1, 4, 2, 3, 2, 1));
} }
}}} }}

8
src/Math/Test/SwizzleTest.h → src/Test/SwizzleTest.h

@ -1,5 +1,5 @@
#ifndef Magnum_Math_Test_SwizzleTest_h #ifndef Magnum_Test_SwizzleTest_h
#define Magnum_Math_Test_SwizzleTest_h #define Magnum_Test_SwizzleTest_h
/* /*
Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz> Copyright © 2010, 2011, 2012 Vladimír Vondruš <mosra@centrum.cz>
@ -17,7 +17,7 @@
#include <TestSuite/Tester.h> #include <TestSuite/Tester.h>
namespace Magnum { namespace Math { namespace Test { namespace Magnum { namespace Test {
class SwizzleTest: public Corrade::TestSuite::Tester<SwizzleTest> { class SwizzleTest: public Corrade::TestSuite::Tester<SwizzleTest> {
public: public:
@ -30,6 +30,6 @@ class SwizzleTest: public Corrade::TestSuite::Tester<SwizzleTest> {
void defaultType(); void defaultType();
}; };
}}} }}
#endif #endif
Loading…
Cancel
Save