Improved vertor type check and fixed vertor relational tests

master
Christophe Riccio ago%!(EXTRA string=15 years)
parent ba0d3bbaff
commit ac7e851692
  1. 20
      glm/core/_detail.hpp
  2. 43
      glm/core/func_vector_relational.hpp
  3. 4
      glm/core/type_vec1.hpp
  4. 5
      glm/core/type_vec2.hpp
  5. 4
      glm/core/type_vec3.hpp
  6. 3
      glm/core/type_vec4.hpp
  7. 11
      test/core/core_type_vec4.cpp

@ -250,16 +250,16 @@ namespace detail{
}; };
}; };
#define GLM_DETAIL_IS_VECTOR(T) \ # define GLM_DETAIL_IS_VECTOR(TYPE) \
template <> \ template <typename T> \
struct is_vector \ struct is_vector<TYPE<T> > \
{ \ { \
enum is_vector_enum \ enum is_vector_enum \
{ \ { \
_YES = 1, \ _YES = 1, \
_NO = 0 \ _NO = 0 \
}; \ }; \
} };
////////////////// //////////////////
// matrix // matrix

@ -10,6 +10,8 @@
#ifndef glm_core_func_vector_relational #ifndef glm_core_func_vector_relational
#define glm_core_func_vector_relational #define glm_core_func_vector_relational
#include "_detail.hpp"
namespace glm namespace glm
{ {
namespace test{ namespace test{
@ -31,10 +33,11 @@ namespace glm
vecType<T> const & y vecType<T> const & y
) )
{ {
GLM_STATIC_ASSERT( GLM_STATIC_ASSERT((
detail::type<T>::is_float || detail::type<T>::is_float ||
detail::type<T>::is_int || detail::type<T>::is_int ||
detail::type<T>::is_uint, "'lessThan' only accept numbers"); detail::type<T>::is_uint) && detail::is_vector<vecType<T> >::_YES,
"'lessThan' only accept numbers");
typename vecType<bool>::bool_type Result(vecType<bool>::null); typename vecType<bool>::bool_type Result(vecType<bool>::null);
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i) for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
@ -51,10 +54,11 @@ namespace glm
vecType<T> const & y vecType<T> const & y
) )
{ {
GLM_STATIC_ASSERT( GLM_STATIC_ASSERT((
detail::type<T>::is_float || detail::type<T>::is_float ||
detail::type<T>::is_int || detail::type<T>::is_int ||
detail::type<T>::is_uint, "'lessThanEqual' only accept numbers"); detail::type<T>::is_uint) && detail::is_vector<vecType<T> >::_YES,
"'lessThanEqual' only accept numbers");
typename vecType<bool>::bool_type Result(vecType<bool>::null); typename vecType<bool>::bool_type Result(vecType<bool>::null);
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i) for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
@ -71,10 +75,11 @@ namespace glm
vecType<T> const & y vecType<T> const & y
) )
{ {
GLM_STATIC_ASSERT( GLM_STATIC_ASSERT((
detail::type<T>::is_float || detail::type<T>::is_float ||
detail::type<T>::is_int || detail::type<T>::is_int ||
detail::type<T>::is_uint, "'greaterThan' only accept numbers"); detail::type<T>::is_uint) && detail::is_vector<vecType<T> >::_YES,
"'greaterThan' only accept numbers");
typename vecType<bool>::bool_type Result(vecType<bool>::null); typename vecType<bool>::bool_type Result(vecType<bool>::null);
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i) for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
@ -91,10 +96,11 @@ namespace glm
vecType<T> const & y vecType<T> const & y
) )
{ {
GLM_STATIC_ASSERT( GLM_STATIC_ASSERT((
detail::type<T>::is_float || detail::type<T>::is_float ||
detail::type<T>::is_int || detail::type<T>::is_int ||
detail::type<T>::is_uint, "'greaterThanEqual' only accept numbers"); detail::type<T>::is_uint) && detail::is_vector<vecType<T> >::_YES,
"'greaterThanEqual' only accept numbers");
typename vecType<bool>::bool_type Result(vecType<bool>::null); typename vecType<bool>::bool_type Result(vecType<bool>::null);
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i) for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
@ -111,11 +117,7 @@ namespace glm
vecType<T> const & y vecType<T> const & y
) )
{ {
GLM_STATIC_ASSERT( GLM_STATIC_ASSERT(detail::is_vector<vecType<T> >::_YES, "'equal' only accept GLM vectors");
detail::type<T>::is_float ||
detail::type<T>::is_int ||
detail::type<T>::is_uint ||
detail::type<T>::is_bool, "'equal' only accept GLM vectors");
typename vecType<bool>::bool_type Result(vecType<bool>::null); typename vecType<bool>::bool_type Result(vecType<bool>::null);
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i) for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
@ -132,11 +134,7 @@ namespace glm
vecType<T> const & y vecType<T> const & y
) )
{ {
GLM_STATIC_ASSERT( GLM_STATIC_ASSERT(detail::is_vector<vecType<T> >::_YES, "'notEqual' only accept GLM vectors");
detail::type<T>::is_float ||
detail::type<T>::is_int ||
detail::type<T>::is_uint ||
detail::type<T>::is_bool, "'notEqual' only accept GLM vectors");
typename vecType<bool>::bool_type Result(vecType<bool>::null); typename vecType<bool>::bool_type Result(vecType<bool>::null);
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i) for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
@ -149,8 +147,7 @@ namespace glm
template <template <typename> class vecType> template <template <typename> class vecType>
inline bool any(vecType<bool> const & v) inline bool any(vecType<bool> const & v)
{ {
GLM_STATIC_ASSERT( GLM_STATIC_ASSERT(detail::is_vector<vecType<bool> >::_YES, "'any' only accept GLM boolean vectors");
vecType<bool>::is_bool, "'any' only accept GLM boolean vectors");
bool Result = false; bool Result = false;
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i) for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
@ -163,8 +160,7 @@ namespace glm
template <template <typename> class vecType> template <template <typename> class vecType>
inline bool all(vecType<bool> const & v) inline bool all(vecType<bool> const & v)
{ {
GLM_STATIC_ASSERT( GLM_STATIC_ASSERT(detail::is_vector<vecType<bool> >::_YES, "'all' only accept GLM boolean vectors");
vecType<bool>::is_bool, "'all' only accept GLM boolean vectors");
bool Result = true; bool Result = true;
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i) for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)
@ -177,8 +173,7 @@ namespace glm
template <template <typename> class vecType> template <template <typename> class vecType>
inline vecType<bool> not_(vecType<bool> const & v) inline vecType<bool> not_(vecType<bool> const & v)
{ {
GLM_STATIC_ASSERT( GLM_STATIC_ASSERT(detail::is_vector<vecType<bool> >::_YES, "'not_' only accept GLM boolean vectors");
vecType<bool>::is_bool, "'not_' only accept GLM boolean vectors");
typename vecType<bool>::bool_type Result(vecType<bool>::null); typename vecType<bool>::bool_type Result(vecType<bool>::null);
for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i) for(typename vecType<bool>::size_type i = 0; i < vecType<bool>::value_size(); ++i)

@ -38,6 +38,8 @@ namespace glm
struct tvec1 struct tvec1
{ {
enum ctor{null}; enum ctor{null};
enum {_size = 1};
typedef T value_type; typedef T value_type;
typedef std::size_t size_type; typedef std::size_t size_type;
static size_type value_size(); static size_type value_size();
@ -154,6 +156,8 @@ namespace glm
T& x; T& x;
}; };
GLM_DETAIL_IS_VECTOR(tvec1);
typedef detail::tvec1<core::type::precision::highp_float> highp_vec1_t; typedef detail::tvec1<core::type::precision::highp_float> highp_vec1_t;
typedef detail::tvec1<core::type::precision::mediump_float> mediump_vec1_t; typedef detail::tvec1<core::type::precision::mediump_float> mediump_vec1_t;
typedef detail::tvec1<core::type::precision::lowp_float> lowp_vec1_t; typedef detail::tvec1<core::type::precision::lowp_float> lowp_vec1_t;

@ -36,6 +36,8 @@ namespace glm
struct tvec2 struct tvec2
{ {
enum ctor{null}; enum ctor{null};
enum {_size = 2};
typedef T value_type; typedef T value_type;
typedef std::size_t size_type; typedef std::size_t size_type;
static size_type value_size(); static size_type value_size();
@ -193,6 +195,9 @@ namespace glm
T& x; T& x;
T& y; T& y;
}; };
GLM_DETAIL_IS_VECTOR(tvec2);
} //namespace detail } //namespace detail
namespace core{ namespace core{

@ -35,6 +35,8 @@ namespace glm
struct tvec3 struct tvec3
{ {
enum ctor{null}; enum ctor{null};
enum {_size = 3};
typedef T value_type; typedef T value_type;
typedef std::size_t size_type; typedef std::size_t size_type;
static size_type value_size(); static size_type value_size();
@ -199,6 +201,8 @@ namespace glm
T & y; T & y;
T & z; T & z;
}; };
GLM_DETAIL_IS_VECTOR(tvec3);
} //namespace detail } //namespace detail
namespace core{ namespace core{

@ -37,6 +37,7 @@ namespace glm
{ {
enum ctor{null}; enum ctor{null};
enum {_size = 4}; enum {_size = 4};
typedef T value_type; typedef T value_type;
typedef std::size_t size_type; typedef std::size_t size_type;
static size_type value_size(); static size_type value_size();
@ -214,6 +215,8 @@ namespace glm
T & z; T & z;
T & w; T & w;
}; };
GLM_DETAIL_IS_VECTOR(tvec4);
} //namespace detail } //namespace detail
namespace core{ namespace core{

@ -8,6 +8,7 @@
/////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////
#include <glm/glm.hpp> #include <glm/glm.hpp>
#include <glm/gtc/half_float.hpp>
#include <xmmintrin.h> #include <xmmintrin.h>
#include <emmintrin.h> #include <emmintrin.h>
@ -32,8 +33,18 @@ __m128 swizzle(glm::vec4 const & v)
return _mm_shuffle_ps(Src, Src, mask<(int(W) << 6) | (int(Z) << 4) | (int(Y) << 2) | (int(X) << 0)>::value); return _mm_shuffle_ps(Src, Src, mask<(int(W) << 6) | (int(Z) << 4) | (int(Y) << 2) | (int(X) << 0)>::value);
} }
void test_hvec4()
{
glm::hvec4 const A = glm::hvec4(0, 1, 2, 3);
//glm::hvec4 B = glm::swizzle<glm::X, glm::Y, glm::Z, glm::W>(A);
//glm::vec4 B = glm::detail::tvec##(glm::vec4::_size)<float>();
}
int main() int main()
{ {
test_hvec4();
__m128 DataA = swizzle<X, Y, Z, W>(glm::vec4(1.0f, 2.0f, 3.0f, 4.0f)); __m128 DataA = swizzle<X, Y, Z, W>(glm::vec4(1.0f, 2.0f, 3.0f, 4.0f));
__m128 DataB = swizzle<W, Z, Y, X>(glm::vec4(1.0f, 2.0f, 3.0f, 4.0f)); __m128 DataB = swizzle<W, Z, Y, X>(glm::vec4(1.0f, 2.0f, 3.0f, 4.0f));

Loading…
Cancel
Save