/////////////////////////////////////////////////////////////////////////////////////////////////// // OpenGL Mathematics Copyright (c) 2005 - 2011 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{ namespace gtx{ namespace rotate_vector { template GLM_FUNC_QUALIFIER detail::tvec2 rotate( detail::tvec2 const & v, T const & angle) { detail::tvec2 Result; const T Cos = cos(radians(angle)); const T Sin = sin(radians(angle)); Result.x = v.x * Cos - v.y * Sin; Result.y = v.x * Sin + v.y * Cos; return Result; } template GLM_FUNC_QUALIFIER detail::tvec3 rotate( const detail::tvec3 & v, T const & angle, const detail::tvec3 & normal) { return detail::tmat3x3(glm::gtx::transform::rotate(angle, normal)) * v; } /* template GLM_FUNC_QUALIFIER detail::tvec3 rotateGTX( const detail::tvec3& x, T angle, const detail::tvec3& 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 GLM_FUNC_QUALIFIER detail::tvec4 rotate( detail::tvec4 const & v, T const & angle, detail::tvec3 const & normal) { return glm::gtx::transform::rotate(angle, normal) * v; } template GLM_FUNC_QUALIFIER detail::tvec3 rotateX( detail::tvec3 const & v, T const & angle) { detail::tvec3 Result = v; const T Cos = cos(radians(angle)); const T Sin = sin(radians(angle)); Result.y = v.y * Cos - v.z * Sin; Result.z = v.y * Sin + v.z * Cos; return Result; } template GLM_FUNC_QUALIFIER detail::tvec3 rotateY( detail::tvec3 const & v, T const & angle) { detail::tvec3 Result = v; const T Cos = cos(radians(angle)); const T Sin = sin(radians(angle)); Result.x = v.x * Cos + v.z * Sin; Result.z = -v.x * Sin + v.z * Cos; return Result; } template GLM_FUNC_QUALIFIER detail::tvec3 rotateZ( detail::tvec3 const & v, T const & angle) { detail::tvec3 Result = v; const T Cos = cos(radians(angle)); const T Sin = sin(radians(angle)); Result.x = v.x * Cos - v.y * Sin; Result.y = v.x * Sin + v.y * Cos; return Result; } template GLM_FUNC_QUALIFIER detail::tvec4 rotateX( detail::tvec4 const & v, T const & angle) { detail::tvec4 Result = v; const T Cos = cos(radians(angle)); const T Sin = sin(radians(angle)); Result.y = v.y * Cos - v.z * Sin; Result.z = v.y * Sin + v.z * Cos; return Result; } template GLM_FUNC_QUALIFIER detail::tvec4 rotateY( detail::tvec4 const & v, T const & angle) { detail::tvec4 Result = v; const T Cos = cos(radians(angle)); const T Sin = sin(radians(angle)); Result.x = v.x * Cos + v.z * Sin; Result.z = -v.x * Sin + v.z * Cos; return Result; } template GLM_FUNC_QUALIFIER detail::tvec4 rotateZ( detail::tvec4 const & v, T const & angle) { detail::tvec4 Result = v; const T Cos = cos(radians(angle)); const T Sin = sin(radians(angle)); Result.x = v.x * Cos - v.y * Sin; Result.y = v.x * Sin + v.y * Cos; return Result; } template GLM_FUNC_QUALIFIER detail::tmat4x4 orientation( detail::tvec3 const & Normal, detail::tvec3 const & Up) { if(all(equal(Normal, Up))) return detail::tmat4x4(T(1)); detail::tvec3 RotationAxis = cross(Up, Normal); T Angle = degrees(acos(dot(Normal, Up))); return glm::gtx::transform::rotate(Angle, RotationAxis); } }//namespace rotate_vector }//namespace gtx }//namespace glm