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