diff options
Diffstat (limited to 'include/gal/opengl/glm/gtx/rotate_vector.inl')
-rw-r--r-- | include/gal/opengl/glm/gtx/rotate_vector.inl | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/include/gal/opengl/glm/gtx/rotate_vector.inl b/include/gal/opengl/glm/gtx/rotate_vector.inl new file mode 100644 index 0000000..1ec1717 --- /dev/null +++ b/include/gal/opengl/glm/gtx/rotate_vector.inl @@ -0,0 +1,215 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 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> + GLM_FUNC_QUALIFIER detail::tvec2<T> rotate + ( + detail::tvec2<T> const & v, + T const & angle + ) + { + detail::tvec2<T> Result; +#ifdef GLM_FORCE_RADIANS + T const Cos(cos(angle)); + T const Sin(sin(angle)); +#else + 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> + GLM_FUNC_QUALIFIER detail::tvec3<T> rotate + ( + detail::tvec3<T> const & v, + T const & angle, + detail::tvec3<T> const & normal + ) + { + return detail::tmat3x3<T>(glm::rotate(angle, normal)) * v; + } + /* + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> rotateGTX( + const detail::tvec3<T>& x, + T angle, + const detail::tvec3<T>& 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> + GLM_FUNC_QUALIFIER detail::tvec4<T> rotate + ( + detail::tvec4<T> const & v, + T const & angle, + detail::tvec3<T> const & normal + ) + { + return rotate(angle, normal) * v; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> rotateX + ( + detail::tvec3<T> const & v, + T const & angle + ) + { + detail::tvec3<T> Result(v); + +#ifdef GLM_FORCE_RADIANS + T const Cos(cos(angle)); + T const Sin(sin(angle)); +#else + 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> + GLM_FUNC_QUALIFIER detail::tvec3<T> rotateY + ( + detail::tvec3<T> const & v, + T const & angle + ) + { + detail::tvec3<T> Result = v; + +#ifdef GLM_FORCE_RADIANS + T const Cos(cos(angle)); + T const Sin(sin(angle)); +#else + 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> + GLM_FUNC_QUALIFIER detail::tvec3<T> rotateZ + ( + detail::tvec3<T> const & v, + T const & angle + ) + { + detail::tvec3<T> Result = v; + +#ifdef GLM_FORCE_RADIANS + T const Cos(cos(angle)); + T const Sin(sin(angle)); +#else + 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> + GLM_FUNC_QUALIFIER detail::tvec4<T> rotateX + ( + detail::tvec4<T> const & v, + T const & angle + ) + { + detail::tvec4<T> Result = v; + +#ifdef GLM_FORCE_RADIANS + T const Cos(cos(angle)); + T const Sin(sin(angle)); +#else + 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> + GLM_FUNC_QUALIFIER detail::tvec4<T> rotateY + ( + detail::tvec4<T> const & v, + T const & angle + ) + { + detail::tvec4<T> Result = v; + +#ifdef GLM_FORCE_RADIANS + T const Cos(cos(angle)); + T const Sin(sin(angle)); +#else + 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> + GLM_FUNC_QUALIFIER detail::tvec4<T> rotateZ + ( + detail::tvec4<T> const & v, + T const & angle + ) + { + detail::tvec4<T> Result = v; + +#ifdef GLM_FORCE_RADIANS + T const Cos(cos(angle)); + T const Sin(sin(angle)); +#else + 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> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> orientation + ( + detail::tvec3<T> const & Normal, + detail::tvec3<T> const & Up + ) + { + if(all(equal(Normal, Up))) + return detail::tmat4x4<T>(T(1)); + + detail::tvec3<T> RotationAxis = cross(Up, Normal); +# ifdef GLM_FORCE_RADIANS + T Angle = acos(dot(Normal, Up)); +# else + T Angle = degrees(acos(dot(Normal, Up))); +# endif + return rotate(Angle, RotationAxis); + } +}//namespace glm |