Add metaprogramming helper constructors for tvec4 and fvec4SIMD

- Tests, too
- Also, removed a line from the simdVec4 test (there's no operator+, apparently)
This commit is contained in:
Jesse Talavera-Greenberg 2015-10-01 21:48:36 -04:00
parent c2b31a8831
commit 94eff6f642
6 changed files with 46 additions and 2 deletions

View File

@ -225,6 +225,11 @@ namespace detail
template <typename U, precision Q> template <typename U, precision Q>
GLM_FUNC_DECL GLM_EXPLICIT tvec4(tvec4<U, Q> const & v); GLM_FUNC_DECL GLM_EXPLICIT tvec4(tvec4<U, Q> const & v);
# ifdef GLM_META_PROG_HELPERS
template <typename X, typename Y, typename Z = Y>
GLM_FUNC_DECL tvec4(X const& x, Y const& y, Z const& z = Z(0));
# endif
// -- Swizzle constructors -- // -- Swizzle constructors --
# if GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE) # if GLM_HAS_ANONYMOUS_UNION && defined(GLM_SWIZZLE)

View File

@ -202,6 +202,14 @@ namespace glm
w(static_cast<T>(v.w)) w(static_cast<T>(v.w))
{} {}
# ifdef GLM_META_PROG_HELPERS
template <typename T, precision P>
template <typename X, typename Y, typename Z>
GLM_FUNC_QUALIFIER tvec4<T, P>::tvec4(X const& x, Y const& y, Z const& z)
: x(static_cast<T>(x)), y(static_cast<T>(y)), z(static_cast<T>(z)), w(static_cast<T>(0))
{}
# endif
// -- Component accesses -- // -- Component accesses --
# ifdef GLM_FORCE_SIZE_FUNC # ifdef GLM_FORCE_SIZE_FUNC

View File

@ -136,6 +136,11 @@ namespace detail
explicit fvec4SIMD( explicit fvec4SIMD(
vec4 const & v); vec4 const & v);
# ifdef GLM_META_PROG_HELPERS
template <typename X, typename Y, typename Z = Y>
GLM_FUNC_DECL fvec4SIMD(X const& x, Y const& y, Z const& z = Z(0));
# endif
//////////////////////////////////////// ////////////////////////////////////////
//// Conversion vector constructors //// Conversion vector constructors

View File

@ -89,6 +89,12 @@ GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(vec2 const & v1, vec2 const & v2) :
Data(_mm_set_ps(v2.y, v2.x, v1.y, v1.x)) Data(_mm_set_ps(v2.y, v2.x, v1.y, v1.x))
{} {}
# ifdef GLM_META_PROG_HELPERS
template <typename X, typename Y, typename Z>
GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(X const& x, Y const& y, Z const& z)
: fvec4SIMD(static_cast<float>(x), static_cast<float>(y), static_cast<float>(z), 0.0f)
{}
# endif
//GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(ivec4SIMD const & v) : //GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(ivec4SIMD const & v) :
// Data(_mm_cvtepi32_ps(v.Data)) // Data(_mm_cvtepi32_ps(v.Data))
//{} //{}

View File

@ -73,6 +73,16 @@ int test_vec4_ctor()
Error += glm::all(glm::equal(A, B)) ? 0 : 1; Error += glm::all(glm::equal(A, B)) ? 0 : 1;
} }
# ifdef GLM_META_PROG_HELPERS
{
glm::vec4 a(1, 2, 0, 0), b(1, 2), c(1, 2, 0);
Error += (a == b) ? 0 : 1;
Error += (b == c) ? 0 : 1;
Error += (a == c) ? 0 : 1;
}
# endif
# if GLM_HAS_TRIVIAL_QUERIES # if GLM_HAS_TRIVIAL_QUERIES
// Error += std::is_trivially_default_constructible<glm::vec4>::value ? 0 : 1; // Error += std::is_trivially_default_constructible<glm::vec4>::value ? 0 : 1;
// Error += std::is_trivially_copy_assignable<glm::vec4>::value ? 0 : 1; // Error += std::is_trivially_copy_assignable<glm::vec4>::value ? 0 : 1;

View File

@ -29,22 +29,32 @@
/// @author Christophe Riccio /// @author Christophe Riccio
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#define GLM_META_PROG_HELPERS
#include <glm/glm.hpp> #include <glm/glm.hpp>
#include <glm/gtx/simd_vec4.hpp> #include <glm/gtx/simd_vec4.hpp>
#include <cstdio> #include <cstdio>
#if(GLM_ARCH != GLM_ARCH_PURE) #if(GLM_ARCH != GLM_ARCH_PURE)
int main() int main()
{ {
int Error = 0;
#ifdef GLM_META_PROG_HELPERS #ifdef GLM_META_PROG_HELPERS
assert(glm::simdVec4::components == glm::simdVec4::pure_type::components); assert(glm::simdVec4::components == glm::simdVec4::pure_type::components);
{
glm::simdVec4 a(1, 2, 0, 0), b(1, 2), c(1, 2, 0);
Error += (glm::vec4_cast(a) == glm::vec4_cast(b)) ? 0 : 1;
Error += (glm::vec4_cast(b) == glm::vec4_cast(c)) ? 0 : 1;
Error += (glm::vec4_cast(c) == glm::vec4_cast(a)) ? 0 : 1;
}
#endif #endif
glm::simdVec4 A1(0.0f, 0.1f, 0.2f, 0.3f); glm::simdVec4 A1(0.0f, 0.1f, 0.2f, 0.3f);
glm::simdVec4 B1(0.4f, 0.5f, 0.6f, 0.7f); glm::simdVec4 B1(0.4f, 0.5f, 0.6f, 0.7f);
glm::simdVec4 C1 = A1 + B1; //glm::simdVec4 C1 = A1 + B1;
glm::simdVec4 D1 = A1.swizzle<glm::X, glm::Z, glm::Y, glm::W>(); glm::simdVec4 D1 = A1.swizzle<glm::X, glm::Z, glm::Y, glm::W>();
glm::simdVec4 E1(glm::vec4(1.0f)); glm::simdVec4 E1(glm::vec4(1.0f));
glm::vec4 F1 = glm::vec4_cast(E1); glm::vec4 F1 = glm::vec4_cast(E1);
@ -61,7 +71,7 @@ int main()
glm::simdVec4 GNI(add0); glm::simdVec4 GNI(add0);
return 0; return Error;
} }
#else #else