| /////////////////////////////////////////////////////////////////////////////////////////////////// |
| // OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net) |
| /////////////////////////////////////////////////////////////////////////////////////////////////// |
| // Created : 2006-11-02 |
| // Updated : 2009-02-19 |
| // Licence : This source is under MIT License |
| // File : glm/gtx/rotate_vector.inl |
| /////////////////////////////////////////////////////////////////////////////////////////////////// |
| |
| namespace glm |
| { |
| template <typename T, precision P> |
| GLM_FUNC_QUALIFIER detail::tvec2<T, P> rotate |
| ( |
| detail::tvec2<T, P> const & v, |
| T const & angle |
| ) |
| { |
| detail::tvec2<T, P> Result; |
| #ifdef GLM_FORCE_RADIANS |
| T const Cos(cos(angle)); |
| T const Sin(sin(angle)); |
| #else |
| # pragma message("GLM: rotate function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.") |
| T const Cos = cos(radians(angle)); |
| T const Sin = sin(radians(angle)); |
| #endif |
| Result.x = v.x * Cos - v.y * Sin; |
| Result.y = v.x * Sin + v.y * Cos; |
| return Result; |
| } |
| |
| template <typename T, precision P> |
| GLM_FUNC_QUALIFIER detail::tvec3<T, P> rotate |
| ( |
| detail::tvec3<T, P> const & v, |
| T const & angle, |
| detail::tvec3<T, P> const & normal |
| ) |
| { |
| return detail::tmat3x3<T, P>(glm::rotate(angle, normal)) * v; |
| } |
| /* |
| template <typename T, precision P> |
| GLM_FUNC_QUALIFIER detail::tvec3<T, P> rotateGTX( |
| const detail::tvec3<T, P>& x, |
| T angle, |
| const detail::tvec3<T, P>& normal) |
| { |
| const T Cos = cos(radians(angle)); |
| const T Sin = sin(radians(angle)); |
| return x * Cos + ((x * normal) * (T(1) - Cos)) * normal + cross(x, normal) * Sin; |
| } |
| */ |
| template <typename T, precision P> |
| GLM_FUNC_QUALIFIER detail::tvec4<T, P> rotate |
| ( |
| detail::tvec4<T, P> const & v, |
| T const & angle, |
| detail::tvec3<T, P> const & normal |
| ) |
| { |
| return rotate(angle, normal) * v; |
| } |
| |
| template <typename T, precision P> |
| GLM_FUNC_QUALIFIER detail::tvec3<T, P> rotateX |
| ( |
| detail::tvec3<T, P> const & v, |
| T const & angle |
| ) |
| { |
| detail::tvec3<T, P> Result(v); |
| |
| #ifdef GLM_FORCE_RADIANS |
| T const Cos(cos(angle)); |
| T const Sin(sin(angle)); |
| #else |
| # pragma message("GLM: rotateX function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.") |
| T const Cos = cos(radians(angle)); |
| T const Sin = sin(radians(angle)); |
| #endif |
| |
| Result.y = v.y * Cos - v.z * Sin; |
| Result.z = v.y * Sin + v.z * Cos; |
| return Result; |
| } |
| |
| template <typename T, precision P> |
| GLM_FUNC_QUALIFIER detail::tvec3<T, P> rotateY |
| ( |
| detail::tvec3<T, P> const & v, |
| T const & angle |
| ) |
| { |
| detail::tvec3<T, P> Result = v; |
| |
| #ifdef GLM_FORCE_RADIANS |
| T const Cos(cos(angle)); |
| T const Sin(sin(angle)); |
| #else |
| # pragma message("GLM: rotateY function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.") |
| T const Cos(cos(radians(angle))); |
| T const Sin(sin(radians(angle))); |
| #endif |
| |
| Result.x = v.x * Cos + v.z * Sin; |
| Result.z = -v.x * Sin + v.z * Cos; |
| return Result; |
| } |
| |
| template <typename T, precision P> |
| GLM_FUNC_QUALIFIER detail::tvec3<T, P> rotateZ |
| ( |
| detail::tvec3<T, P> const & v, |
| T const & angle |
| ) |
| { |
| detail::tvec3<T, P> Result = v; |
| |
| #ifdef GLM_FORCE_RADIANS |
| T const Cos(cos(angle)); |
| T const Sin(sin(angle)); |
| #else |
| # pragma message("GLM: rotateZ function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.") |
| T const Cos(cos(radians(angle))); |
| T const Sin(sin(radians(angle))); |
| #endif |
| |
| Result.x = v.x * Cos - v.y * Sin; |
| Result.y = v.x * Sin + v.y * Cos; |
| return Result; |
| } |
| |
| template <typename T, precision P> |
| GLM_FUNC_QUALIFIER detail::tvec4<T, P> rotateX |
| ( |
| detail::tvec4<T, P> const & v, |
| T const & angle |
| ) |
| { |
| detail::tvec4<T, P> Result = v; |
| |
| #ifdef GLM_FORCE_RADIANS |
| T const Cos(cos(angle)); |
| T const Sin(sin(angle)); |
| #else |
| # pragma message("GLM: rotateX function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.") |
| T const Cos(cos(radians(angle))); |
| T const Sin(sin(radians(angle))); |
| #endif |
| |
| Result.y = v.y * Cos - v.z * Sin; |
| Result.z = v.y * Sin + v.z * Cos; |
| return Result; |
| } |
| |
| template <typename T, precision P> |
| GLM_FUNC_QUALIFIER detail::tvec4<T, P> rotateY |
| ( |
| detail::tvec4<T, P> const & v, |
| T const & angle |
| ) |
| { |
| detail::tvec4<T, P> Result = v; |
| |
| #ifdef GLM_FORCE_RADIANS |
| T const Cos(cos(angle)); |
| T const Sin(sin(angle)); |
| #else |
| # pragma message("GLM: rotateX function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.") |
| T const Cos(cos(radians(angle))); |
| T const Sin(sin(radians(angle))); |
| #endif |
| |
| Result.x = v.x * Cos + v.z * Sin; |
| Result.z = -v.x * Sin + v.z * Cos; |
| return Result; |
| } |
| |
| template <typename T, precision P> |
| GLM_FUNC_QUALIFIER detail::tvec4<T, P> rotateZ |
| ( |
| detail::tvec4<T, P> const & v, |
| T const & angle |
| ) |
| { |
| detail::tvec4<T, P> Result = v; |
| |
| #ifdef GLM_FORCE_RADIANS |
| T const Cos(cos(angle)); |
| T const Sin(sin(angle)); |
| #else |
| # pragma message("GLM: rotateZ function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.") |
| T const Cos(cos(radians(angle))); |
| T const Sin(sin(radians(angle))); |
| #endif |
| |
| Result.x = v.x * Cos - v.y * Sin; |
| Result.y = v.x * Sin + v.y * Cos; |
| return Result; |
| } |
| |
| template <typename T, precision P> |
| GLM_FUNC_QUALIFIER detail::tmat4x4<T, P> orientation |
| ( |
| detail::tvec3<T, P> const & Normal, |
| detail::tvec3<T, P> const & Up |
| ) |
| { |
| if(all(equal(Normal, Up))) |
| return detail::tmat4x4<T, P>(T(1)); |
| |
| detail::tvec3<T, P> RotationAxis = cross(Up, Normal); |
| # ifdef GLM_FORCE_RADIANS |
| T Angle = acos(dot(Normal, Up)); |
| # else |
| # pragma message("GLM: rotateZ function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.") |
| T Angle = degrees(acos(dot(Normal, Up))); |
| # endif |
| return rotate(Angle, RotationAxis); |
| } |
| }//namespace glm |