From 1e69dfe30e66683778f1e8f941f9a42f7d228b16 Mon Sep 17 00:00:00 2001 From: Christophe Riccio Date: Sun, 22 Sep 2013 23:37:55 +0200 Subject: [PATCH] Added a quation constructor taking two axis --- glm/gtc/quaternion.hpp | 11 +++++++- glm/gtc/quaternion.inl | 12 +++++++++ readme.txt | 1 + test/core/core_func_common.cpp | 46 +++++++++++++++++----------------- test/gtx/gtx_euler_angle.cpp | 6 ++--- 5 files changed, 49 insertions(+), 27 deletions(-) diff --git a/glm/gtc/quaternion.hpp b/glm/gtc/quaternion.hpp index ab30875f..e2ef6176 100644 --- a/glm/gtc/quaternion.hpp +++ b/glm/gtc/quaternion.hpp @@ -70,7 +70,7 @@ namespace detail tquat const & q); GLM_FUNC_DECL explicit tquat( T const & s, - glm::detail::tvec3 const & v); + tvec3 const & v); GLM_FUNC_DECL explicit tquat( T const & w, T const & x, @@ -79,6 +79,15 @@ namespace detail // Convertions + /// Create a quaternion from two normalized axis + /// + /// @param u A first normalized axis + /// @param v A second normalized axis + /// @see gtc_quaternion + /// @see http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors + GLM_FUNC_DECL explicit tquat( + detail::tvec3 const & u, + detail::tvec3 const & v); /// Build a quaternion from euler angles (pitch, yaw, roll), in radians. GLM_FUNC_DECL explicit tquat( tvec3 const & eulerAngles); diff --git a/glm/gtc/quaternion.inl b/glm/gtc/quaternion.inl index cce0333c..197dc6eb 100644 --- a/glm/gtc/quaternion.inl +++ b/glm/gtc/quaternion.inl @@ -104,6 +104,18 @@ namespace detail // this->z = c.x * c.y * s.z - s.x * s.y * c.z; //} + template + GLM_FUNC_QUALIFIER tquat::tquat + ( + detail::tvec3 const & u, + detail::tvec3 const & v + ) + { + detail::tvec3 w = cross(u, v); + detail::tquat q(T(1) + dot(u, v), w.x, w.y, w.z); + *this = normalize(q); + } + template GLM_FUNC_QUALIFIER tquat::tquat ( diff --git a/readme.txt b/readme.txt index 9615c34e..a392c6ca 100644 --- a/readme.txt +++ b/readme.txt @@ -65,6 +65,7 @@ GLM 0.9.5.0: 2013-XX-XX - Replaced GLM traits by STL traits when possible - Allowed including individual core feature - Increased unit tests completness +- Added creating of a quaternion from two vectors ================================================================================ GLM 0.9.4.6: 2013-09-20 diff --git a/test/core/core_func_common.cpp b/test/core/core_func_common.cpp index 4de6d179..43d02378 100644 --- a/test/core/core_func_common.cpp +++ b/test/core/core_func_common.cpp @@ -577,17 +577,17 @@ int test_isnan() double Zero_d = 0.0; { - Error += true == glm::isnan(0.0/Zero_d) ? 0 : 1; - Error += true == glm::any(glm::isnan(glm::dvec2(0.0 / Zero_d))) ? 0 : 1; - Error += true == glm::any(glm::isnan(glm::dvec3(0.0 / Zero_d))) ? 0 : 1; - Error += true == glm::any(glm::isnan(glm::dvec4(0.0 / Zero_d))) ? 0 : 1; + Error += true == glm::isnan(0.0/Zero_d) ? 0 : 1; + Error += true == glm::any(glm::isnan(glm::dvec2(0.0 / Zero_d))) ? 0 : 1; + Error += true == glm::any(glm::isnan(glm::dvec3(0.0 / Zero_d))) ? 0 : 1; + Error += true == glm::any(glm::isnan(glm::dvec4(0.0 / Zero_d))) ? 0 : 1; } { - Error += true == glm::isnan(0.0f/Zero_f) ? 0 : 1; - Error += true == glm::any(glm::isnan(glm::vec2(0.0f/Zero_f))) ? 0 : 1; - Error += true == glm::any(glm::isnan(glm::vec3(0.0f/Zero_f))) ? 0 : 1; - Error += true == glm::any(glm::isnan(glm::vec4(0.0f/Zero_f))) ? 0 : 1; + Error += true == glm::isnan(0.0f/Zero_f) ? 0 : 1; + Error += true == glm::any(glm::isnan(glm::vec2(0.0f/Zero_f))) ? 0 : 1; + Error += true == glm::any(glm::isnan(glm::vec3(0.0f/Zero_f))) ? 0 : 1; + Error += true == glm::any(glm::isnan(glm::vec4(0.0f/Zero_f))) ? 0 : 1; } return Error; @@ -601,25 +601,25 @@ int test_isinf() double Zero_d = 0.0; { - Error += true == glm::isinf( 1.0/Zero_d) ? 0 : 1; + Error += true == glm::isinf( 1.0/Zero_d) ? 0 : 1; Error += true == glm::isinf(-1.0/Zero_d) ? 0 : 1; - Error += true == glm::any(glm::isinf(glm::dvec2( 1.0/Zero_d))) ? 0 : 1; - Error += true == glm::any(glm::isinf(glm::dvec2(-1.0/Zero_d))) ? 0 : 1; - Error += true == glm::any(glm::isinf(glm::dvec3( 1.0/Zero_d))) ? 0 : 1; - Error += true == glm::any(glm::isinf(glm::dvec3(-1.0/Zero_d))) ? 0 : 1; - Error += true == glm::any(glm::isinf(glm::dvec4( 1.0/Zero_d))) ? 0 : 1; - Error += true == glm::any(glm::isinf(glm::dvec4(-1.0/Zero_d))) ? 0 : 1; + Error += true == glm::any(glm::isinf(glm::dvec2( 1.0/Zero_d))) ? 0 : 1; + Error += true == glm::any(glm::isinf(glm::dvec2(-1.0/Zero_d))) ? 0 : 1; + Error += true == glm::any(glm::isinf(glm::dvec3( 1.0/Zero_d))) ? 0 : 1; + Error += true == glm::any(glm::isinf(glm::dvec3(-1.0/Zero_d))) ? 0 : 1; + Error += true == glm::any(glm::isinf(glm::dvec4( 1.0/Zero_d))) ? 0 : 1; + Error += true == glm::any(glm::isinf(glm::dvec4(-1.0/Zero_d))) ? 0 : 1; } { - Error += true == glm::isinf( 1.0f/Zero_f) ? 0 : 1; - Error += true == glm::isinf(-1.0f/Zero_f) ? 0 : 1; - Error += true == glm::any(glm::isinf(glm::vec2( 1.0f/Zero_f))) ? 0 : 1; - Error += true == glm::any(glm::isinf(glm::vec2(-1.0f/Zero_f))) ? 0 : 1; - Error += true == glm::any(glm::isinf(glm::vec3( 1.0f/Zero_f))) ? 0 : 1; - Error += true == glm::any(glm::isinf(glm::vec3(-1.0f/Zero_f))) ? 0 : 1; - Error += true == glm::any(glm::isinf(glm::vec4( 1.0f/Zero_f))) ? 0 : 1; - Error += true == glm::any(glm::isinf(glm::vec4(-1.0f/Zero_f))) ? 0 : 1; + Error += true == glm::isinf( 1.0f/Zero_f) ? 0 : 1; + Error += true == glm::isinf(-1.0f/Zero_f) ? 0 : 1; + Error += true == glm::any(glm::isinf(glm::vec2( 1.0f/Zero_f))) ? 0 : 1; + Error += true == glm::any(glm::isinf(glm::vec2(-1.0f/Zero_f))) ? 0 : 1; + Error += true == glm::any(glm::isinf(glm::vec3( 1.0f/Zero_f))) ? 0 : 1; + Error += true == glm::any(glm::isinf(glm::vec3(-1.0f/Zero_f))) ? 0 : 1; + Error += true == glm::any(glm::isinf(glm::vec4( 1.0f/Zero_f))) ? 0 : 1; + Error += true == glm::any(glm::isinf(glm::vec4(-1.0f/Zero_f))) ? 0 : 1; } return Error; diff --git a/test/gtx/gtx_euler_angle.cpp b/test/gtx/gtx_euler_angle.cpp index a63a85ba..037ef675 100644 --- a/test/gtx/gtx_euler_angle.cpp +++ b/test/gtx/gtx_euler_angle.cpp @@ -11,9 +11,9 @@ using namespace glm; int main() { - f32 first = 1.046 ; - f32 second = 0.52 ; - f32 third = -0.785; + f32 first = 1.046f; + f32 second = 0.52f; + f32 third = -0.785f; fmat4 rotationEuler = eulerAngleYXZ(first, second, third);