• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1///////////////////////////////////////////////////////////////////////////////////////////////////
2// OpenGL Mathematics Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
3///////////////////////////////////////////////////////////////////////////////////////////////////
4// Created : 2006-11-02
5// Updated : 2009-02-19
6// Licence : This source is under MIT License
7// File    : glm/gtx/rotate_vector.inl
8///////////////////////////////////////////////////////////////////////////////////////////////////
9
10namespace glm
11{
12	template <typename T, precision P>
13	GLM_FUNC_QUALIFIER detail::tvec2<T, P> rotate
14	(
15		detail::tvec2<T, P> const & v,
16		T const & angle
17	)
18	{
19		detail::tvec2<T, P> Result;
20#ifdef GLM_FORCE_RADIANS
21		T const Cos(cos(angle));
22		T const Sin(sin(angle));
23#else
24#		pragma message("GLM: rotate function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.")
25		T const Cos = cos(radians(angle));
26		T const Sin = sin(radians(angle));
27#endif
28		Result.x = v.x * Cos - v.y * Sin;
29		Result.y = v.x * Sin + v.y * Cos;
30		return Result;
31	}
32
33	template <typename T, precision P>
34	GLM_FUNC_QUALIFIER detail::tvec3<T, P> rotate
35	(
36		detail::tvec3<T, P> const & v,
37		T const & angle,
38		detail::tvec3<T, P> const & normal
39	)
40	{
41		return detail::tmat3x3<T, P>(glm::rotate(angle, normal)) * v;
42	}
43	/*
44	template <typename T, precision P>
45	GLM_FUNC_QUALIFIER detail::tvec3<T, P> rotateGTX(
46		const detail::tvec3<T, P>& x,
47		T angle,
48		const detail::tvec3<T, P>& normal)
49	{
50		const T Cos = cos(radians(angle));
51		const T Sin = sin(radians(angle));
52		return x * Cos + ((x * normal) * (T(1) - Cos)) * normal + cross(x, normal) * Sin;
53	}
54	*/
55	template <typename T, precision P>
56	GLM_FUNC_QUALIFIER detail::tvec4<T, P> rotate
57	(
58		detail::tvec4<T, P> const & v,
59		T const & angle,
60		detail::tvec3<T, P> const & normal
61	)
62	{
63		return rotate(angle, normal) * v;
64	}
65
66	template <typename T, precision P>
67	GLM_FUNC_QUALIFIER detail::tvec3<T, P> rotateX
68	(
69		detail::tvec3<T, P> const & v,
70		T const & angle
71	)
72	{
73		detail::tvec3<T, P> Result(v);
74
75#ifdef GLM_FORCE_RADIANS
76		T const Cos(cos(angle));
77		T const Sin(sin(angle));
78#else
79#		pragma message("GLM: rotateX function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.")
80		T const Cos = cos(radians(angle));
81		T const Sin = sin(radians(angle));
82#endif
83
84		Result.y = v.y * Cos - v.z * Sin;
85		Result.z = v.y * Sin + v.z * Cos;
86		return Result;
87	}
88
89	template <typename T, precision P>
90	GLM_FUNC_QUALIFIER detail::tvec3<T, P> rotateY
91	(
92		detail::tvec3<T, P> const & v,
93		T const & angle
94	)
95	{
96		detail::tvec3<T, P> Result = v;
97
98#ifdef GLM_FORCE_RADIANS
99		T const Cos(cos(angle));
100		T const Sin(sin(angle));
101#else
102#		pragma message("GLM: rotateY function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.")
103		T const Cos(cos(radians(angle)));
104		T const Sin(sin(radians(angle)));
105#endif
106
107		Result.x =  v.x * Cos + v.z * Sin;
108		Result.z = -v.x * Sin + v.z * Cos;
109		return Result;
110	}
111
112	template <typename T, precision P>
113	GLM_FUNC_QUALIFIER detail::tvec3<T, P> rotateZ
114	(
115		detail::tvec3<T, P> const & v,
116		T const & angle
117	)
118	{
119		detail::tvec3<T, P> Result = v;
120
121#ifdef GLM_FORCE_RADIANS
122		T const Cos(cos(angle));
123		T const Sin(sin(angle));
124#else
125#		pragma message("GLM: rotateZ function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.")
126		T const Cos(cos(radians(angle)));
127		T const Sin(sin(radians(angle)));
128#endif
129
130		Result.x = v.x * Cos - v.y * Sin;
131		Result.y = v.x * Sin + v.y * Cos;
132		return Result;
133	}
134
135	template <typename T, precision P>
136	GLM_FUNC_QUALIFIER detail::tvec4<T, P> rotateX
137	(
138		detail::tvec4<T, P> const & v,
139		T const & angle
140	)
141	{
142		detail::tvec4<T, P> Result = v;
143
144#ifdef GLM_FORCE_RADIANS
145		T const Cos(cos(angle));
146		T const Sin(sin(angle));
147#else
148#		pragma message("GLM: rotateX function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.")
149		T const Cos(cos(radians(angle)));
150		T const Sin(sin(radians(angle)));
151#endif
152
153		Result.y = v.y * Cos - v.z * Sin;
154		Result.z = v.y * Sin + v.z * Cos;
155		return Result;
156	}
157
158	template <typename T, precision P>
159	GLM_FUNC_QUALIFIER detail::tvec4<T, P> rotateY
160	(
161		detail::tvec4<T, P> const & v,
162		T const & angle
163	)
164	{
165		detail::tvec4<T, P> Result = v;
166
167#ifdef GLM_FORCE_RADIANS
168		T const Cos(cos(angle));
169		T const Sin(sin(angle));
170#else
171#		pragma message("GLM: rotateX function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.")
172		T const Cos(cos(radians(angle)));
173		T const Sin(sin(radians(angle)));
174#endif
175
176		Result.x =  v.x * Cos + v.z * Sin;
177		Result.z = -v.x * Sin + v.z * Cos;
178		return Result;
179	}
180
181	template <typename T, precision P>
182	GLM_FUNC_QUALIFIER detail::tvec4<T, P> rotateZ
183	(
184		detail::tvec4<T, P> const & v,
185		T const & angle
186	)
187	{
188		detail::tvec4<T, P> Result = v;
189
190#ifdef GLM_FORCE_RADIANS
191		T const Cos(cos(angle));
192		T const Sin(sin(angle));
193#else
194#		pragma message("GLM: rotateZ function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.")
195		T const Cos(cos(radians(angle)));
196		T const Sin(sin(radians(angle)));
197#endif
198
199		Result.x = v.x * Cos - v.y * Sin;
200		Result.y = v.x * Sin + v.y * Cos;
201		return Result;
202	}
203
204	template <typename T, precision P>
205	GLM_FUNC_QUALIFIER detail::tmat4x4<T, P> orientation
206	(
207		detail::tvec3<T, P> const & Normal,
208		detail::tvec3<T, P> const & Up
209	)
210	{
211		if(all(equal(Normal, Up)))
212			return detail::tmat4x4<T, P>(T(1));
213
214		detail::tvec3<T, P> RotationAxis = cross(Up, Normal);
215#		ifdef GLM_FORCE_RADIANS
216			T Angle = acos(dot(Normal, Up));
217#		else
218#			pragma message("GLM: rotateZ function taking degrees as parameters is deprecated. #define GLM_FORCE_RADIANS before including GLM headers to remove this message.")
219			T Angle = degrees(acos(dot(Normal, Up)));
220#		endif
221		return rotate(Angle, RotationAxis);
222	}
223}//namespace glm
224