Browse Source

Clean up quaternion relational API

Christophe Riccio 7 years ago
parent
commit
cb4ca81d9b

+ 1 - 1
glm/ext/quaternion_geometric.hpp

@@ -35,7 +35,7 @@ namespace glm
 	/// @addtogroup ext_quaternion_geometric
 	/// @{
 
-	/// Returns the length of the quaternion.
+	/// Returns the norm of a quaternions
 	///
 	/// @tparam T Floating-point scalar types.
 	///

+ 0 - 36
glm/ext/quaternion_relational.hpp

@@ -22,42 +22,6 @@ namespace glm
 	/// @addtogroup ext_quaternion_relational
 	/// @{
 
-	/// Returns the component-wise comparison result of x < y.
-	///
-	/// @tparam T Floating-point scalar types
-	/// @tparam Q Value from qualifier enum
-	///
-	/// @see ext_quaternion_relational
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<4, bool, Q> lessThan(qua<T, Q> const& x, qua<T, Q> const& y);
-
-	/// Returns the component-wise comparison of result x <= y.
-	///
-	/// @tparam T Floating-point scalar types
-	/// @tparam Q Value from qualifier enum
-	///
-	/// @see ext_quaternion_relational
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<4, bool, Q> lessThanEqual(qua<T, Q> const& x, qua<T, Q> const& y);
-
-	/// Returns the component-wise comparison of result x > y.
-	///
-	/// @tparam T Floating-point scalar types
-	/// @tparam Q Value from qualifier enum
-	///
-	/// @see ext_quaternion_relational
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<4, bool, Q> greaterThan(qua<T, Q> const& x, qua<T, Q> const& y);
-
-	/// Returns the component-wise comparison of result x >= y.
-	///
-	/// @tparam T Floating-point scalar types
-	/// @tparam Q Value from qualifier enum
-	///
-	/// @see ext_quaternion_relational
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<4, bool, Q> greaterThanEqual(qua<T, Q> const& x, qua<T, Q> const& y);
-
 	/// Returns the component-wise comparison of result x == y.
 	///
 	/// @tparam T Floating-point scalar types

+ 2 - 37
glm/ext/quaternion_relational.inl

@@ -1,43 +1,8 @@
-#include "../detail/compute_vector_relational.hpp"
+#include "./quaternion_geometric.hpp"
+#include "../vector_relational.hpp"
 
 namespace glm
 {
-	template<typename T, qualifier Q>
-	GLM_FUNC_QUALIFIER vec<4, bool, Q> lessThan(qua<T, Q> const& x, qua<T, Q> const& y)
-	{
-		vec<4, bool, Q> Result;
-		for(length_t i = 0; i < x.length(); ++i)
-			Result[i] = x[i] < y[i];
-		return Result;
-	}
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_QUALIFIER vec<4, bool, Q> lessThanEqual(qua<T, Q> const& x, qua<T, Q> const& y)
-	{
-		vec<4, bool, Q> Result;
-		for(length_t i = 0; i < x.length(); ++i)
-			Result[i] = x[i] <= y[i];
-		return Result;
-	}
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_QUALIFIER vec<4, bool, Q> greaterThan(qua<T, Q> const& x, qua<T, Q> const& y)
-	{
-		vec<4, bool, Q> Result;
-		for(length_t i = 0; i < x.length(); ++i)
-			Result[i] = x[i] > y[i];
-		return Result;
-	}
-
-	template<typename T, qualifier Q>
-	GLM_FUNC_QUALIFIER vec<4, bool, Q> greaterThanEqual(qua<T, Q> const& x, qua<T, Q> const& y)
-	{
-		vec<4, bool, Q> Result;
-		for(length_t i = 0; i < x.length(); ++i)
-			Result[i] = x[i] >= y[i];
-		return Result;
-	}
-
 	template<typename T, qualifier Q>
 	GLM_FUNC_QUALIFIER vec<4, bool, Q> equal(qua<T, Q> const& x, qua<T, Q> const& y)
 	{

+ 33 - 90
glm/gtc/quaternion.hpp

@@ -37,34 +37,6 @@ namespace glm
 	/// @addtogroup gtc_quaternion
 	/// @{
 
-	/// Builds an identity quaternion.
-	template<typename genType>
-	GLM_FUNC_DECL GLM_CONSTEXPR genType identity();
-
-	/// Returns the length of the quaternion.
-	///
-	/// @tparam T Floating-point scalar types.
-	///
-	/// @see gtc_quaternion
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL T length(qua<T, Q> const& q);
-
-	/// Returns the normalized quaternion.
-	///
-	/// @tparam T Floating-point scalar types.
-	///
-	/// @see gtc_quaternion
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL qua<T, Q> normalize(qua<T, Q> const& q);
-
-	/// Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ...
-	///
-	/// @tparam T Floating-point scalar types.
-	///
-	/// @see gtc_quaternion
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL T dot(qua<T, Q> const& x, qua<T, Q> const& y);
-
 	/// Spherical linear interpolation of two quaternions.
 	/// The interpolation is oriented and the rotation is performed at constant speed.
 	/// For short path spherical linear interpolation, use the slerp function.
@@ -221,96 +193,67 @@ namespace glm
 	template<typename T, qualifier Q>
 	GLM_FUNC_DECL qua<T, Q> angleAxis(T const& angle, vec<3, T, Q> const& axis);
 
-	/// Returns the component-wise comparison result of x < y.
-	///
-	/// @tparam T Floating-point scalar types.
-	///
-	/// @see gtc_quaternion
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<4, bool, Q> lessThan(qua<T, Q> const& x, qua<T, Q> const& y);
-
-	/// Returns the component-wise comparison of result x <= y.
-	///
-	/// @tparam T Floating-point scalar types.
-	///
-	/// @see gtc_quaternion
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<4, bool, Q> lessThanEqual(qua<T, Q> const& x, qua<T, Q> const& y);
-
-	/// Returns the component-wise comparison of result x > y.
-	///
-	/// @tparam T Floating-point scalar types.
-	///
-	/// @see gtc_quaternion
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<4, bool, Q> greaterThan(qua<T, Q> const& x, qua<T, Q> const& y);
-
-	/// Returns the component-wise comparison of result x >= y.
-	///
-	/// @tparam T Floating-point scalar types.
+	/// Returns true if x holds a NaN (not a number)
+	/// representation in the underlying implementation's set of
+	/// floating point representations. Returns false otherwise,
+	/// including for implementations with no NaN
+	/// representations.
 	///
-	/// @see gtc_quaternion
-	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<4, bool, Q> greaterThanEqual(qua<T, Q> const& x, qua<T, Q> const& y);
-
-	/// Returns the component-wise comparison of result x == y.
+	/// /!\ When using compiler fast math, this function may fail.
 	///
 	/// @tparam T Floating-point scalar types.
 	///
 	/// @see gtc_quaternion
 	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<4, bool, Q> equal(qua<T, Q> const& x, qua<T, Q> const& y);
+	GLM_FUNC_DECL vec<4, bool, Q> isnan(qua<T, Q> const& x);
 
-	/// Returns the component-wise comparison of |x - y| < epsilon.
+	/// Returns true if x holds a positive infinity or negative
+	/// infinity representation in the underlying implementation's
+	/// set of floating point representations. Returns false
+	/// otherwise, including for implementations with no infinity
+	/// representations.
 	///
 	/// @tparam T Floating-point scalar types.
 	///
 	/// @see gtc_quaternion
 	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<4, bool, Q> equal(qua<T, Q> const& x, qua<T, Q> const& y, T epsilon);
+	GLM_FUNC_DECL vec<4, bool, Q> isinf(qua<T, Q> const& x);
 
-	/// Returns the component-wise comparison of result x != y.
+	/// Returns the component-wise comparison result of x < y.
 	///
-	/// @tparam T Floating-point scalar types.
+	/// @tparam T Floating-point scalar types
+	/// @tparam Q Value from qualifier enum
 	///
-	/// @see gtc_quaternion
+	/// @see ext_quaternion_relational
 	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<4, bool, Q> notEqual(qua<T, Q> const& x, qua<T, Q> const& y);
+	GLM_FUNC_DECL vec<4, bool, Q> lessThan(qua<T, Q> const& x, qua<T, Q> const& y);
 
-	/// Returns the component-wise comparison of |x - y| >= epsilon.
+	/// Returns the component-wise comparison of result x <= y.
 	///
-	/// @tparam T Floating-point scalar types.
+	/// @tparam T Floating-point scalar types
+	/// @tparam Q Value from qualifier enum
 	///
-	/// @see gtc_quaternion
+	/// @see ext_quaternion_relational
 	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<4, bool, Q> notEqual(qua<T, Q> const& x, qua<T, Q> const& y, T epsilon);
-
+	GLM_FUNC_DECL vec<4, bool, Q> lessThanEqual(qua<T, Q> const& x, qua<T, Q> const& y);
 
-	/// Returns true if x holds a NaN (not a number)
-	/// representation in the underlying implementation's set of
-	/// floating point representations. Returns false otherwise,
-	/// including for implementations with no NaN
-	/// representations.
-	///
-	/// /!\ When using compiler fast math, this function may fail.
+	/// Returns the component-wise comparison of result x > y.
 	///
-	/// @tparam T Floating-point scalar types.
+	/// @tparam T Floating-point scalar types
+	/// @tparam Q Value from qualifier enum
 	///
-	/// @see gtc_quaternion
+	/// @see ext_quaternion_relational
 	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<4, bool, Q> isnan(qua<T, Q> const& x);
+	GLM_FUNC_DECL vec<4, bool, Q> greaterThan(qua<T, Q> const& x, qua<T, Q> const& y);
 
-	/// Returns true if x holds a positive infinity or negative
-	/// infinity representation in the underlying implementation's
-	/// set of floating point representations. Returns false
-	/// otherwise, including for implementations with no infinity
-	/// representations.
+	/// Returns the component-wise comparison of result x >= y.
 	///
-	/// @tparam T Floating-point scalar types.
+	/// @tparam T Floating-point scalar types
+	/// @tparam Q Value from qualifier enum
 	///
-	/// @see gtc_quaternion
+	/// @see ext_quaternion_relational
 	template<typename T, qualifier Q>
-	GLM_FUNC_DECL vec<4, bool, Q> isinf(qua<T, Q> const& x);
+	GLM_FUNC_DECL vec<4, bool, Q> greaterThanEqual(qua<T, Q> const& x, qua<T, Q> const& y);
 
 	/// @}
 } //namespace glm

+ 36 - 0
glm/gtc/quaternion.inl

@@ -336,6 +336,42 @@ namespace glm
 
 		return vec<4, bool, Q>(isinf(q.x), isinf(q.y), isinf(q.z), isinf(q.w));
 	}
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_QUALIFIER vec<4, bool, Q> lessThan(qua<T, Q> const& A, qua<T, Q> const& B)
+	{
+		vec<4, bool, Q> Result;
+		for(length_t i = 0; i < x.length(); ++i)
+			Result[i] = x[i] < y[i];
+		return Result;
+	}
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_QUALIFIER vec<4, bool, Q> lessThanEqual(qua<T, Q> const& x, qua<T, Q> const& y)
+	{
+		vec<4, bool, Q> Result;
+		for(length_t i = 0; i < x.length(); ++i)
+			Result[i] = x[i] <= y[i];
+		return Result;
+	}
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_QUALIFIER vec<4, bool, Q> greaterThan(qua<T, Q> const& x, qua<T, Q> const& y)
+	{
+		vec<4, bool, Q> Result;
+		for(length_t i = 0; i < x.length(); ++i)
+			Result[i] = x[i] > y[i];
+		return Result;
+	}
+
+	template<typename T, qualifier Q>
+	GLM_FUNC_QUALIFIER vec<4, bool, Q> greaterThanEqual(qua<T, Q> const& x, qua<T, Q> const& y)
+	{
+		vec<4, bool, Q> Result;
+		for(length_t i = 0; i < x.length(); ++i)
+			Result[i] = x[i] >= y[i];
+		return Result;
+	}
 }//namespace glm
 
 #if GLM_CONFIG_SIMD == GLM_ENABLE

+ 1 - 0
test/ext/CMakeLists.txt

@@ -1,4 +1,5 @@
 glmCreateTestGTC(ext_matrix_relational)
+glmCreateTestGTC(ext_quaternion_geometric)
 glmCreateTestGTC(ext_quaternion_relational)
 glmCreateTestGTC(ext_quaternion_type)
 glmCreateTestGTC(ext_scalar_relational)

+ 85 - 0
test/ext/ext_quaternion_geometric.cpp

@@ -0,0 +1,85 @@
+#include <glm/gtc/constants.hpp>
+#include <glm/ext/quaternion_geometric.hpp>
+#include <glm/ext/quaternion_float.hpp>
+#include <glm/ext/quaternion_float_precision.hpp>
+#include <glm/ext/quaternion_double.hpp>
+#include <glm/ext/quaternion_double_precision.hpp>
+#include <glm/ext/vector_float3.hpp>
+#include <glm/ext/vector_float3_precision.hpp>
+#include <glm/ext/vector_double3.hpp>
+#include <glm/ext/vector_double3_precision.hpp>
+#include <glm/ext/scalar_relational.hpp>
+
+#include <glm/gtc/quaternion.hpp>
+
+static int test_angle()
+{
+	int Error = 0;
+
+	{
+		glm::quat const Q = glm::quat(glm::vec3(1, 0, 0), glm::vec3(0, 1, 0));
+		float const A = glm::degrees(glm::angle(Q));
+		Error += glm::equal(A, 90.0f, glm::epsilon<float>()) ? 0 : 1;
+	}
+
+	{
+		glm::quat const Q = glm::quat(glm::vec3(0, 1, 0), glm::vec3(1, 0, 0));
+		float const A = glm::degrees(glm::angle(Q));
+		Error += glm::equal(A, 90.0f, glm::epsilon<float>()) ? 0 : 1;
+	}
+
+	return Error;
+}
+
+static int test_length()
+{
+	int Error = 0;
+
+	{
+		float const A = glm::length(glm::quat(1, 0, 0, 0));
+		Error += glm::equal(A, 1.0f, glm::epsilon<float>()) ? 0 : 1;
+	}
+
+	{
+		float const A = glm::length(glm::quat(1, glm::vec3(0)));
+		Error += glm::equal(A, 1.0f, glm::epsilon<float>()) ? 0 : 1;
+	}
+
+	{
+		float const A = glm::length(glm::quat(glm::vec3(1, 0, 0), glm::vec3(0, 1, 0)));
+		Error += glm::equal(A, 1.0f, glm::epsilon<float>()) ? 0 : 1;
+	}
+
+	return Error;
+}
+
+static int test_normalize()
+{
+	int Error = 0;
+
+	{
+		glm::quat const A = glm::quat(1, 0, 0, 0);
+		glm::quat const N = glm::normalize(A);
+		Error += glm::all(glm::equal(A, N, glm::epsilon<float>())) ? 0 : 1;
+	}
+
+	{
+		glm::quat const A = glm::quat(1, glm::vec3(0));
+		glm::quat const N = glm::normalize(A);
+		Error += glm::all(glm::equal(A, N, glm::epsilon<float>())) ? 0 : 1;
+	}
+
+	return Error;
+}
+
+
+int main()
+{
+	int Error = 0;
+
+	Error += test_angle();
+	Error += test_length();
+	Error += test_normalize();
+
+	return Error;
+}

+ 26 - 102
test/ext/ext_quaternion_relational.cpp

@@ -1,127 +1,51 @@
 #include <glm/gtc/constants.hpp>
-#include <glm/ext/vector_relational.hpp>
-#include <glm/ext/vector_float1.hpp>
-#include <glm/ext/vector_float1_precision.hpp>
-#include <glm/ext/vector_float2.hpp>
+#include <glm/ext/quaternion_relational.hpp>
+#include <glm/ext/quaternion_float.hpp>
+#include <glm/ext/quaternion_float_precision.hpp>
+#include <glm/ext/quaternion_double.hpp>
+#include <glm/ext/quaternion_double_precision.hpp>
 #include <glm/ext/vector_float3.hpp>
-#include <glm/ext/vector_float4.hpp>
+#include <glm/ext/vector_float3_precision.hpp>
+#include <glm/ext/vector_double3.hpp>
+#include <glm/ext/vector_double3_precision.hpp>
 
-template <typename genType>
-static int test_operators()
+template <typename quaType>
+static int test_equal()
 {
 	int Error = 0;
 
-	{
-		genType const A(1);
-		genType const B(1);
-
-		genType const C = A + B;
-		Error += glm::all(glm::equal(C, genType(2), glm::epsilon<float>())) ? 0 : 1;
-
-		genType const D = A - B;
-		Error += glm::all(glm::equal(D, genType(0), glm::epsilon<float>())) ? 0 : 1;
-
-		genType const E = A * B;
-		Error += glm::all(glm::equal(E, genType(1), glm::epsilon<float>())) ? 0 : 1;
-
-		genType const F = A / B;
-		Error += glm::all(glm::equal(F, genType(1), glm::epsilon<float>())) ? 0 : 1;
-	}
-
-	return Error;
-}
-
-template <typename genType>
-static int test_ctor()
-{
-	int Error = 0;
-
-	glm::vec1 const A = genType(1);
-
-	glm::vec1 const E(genType(1));
-	Error += glm::all(glm::equal(A, E, glm::epsilon<float>())) ? 0 : 1;
-
-	glm::vec1 const F(E);
-	Error += glm::all(glm::equal(A, F, glm::epsilon<float>())) ? 0 : 1;
-
-	genType const B = genType(1);
-	genType const G(glm::vec2(1));
-	Error += glm::all(glm::equal(B, G, glm::epsilon<float>())) ? 0 : 1;
-
-	genType const H(glm::vec3(1));
-	Error += glm::all(glm::equal(B, H, glm::epsilon<float>())) ? 0 : 1;
-
-	genType const I(glm::vec4(1));
-	Error += glm::all(glm::equal(B, I, glm::epsilon<float>())) ? 0 : 1;
+	quaType const Q(1, 0, 0, 0);
+	quaType const P(1, 0, 0, 0);
+	Error += glm::all(glm::equal(Q, P, glm::epsilon<float>())) ? 0 : 1;
 
 	return Error;
 }
 
-template <typename genType>
-static int test_size()
+template <typename quaType>
+static int test_notEqual()
 {
 	int Error = 0;
 
-	Error += sizeof(glm::vec1) == sizeof(genType) ? 0 : 1;
-	Error += genType().length() == 1 ? 0 : 1;
-	Error += genType::length() == 1 ? 0 : 1;
+	quaType const Q(1, 0, 0, 0);
+	quaType const P(1, 0, 0, 0);
+	Error += glm::any(glm::notEqual(Q, P, glm::epsilon<float>())) ? 1 : 0;
 
 	return Error;
 }
 
-template <typename genType>
-static int test_relational()
-{
-	int Error = 0;
-
-	genType const A(1);
-	genType const B(1);
-	genType const C(0);
-
-	Error += all(equal(A, B, glm::epsilon<float>())) ? 0 : 1;
-	Error += any(notEqual(A, C, glm::epsilon<float>())) ? 0 : 1;
-
-	return Error;
-}
-
-template <typename genType>
-static int test_constexpr()
-{
-#	if GLM_CONFIG_CONSTEXP == GLM_ENABLE
-		static_assert(genType::length() == 1, "GLM: Failed constexpr");
-#	endif
-
-	return 0;
-}
-
 int main()
 {
 	int Error = 0;
 
-	Error += test_operators<glm::vec1>();
-	Error += test_operators<glm::lowp_vec1>();
-	Error += test_operators<glm::mediump_vec1>();
-	Error += test_operators<glm::highp_vec1>();
-
-	Error += test_ctor<glm::vec1>();
-	Error += test_ctor<glm::lowp_vec1>();
-	Error += test_ctor<glm::mediump_vec1>();
-	Error += test_ctor<glm::highp_vec1>();
-
-	Error += test_size<glm::vec1>();
-	Error += test_size<glm::lowp_vec1>();
-	Error += test_size<glm::mediump_vec1>();
-	Error += test_size<glm::highp_vec1>();
-
-	Error += test_relational<glm::vec1>();
-	Error += test_relational<glm::lowp_vec1>();
-	Error += test_relational<glm::mediump_vec1>();
-	Error += test_relational<glm::highp_vec1>();
+	Error += test_equal<glm::quat>();
+	Error += test_equal<glm::lowp_quat>();
+	Error += test_equal<glm::mediump_quat>();
+	Error += test_equal<glm::highp_quat>();
 
-	Error += test_constexpr<glm::vec1>();
-	Error += test_constexpr<glm::lowp_vec1>();
-	Error += test_constexpr<glm::mediump_vec1>();
-	Error += test_constexpr<glm::highp_vec1>();
+	Error += test_notEqual<glm::quat>();
+	Error += test_notEqual<glm::lowp_quat>();
+	Error += test_notEqual<glm::mediump_quat>();
+	Error += test_notEqual<glm::highp_quat>();
 
 	return Error;
 }