transfer from internal tree r5311 branches/1.4-gpl
[xonotic/netradiant.git] / libs / splines / math_quaternion.h
1 /*\r
2 Copyright (C) 1999-2007 id Software, Inc. and contributors.\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.\r
4 \r
5 This file is part of GtkRadiant.\r
6 \r
7 GtkRadiant is free software; you can redistribute it and/or modify\r
8 it under the terms of the GNU General Public License as published by\r
9 the Free Software Foundation; either version 2 of the License, or\r
10 (at your option) any later version.\r
11 \r
12 GtkRadiant is distributed in the hope that it will be useful,\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15 GNU General Public License for more details.\r
16 \r
17 You should have received a copy of the GNU General Public License\r
18 along with GtkRadiant; if not, write to the Free Software\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
20 */\r
21 \r
22 #ifndef __MATH_QUATERNION_H__\r
23 #define __MATH_QUATERNION_H__\r
24 \r
25 #include <assert.h>\r
26 #include <math.h>\r
27 \r
28 class idVec3_t;\r
29 class angles_t;\r
30 class mat3_t;\r
31 \r
32 class quat_t {\r
33 public:\r
34         float                   x;\r
35         float                   y;\r
36         float                   z;\r
37         float                   w;\r
38 \r
39                                         quat_t();\r
40                                         quat_t( float x, float y, float z, float w );\r
41 \r
42         friend void             toQuat( idVec3_t &src, quat_t &dst );\r
43         friend void             toQuat( angles_t &src, quat_t &dst );\r
44         friend void             toQuat( mat3_t &src, quat_t &dst );\r
45 \r
46         float                   *vec4( void );\r
47                         \r
48         float                   operator[]( int index ) const;\r
49         float                   &operator[]( int index );\r
50 \r
51         void                    set( float x, float y, float z, float w );\r
52 \r
53         void                    operator=( quat_t a );\r
54 \r
55         friend quat_t   operator+( quat_t a, quat_t b );\r
56         quat_t                  &operator+=( quat_t a );\r
57 \r
58         friend quat_t   operator-( quat_t a, quat_t b );\r
59         quat_t                  &operator-=( quat_t a );\r
60 \r
61         friend quat_t   operator*( quat_t a, float b );\r
62         friend quat_t   operator*( float a, quat_t b );\r
63         quat_t                  &operator*=( float a );\r
64 \r
65         friend int              operator==(     quat_t a, quat_t b );\r
66         friend int              operator!=(     quat_t a, quat_t b );\r
67 \r
68         float                   Length( void );\r
69         quat_t                  &Normalize( void );\r
70 \r
71         quat_t                  operator-();\r
72 };\r
73 \r
74 inline quat_t::quat_t() {\r
75 }\r
76 \r
77 inline quat_t::quat_t( float x, float y, float z, float w ) {\r
78         this->x = x;\r
79         this->y = y;\r
80         this->z = z;\r
81         this->w = w;\r
82 }\r
83 \r
84 inline float *quat_t::vec4( void ) {\r
85         return &x;\r
86 }\r
87 \r
88 inline float quat_t::operator[]( int index ) const {\r
89         assert( ( index >= 0 ) && ( index < 4 ) );\r
90         return ( &x )[ index ];\r
91 }\r
92 \r
93 inline float& quat_t::operator[]( int index ) {\r
94         assert( ( index >= 0 ) && ( index < 4 ) );\r
95         return ( &x )[ index ];\r
96 }\r
97 \r
98 inline void quat_t::set( float x, float y, float z, float w ) {\r
99         this->x = x;\r
100         this->y = y;\r
101         this->z = z;\r
102         this->w = w;\r
103 }\r
104 \r
105 inline void quat_t::operator=( quat_t a ) {\r
106         x = a.x;\r
107         y = a.y;\r
108         z = a.z;\r
109         w = a.w;\r
110 }\r
111 \r
112 inline quat_t operator+( quat_t a, quat_t b ) {\r
113         return quat_t( a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w );\r
114 }\r
115 \r
116 inline quat_t& quat_t::operator+=( quat_t a ) {\r
117         x += a.x;\r
118         y += a.y;\r
119         z += a.z;\r
120         w += a.w;\r
121 \r
122         return *this;\r
123 }\r
124 \r
125 inline quat_t operator-( quat_t a, quat_t b ) {\r
126         return quat_t( a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w );\r
127 }\r
128 \r
129 inline quat_t& quat_t::operator-=( quat_t a ) {\r
130         x -= a.x;\r
131         y -= a.y;\r
132         z -= a.z;\r
133         w -= a.w;\r
134 \r
135         return *this;\r
136 }\r
137 \r
138 inline quat_t operator*( quat_t a, float b ) {\r
139         return quat_t( a.x * b, a.y * b, a.z * b, a.w * b );\r
140 }\r
141 \r
142 inline quat_t operator*( float a, quat_t b ) {\r
143         return b * a;\r
144 }\r
145 \r
146 inline quat_t& quat_t::operator*=( float a ) {\r
147         x *= a;\r
148         y *= a;\r
149         z *= a;\r
150         w *= a;\r
151 \r
152         return *this;\r
153 }\r
154 \r
155 inline int operator==( quat_t a, quat_t b ) {\r
156         return ( ( a.x == b.x ) && ( a.y == b.y ) && ( a.z == b.z ) && ( a.w == b.w ) );\r
157 }\r
158 \r
159 inline int operator!=( quat_t a, quat_t b ) {\r
160         return ( ( a.x != b.x ) || ( a.y != b.y ) || ( a.z != b.z ) && ( a.w != b.w ) );\r
161 }\r
162 \r
163 inline float quat_t::Length( void ) {\r
164         float length;\r
165         \r
166         length = x * x + y * y + z * z + w * w;\r
167         return ( float )sqrt( length );\r
168 }\r
169 \r
170 inline quat_t& quat_t::Normalize( void ) {\r
171         float length;\r
172         float ilength;\r
173 \r
174         length = this->Length();\r
175         if ( length ) {\r
176                 ilength = 1 / length;\r
177                 x *= ilength;\r
178                 y *= ilength;\r
179                 z *= ilength;\r
180                 w *= ilength;\r
181         }\r
182                 \r
183         return *this;\r
184 }\r
185 \r
186 inline quat_t quat_t::operator-() {\r
187         return quat_t( -x, -y, -z, -w );\r
188 }\r
189 \r
190 #endif /* !__MATH_QUATERNION_H__ */\r