diff --git a/glm/gtc/swizzle.inl b/glm/gtc/swizzle.inl index a1e7a61b..9a163764 100644 --- a/glm/gtc/swizzle.inl +++ b/glm/gtc/swizzle.inl @@ -1,134 +1,249 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2010 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2011-01-15 +// Updated : 2011-01-15 +// Licence : This source is under MIT License +// File : glm/gtc/swizzle.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Dependency: +// - GLM core +/////////////////////////////////////////////////////////////////////////////////////////////////// + namespace glm{ namespace gtc{ -namespace swizzle +namespace swizzle{ + +template class vecType> +inline T swizzle +( + vecType const & v, + comp x +) { - template class vecType> - inline T swizzle - ( - vecType const & v, - comp x - ) - { - assert(int(x) < int(typename vecType::_size)); - return v[x]; - } + assert(int(x) < int(typename vecType::_size)); + return v[x]; +} - template - inline detail::tvec2 swizzle - ( - detail::tvec4 const & v, - comp x, comp y - ) - { - return detail::tvec2( - v[x], - v[y]); - } +template +inline detail::tvec2 swizzle +( + detail::tvec4 const & v, + comp x, comp y +) +{ + return detail::tvec2( + v[x], + v[y]); +} - template - inline detail::tvec3 swizzle - ( - detail::tvec4 const & v, - comp x, comp y, comp z - ) - { - return detail::tvec3( - v[x], - v[y], - v[z]); - } +template +inline detail::tvec3 swizzle +( + detail::tvec4 const & v, + comp x, comp y, comp z +) +{ + return detail::tvec3( + v[x], + v[y], + v[z]); +} - template - inline detail::tvec4 swizzle - ( - detail::tvec4 const & v, - comp x, comp y, comp z, comp w - ) - { - return detail::tvec4(v[x], v[y], v[z], v[w]); - } +template +inline detail::tvec4 swizzle +( + detail::tvec4 const & v, + comp x, comp y, comp z, comp w +) +{ + return detail::tvec4(v[x], v[y], v[z], v[w]); +} - template - inline detail::tref4 swizzle - ( - detail::tvec4 & v, - comp x, comp y, comp z, comp w - ) - { - return detail::tref4(v[x], v[y], v[z], v[w]); - } +template +inline int swizzle +( + detail::tvec4 const & v +) +{ + return v[X]; +} - template - inline int swizzle - ( - detail::tvec4 const & v - ) - { - return v[X]; - } +template +inline float swizzle +( + detail::tvec4 const & v +) +{ + return v[X]; +} - template - inline float swizzle - ( - detail::tvec4 const & v - ) - { - return v[X]; - } +template +inline detail::tvec2 swizzle +( + detail::tvec4 const & v +) +{ + return detail::tvec2(v[X], v[Y]); +} - template - inline detail::tvec2 swizzle - ( - detail::tvec4 const & v - ) - { - return detail::tvec2(v[X], v[Y]); - } +template +inline detail::tvec2 swizzle +( + detail::tvec4 const & v +) +{ + return detail::tvec2(v[X], v[Y]); +} - template - inline detail::tvec2 swizzle - ( - detail::tvec4 const & v - ) - { - return detail::tvec2(v[X], v[Y]); - } +template +inline detail::tvec3 swizzle +( + detail::tvec4 const & v +) +{ + return detail::tvec3(v[X], v[Y], v[Z]); +} - template - inline detail::tvec3 swizzle - ( - detail::tvec4 const & v - ) - { - return detail::tvec3(v[X], v[Y], v[Z]); - } +template +inline detail::tvec3 swizzle +( + detail::tvec4 const & v +) +{ + return detail::tvec3(v[X], v[Y], v[Z]); +} - template - inline detail::tvec3 swizzle - ( - detail::tvec4 const & v - ) - { - return detail::tvec3(v[X], v[Y], v[Z]); - } +template +inline detail::tvec4 swizzle +( + detail::tvec4 const & v +) +{ + return detail::tvec4(v[X], v[Y], v[Z], v[W]); +} - template - inline detail::tvec4 swizzle - ( - detail::tvec4 const & v - ) - { - return detail::tvec4(v[X], v[Y], v[Z], v[W]); - } +template +inline detail::tvec4 swizzle +( + detail::tvec4 const & v +) +{ + return detail::tvec4(v[X], v[Y], v[Z], v[W]); +} - template - inline detail::tvec4 swizzle - ( - detail::tvec4 const & v - ) - { - return detail::tvec4(v[X], v[Y], v[Z], v[W]); - } + +template +inline T& swizzle +( + detail::tvec4 & v, + comp x +) +{ + return v[x]; +} + +template +inline detail::tref2 swizzle +( + detail::tvec4 & v, + comp x, comp y +) +{ + return detail::tref2(v[x], v[y]); +} + +template +inline detail::tref3 swizzle +( + detail::tvec4 & v, + comp x, comp y, comp z +) +{ + return detail::tref3(v[x], v[y], v[z]); +} + +template +inline detail::tref4 swizzle +( + detail::tvec4 & v, + comp x, comp y, comp z, comp w +) +{ + return detail::tref4(v[x], v[y], v[z], v[w]); +} + +template +inline float& swizzle +( + detail::tvec4 & v +) +{ + return v[x]; +} + +template +inline int& swizzle +( + detail::tvec4 & v +) +{ + return v[x]; +} + +template +inline detail::tref2 swizzle +( + detail::tvec4 & v +) +{ + return detail::tref2(v[x], v[y]); +} + +template +inline detail::tref2 swizzle +( + detail::tvec4 & v +) +{ + return detail::tref2(v[x], v[y]); +} + +template +inline detail::tref3 swizzle +( + detail::tvec4 & v +) +{ + return detail::tref3(v[x], v[y], v[z]); +} + +template +inline detail::tref3 swizzle +( + detail::tvec4 & v +) +{ + return detail::tref3(v[x], v[y], v[z]); +} + +template +inline detail::tref4 swizzle +( + detail::tvec4 & v +) +{ + return detail::tref4(v[x], v[y], v[z], v[w]); +} + +template +inline detail::tref4 swizzle +( + detail::tvec4 & v +) +{ + return detail::tref4(v[x], v[y], v[z], v[w]); +} }//namespace swizzle }//namespace gtc diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 75cfd8ea..47c32fab 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,7 +1,7 @@ function(glmCreateTestGTC NAME) set(SAMPLE_NAME test-${NAME}) - add_executable(${SAMPLE_NAME} ${NAME}.cpp) + add_executable(${SAMPLE_NAME} ${NAME}.cpp ../test.hpp ../test.cpp) endfunction(glmCreateTestGTC) add_subdirectory(bug) diff --git a/test/gtc/gtc-swizzle.cpp b/test/gtc/gtc-swizzle.cpp index c2d51d99..cae7c61b 100644 --- a/test/gtc/gtc-swizzle.cpp +++ b/test/gtc/gtc-swizzle.cpp @@ -11,12 +11,84 @@ #include #include -int test_swizzle_vec4_dynamic() +int test_swizzle_vec4_ref_dynamic() +{ + { + glm::ivec4 A(0, 1, 2, 3); + glm::ivec4 B(2, 1, 0, 3); + glm::swizzle(A, glm::Z, glm::Y, glm::X, glm::W) = B; + assert(A.x == B.x && A.y == B.y && A.z == B.z && A.w == B.w); + } + + { + glm::ivec4 A(0, 1, 2, 3); + glm::ivec3 B(2, 1, 0); + glm::swizzle(A, glm::Z, glm::Y, glm::X) = B; + assert(A.x == B.x && A.y == B.y && A.z == B.z); + } + + { + glm::ivec4 A(0, 1, 2, 3); + glm::ivec2 B(2, 1); + glm::swizzle(A, glm::Z, glm::Y) = B; + assert(A.x == B.x && A.y == B.y); + } + + { + glm::ivec4 A(0, 1, 2, 3); + int B(2); + glm::swizzle(A, glm::Z) = B; + assert(A.x == B.x && A.y == B.y); + } + + return 0; +} + +int test_swizzle_vec4_ref_static() +{ + { + glm::ivec4 A(0, 1, 2, 3); + glm::ivec4 B(2, 1, 0, 3); + glm::swizzle(A) = B; + assert(A.x == B.x && A.y == B.y && A.z == B.z && A.w == B.w); + } + + { + glm::ivec4 A(0, 1, 2, 3); + glm::ivec3 B(2, 1, 0); + glm::swizzle(A) = B; + assert(A.x == B.x && A.y == B.y && A.z == B.z); + } + + { + glm::ivec4 A(0, 1, 2, 3); + glm::ivec2 B(2, 1); + glm::swizzle(A) = B; + assert(A.x == B.x && A.y == B.y); + } + + { + glm::ivec4 A(0, 1, 2, 3); + int B(2); + glm::swizzle(A) = B; + assert(A.x == B.x && A.y == B.y); + } + + return 0; +} + +int test_swizzle_vec4_const_dynamic() { glm::ivec4 A(0, 1, 2, 3); glm::ivec4 B = glm::swizzle(A, glm::B, glm::G, glm::R, glm::A); + assert(glm::all(glm::equal(A, B))); + glm::ivec3 C = glm::swizzle(A, glm::W, glm::Y, glm::Z); + assert(glm::all(glm::equal(A, C))); + glm::ivec2 D = glm::swizzle(A, glm::W, glm::X); + assert(glm::all(glm::equal(A, D))); + assert(D.x == A.w && D.y == A.x); int E = glm::swizzle(A, glm::Q); assert(E == A.q); @@ -24,12 +96,19 @@ int test_swizzle_vec4_dynamic() return 0; } -int test_swizzle_vec4_static() +int test_swizzle_vec4_const_static() { glm::ivec4 A(0, 1, 2, 3); + glm::ivec4 B = glm::swizzle(A); + assert(glm::all(glm::equal(A, B))); + glm::ivec3 C = glm::swizzle(A); + assert(glm::all(glm::equal(A, C))); + glm::ivec2 D = glm::swizzle(A); + assert(glm::all(glm::equal(A, D))); + int E = glm::swizzle(A); assert(E == A.q); @@ -39,8 +118,10 @@ int test_swizzle_vec4_static() int main(int argc, void* argv[]) { int Failed = 0; - Failed += test_swizzle_vec4_dynamic(); - Failed += test_swizzle_vec4_static(); + Failed += test_swizzle_vec4_ref_dynamic(); + Failed += test_swizzle_vec4_ref_static(); + Failed += test_swizzle_vec4_const_dynamic(); + Failed += test_swizzle_vec4_const_static(); return Failed; } diff --git a/test/test.cpp b/test/test.cpp new file mode 100644 index 00000000..e69de29b diff --git a/test/test.hpp b/test/test.hpp new file mode 100644 index 00000000..815bba7e --- /dev/null +++ b/test/test.hpp @@ -0,0 +1,38 @@ +#ifndef glm_test_included +#define glm_test_included + +#include + +namespace glm{ +namespace test +{ + class test + { + enum result + { + PASSED, + FAILED, + ASSERT, + STATIC, + MAX + }; + + public: + test(std::string const & Name, std::size_t const & Count); + result & operator[](std::size_t const & Index); + result const & operator[](std::size_t const & Index) const; + + static int get(result const Result) const; + static void log(test const & Test); + + protected: + std::string Name; + std::vertor Tests; + + static test Result[MAX]; + }; + +}//namespace test +}//namespace glm + +#endif//glm_test_included