2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
\r
5 This file is part of GtkRadiant.
\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
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
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
22 #ifndef __MATH_ANGLES_H__
\r
23 #define __MATH_ANGLES_H__
\r
28 #include "math_vector.h"
\r
33 typedef idVec3 &vec3_p;
\r
42 angles_t( float pitch, float yaw, float roll );
\r
43 angles_t( const idVec3 &vec );
\r
45 friend void toAngles( idVec3 &src, angles_t &dst );
\r
46 friend void toAngles( quat_t &src, angles_t &dst );
\r
47 friend void toAngles( mat3_t &src, angles_t &dst );
\r
51 float operator[]( int index ) const;
\r
52 float& operator[]( int index );
\r
54 void set( float pitch, float yaw, float roll );
\r
56 void operator=( angles_t const &a );
\r
57 void operator=( idVec3 const &a );
\r
59 friend angles_t operator+( const angles_t &a, const angles_t &b );
\r
60 angles_t &operator+=( angles_t const &a );
\r
61 angles_t &operator+=( idVec3 const &a );
\r
63 friend angles_t operator-( angles_t &a, angles_t &b );
\r
64 angles_t &operator-=( angles_t &a );
\r
66 friend angles_t operator*( const angles_t &a, float b );
\r
67 friend angles_t operator*( float a, const angles_t &b );
\r
68 angles_t &operator*=( float a );
\r
70 friend int operator==( angles_t &a, angles_t &b );
\r
72 friend int operator!=( angles_t &a, angles_t &b );
\r
74 void toVectors( idVec3 *forward, idVec3 *right = NULL, idVec3 *up = NULL );
\r
75 idVec3 toForward( void );
\r
77 angles_t &Zero( void );
\r
79 angles_t &Normalize360( void );
\r
80 angles_t &Normalize180( void );
\r
83 extern angles_t ang_zero;
\r
85 inline angles_t::angles_t() {}
\r
87 inline angles_t::angles_t( float pitch, float yaw, float roll ) {
\r
88 this->pitch = pitch;
\r
93 inline angles_t::angles_t( const idVec3 &vec ) {
\r
94 this->pitch = vec.x;
\r
99 inline float angles_t::operator[]( int index ) const {
\r
100 assert( ( index >= 0 ) && ( index < 3 ) );
\r
101 return ( &pitch )[ index ];
\r
104 inline float& angles_t::operator[]( int index ) {
\r
105 assert( ( index >= 0 ) && ( index < 3 ) );
\r
106 return ( &pitch )[ index ];
\r
109 inline angles_t::operator vec3_p( void ) {
\r
110 return *( idVec3 * )&pitch;
\r
113 inline void angles_t::set( float pitch, float yaw, float roll ) {
\r
114 this->pitch = pitch;
\r
119 inline void angles_t::operator=( angles_t const &a ) {
\r
125 inline void angles_t::operator=( idVec3 const &a ) {
\r
131 inline angles_t operator+( const angles_t &a, const angles_t &b ) {
\r
132 return angles_t( a.pitch + b.pitch, a.yaw + b.yaw, a.roll + b.roll );
\r
135 inline angles_t& angles_t::operator+=( angles_t const &a ) {
\r
143 inline angles_t& angles_t::operator+=( idVec3 const &a ) {
\r
151 inline angles_t operator-( angles_t &a, angles_t &b ) {
\r
152 return angles_t( a.pitch - b.pitch, a.yaw - b.yaw, a.roll - b.roll );
\r
155 inline angles_t& angles_t::operator-=( angles_t &a ) {
\r
163 inline angles_t operator*( const angles_t &a, float b ) {
\r
164 return angles_t( a.pitch * b, a.yaw * b, a.roll * b );
\r
167 inline angles_t operator*( float a, const angles_t &b ) {
\r
168 return angles_t( a * b.pitch, a * b.yaw, a * b.roll );
\r
171 inline angles_t& angles_t::operator*=( float a ) {
\r
179 inline int operator==( angles_t &a, angles_t &b ) {
\r
180 return ( ( a.pitch == b.pitch ) && ( a.yaw == b.yaw ) && ( a.roll == b.roll ) );
\r
183 inline int operator!=( angles_t &a, angles_t &b ) {
\r
184 return ( ( a.pitch != b.pitch ) || ( a.yaw != b.yaw ) || ( a.roll != b.roll ) );
\r
187 inline angles_t& angles_t::Zero( void ) {
\r
195 #endif /* !__MATH_ANGLES_H__ */
\r