diff --git a/glm/detail/func_common.inl b/glm/detail/func_common.inl
index c7c15bc7..02e68b78 100644
--- a/glm/detail/func_common.inl
+++ b/glm/detail/func_common.inl
@@ -37,13 +37,13 @@ namespace glm{
namespace detail
{
template
- struct Abs_
+ struct compute_abs
{};
template
- struct Abs_
+ struct compute_abs
{
- GLM_FUNC_QUALIFIER static genFIType get(genFIType const & x)
+ GLM_FUNC_QUALIFIER static genFIType call(genFIType const & x)
{
GLM_STATIC_ASSERT(
std::numeric_limits::is_iec559 || std::numeric_limits::is_signed,
@@ -54,9 +54,9 @@ namespace detail
};
template
- struct Abs_
+ struct compute_abs
{
- GLM_FUNC_QUALIFIER static genFIType get(genFIType const & x)
+ GLM_FUNC_QUALIFIER static genFIType call(genFIType const & x)
{
GLM_STATIC_ASSERT(
!std::numeric_limits::is_signed && std::numeric_limits::is_integer,
@@ -73,7 +73,7 @@ namespace detail
genFIType const & x
)
{
- return detail::Abs_::is_signed>::get(x);
+ return detail::compute_abs::is_signed>::call(x);
}
VECTORIZE_VEC(abs)
diff --git a/glm/detail/setup.hpp b/glm/detail/setup.hpp
index e89a2058..2ba5fcbf 100644
--- a/glm/detail/setup.hpp
+++ b/glm/detail/setup.hpp
@@ -38,7 +38,7 @@
#define GLM_VERSION_MAJOR 0
#define GLM_VERSION_MINOR 9
#define GLM_VERSION_PATCH 5
-#define GLM_VERSION_REVISION 0
+#define GLM_VERSION_REVISION 1
///////////////////////////////////////////////////////////////////////////////////////////////////
// Platform
diff --git a/glm/gtx/vector_angle.inl b/glm/gtx/vector_angle.inl
index 39e04f22..c361314b 100644
--- a/glm/gtx/vector_angle.inl
+++ b/glm/gtx/vector_angle.inl
@@ -18,10 +18,12 @@ namespace glm
{
GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'angle' only accept floating-point inputs");
+ genType const Angle(acos(clamp(dot(x, y), genType(0), genType(1))));
+
#ifdef GLM_FORCE_RADIANS
- return acos(dot(x, y));
+ return Angle;
#else
- return degrees(acos(dot(x, y)));
+ return degrees(Angle);
#endif
}
@@ -34,10 +36,12 @@ namespace glm
{
GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'angle' only accept floating-point inputs");
+ T const Angle(acos(clamp(dot(x, y), T(0), T(1))));
+
#ifdef GLM_FORCE_RADIANS
- return acos(dot(x, y));
+ return Angle;
#else
- return degrees(acos(dot(x, y)));
+ return degrees(Angle);
#endif
}
@@ -51,10 +55,12 @@ namespace glm
{
GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'orientedAngle' only accept floating-point inputs");
+ T const Dot = clamp(dot(x, y), T(0), T(1));
+
#ifdef GLM_FORCE_RADIANS
- T const Angle(acos(dot(x, y)));
+ T const Angle(acos(Dot));
#else
- T const Angle(degrees(acos(dot(x, y))));
+ T const Angle(degrees(acos(Dot)));
#endif
detail::tvec2 const TransformedVector(glm::rotate(x, Angle));
if(all(epsilonEqual(y, TransformedVector, T(0.01))))
@@ -73,10 +79,12 @@ namespace glm
{
GLM_STATIC_ASSERT(std::numeric_limits::is_iec559, "'orientedAngle' only accept floating-point inputs");
+ T const Dot = clamp(dot(x, y), T(0), T(1));
+
#ifdef GLM_FORCE_RADIANS
- T const Angle(acos(dot(x, y)));
+ T const Angle(acos(Dot));
#else
- T const Angle(degrees(acos(dot(x, y))));
+ T const Angle(degrees(acos(Dot)));
#endif
if(dot(ref, cross(x, y)) < T(0))
diff --git a/readme.txt b/readme.txt
index 30a5b16e..ea6fc64a 100644
--- a/readme.txt
+++ b/readme.txt
@@ -36,7 +36,12 @@ GLM is a header only library, there is nothing to build, just include it.
More informations in GLM manual:
http://glm.g-truc.net/glm.pdf
-================================================================================s
+================================================================================
+GLM 0.9.5.1: 2014-XX-XX
+--------------------------------------------------------------------------------
+- Fixed angle and orientedAngle that sometimes return NaN values (#145)
+
+================================================================================
GLM 0.9.5.0: 2013-12-25
--------------------------------------------------------------------------------
- Added forward declarations (glm/fwd.hpp) for faster compilations
diff --git a/test/core/core_func_common.cpp b/test/core/core_func_common.cpp
index 43d02378..916633c8 100644
--- a/test/core/core_func_common.cpp
+++ b/test/core/core_func_common.cpp
@@ -391,19 +391,19 @@ int test_round()
Error += G == 2.0f ? 0 : 1;
#if GLM_LANG >= GLM_LANG_CXX11
- float A1 = std::round(0.0f);
+ float A1 = glm::round(0.0f);
Error += A1 == A ? 0 : 1;
- float B1 = std::round(0.5f);
+ float B1 = glm::round(0.5f);
Error += B1 == B ? 0 : 1;
- float C1 = std::round(1.0f);
+ float C1 = glm::round(1.0f);
Error += C1 == C ? 0 : 1;
- float D1 = std::round(0.1f);
+ float D1 = glm::round(0.1f);
Error += D1 == D ? 0 : 1;
- float E1 = std::round(0.9f);
+ float E1 = glm::round(0.9f);
Error += E1 == E ? 0 : 1;
- float F1 = std::round(1.5f);
+ float F1 = glm::round(1.5f);
Error += F == F ? 0 : 1;
- float G1 = std::round(1.9f);
+ float G1 = glm::round(1.9f);
Error += G1 == G ? 0 : 1;
#endif // GLM_LANG >= GLM_CXX0X
}
diff --git a/test/core/core_type_mat4x4.cpp b/test/core/core_type_mat4x4.cpp
index e9f6b31e..20a0552a 100644
--- a/test/core/core_type_mat4x4.cpp
+++ b/test/core/core_type_mat4x4.cpp
@@ -135,6 +135,8 @@ int test_ctr()
glm::vec4(8, 9, 10, 11),
glm::vec4(12, 13, 14, 15));
+ assert(sizeof(m0) == 4 * 4 * 4);
+
glm::mat4 m1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
glm::mat4 m2{
diff --git a/test/core/core_type_vec4.cpp b/test/core/core_type_vec4.cpp
index 0fa2b4ec..f63b689b 100644
--- a/test/core/core_type_vec4.cpp
+++ b/test/core/core_type_vec4.cpp
@@ -357,18 +357,15 @@ int test_vec4_perf_SoA(std::size_t Size)
std::clock_t EndTime = std::clock();
- std::printf("SoA: %d\n", EndTime - StartTime);
+ std::printf("SoA: %d\n", EndTime - StartTime);
return Error;
}
int main()
{
- //__m128 DataA = swizzle(glm::vec4(1.0f, 2.0f, 3.0f, 4.0f));
- //__m128 DataB = swizzle(glm::vec4(1.0f, 2.0f, 3.0f, 4.0f));
-
int Error(0);
-
+
std::size_t const Size(1000000);
Error += test_vec4_perf_AoS(Size);