math_angles.h (4845B)
1 /* 2 =========================================================================== 3 Copyright (C) 1999-2005 Id Software, Inc. 4 5 This file is part of Quake III Arena source code. 6 7 Quake III Arena source code is free software; you can redistribute it 8 and/or modify it under the terms of the GNU General Public License as 9 published by the Free Software Foundation; either version 2 of the License, 10 or (at your option) any later version. 11 12 Quake III Arena source code is distributed in the hope that it will be 13 useful, 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 Foobar; 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_t; 33 typedef idVec3_t &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_t &vec ); 44 45 friend void toAngles( idVec3_t &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 void operator=( angles_t const &a ); 57 void operator=( idVec3_t 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_t 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 72 friend int operator!=( angles_t &a, angles_t &b ); 73 74 void toVectors( idVec3_t *forward, idVec3_t *right = NULL, idVec3_t *up = NULL ); 75 idVec3_t toForward( void ); 76 77 angles_t &Zero( void ); 78 79 angles_t &Normalize360( void ); 80 angles_t &Normalize180( void ); 81 }; 82 83 extern angles_t ang_zero; 84 85 inline angles_t::angles_t() {} 86 87 inline angles_t::angles_t( float pitch, float yaw, float roll ) { 88 this->pitch = pitch; 89 this->yaw = yaw; 90 this->roll = roll; 91 } 92 93 inline angles_t::angles_t( const idVec3_t &vec ) { 94 this->pitch = vec.x; 95 this->yaw = vec.y; 96 this->roll = vec.z; 97 } 98 99 inline float angles_t::operator[]( int index ) const { 100 assert( ( index >= 0 ) && ( index < 3 ) ); 101 return ( &pitch )[ index ]; 102 } 103 104 inline float& angles_t::operator[]( int index ) { 105 assert( ( index >= 0 ) && ( index < 3 ) ); 106 return ( &pitch )[ index ]; 107 } 108 109 inline angles_t::operator vec3_p( void ) { 110 return *( idVec3_t * )&pitch; 111 } 112 113 inline void angles_t::set( float pitch, float yaw, float roll ) { 114 this->pitch = pitch; 115 this->yaw = yaw; 116 this->roll = roll; 117 } 118 119 inline void angles_t::operator=( angles_t const &a ) { 120 pitch = a.pitch; 121 yaw = a.yaw; 122 roll = a.roll; 123 } 124 125 inline void angles_t::operator=( idVec3_t const &a ) { 126 pitch = a[ 0 ]; 127 yaw = a[ 1 ]; 128 roll = a[ 2 ]; 129 } 130 131 inline angles_t operator+( const angles_t &a, const angles_t &b ) { 132 return angles_t( a.pitch + b.pitch, a.yaw + b.yaw, a.roll + b.roll ); 133 } 134 135 inline angles_t& angles_t::operator+=( angles_t const &a ) { 136 pitch += a.pitch; 137 yaw += a.yaw; 138 roll += a.roll; 139 140 return *this; 141 } 142 143 inline angles_t& angles_t::operator+=( idVec3_t const &a ) { 144 pitch += a.x; 145 yaw += a.y; 146 roll += a.z; 147 148 return *this; 149 } 150 151 inline angles_t operator-( angles_t &a, angles_t &b ) { 152 return angles_t( a.pitch - b.pitch, a.yaw - b.yaw, a.roll - b.roll ); 153 } 154 155 inline angles_t& angles_t::operator-=( angles_t &a ) { 156 pitch -= a.pitch; 157 yaw -= a.yaw; 158 roll -= a.roll; 159 160 return *this; 161 } 162 163 inline angles_t operator*( const angles_t &a, float b ) { 164 return angles_t( a.pitch * b, a.yaw * b, a.roll * b ); 165 } 166 167 inline angles_t operator*( float a, const angles_t &b ) { 168 return angles_t( a * b.pitch, a * b.yaw, a * b.roll ); 169 } 170 171 inline angles_t& angles_t::operator*=( float a ) { 172 pitch *= a; 173 yaw *= a; 174 roll *= a; 175 176 return *this; 177 } 178 179 inline int operator==( angles_t &a, angles_t &b ) { 180 return ( ( a.pitch == b.pitch ) && ( a.yaw == b.yaw ) && ( a.roll == b.roll ) ); 181 } 182 183 inline int operator!=( angles_t &a, angles_t &b ) { 184 return ( ( a.pitch != b.pitch ) || ( a.yaw != b.yaw ) || ( a.roll != b.roll ) ); 185 } 186 187 inline angles_t& angles_t::Zero( void ) { 188 pitch = 0.0f; 189 yaw = 0.0f; 190 roll = 0.0f; 191 192 return *this; 193 } 194 195 #endif /* !__MATH_ANGLES_H__ */