00001 /* 00002 Copyright (C) 2006 00003 Rune Myrland, Skalden Studio AS 00004 */ 00005 #ifndef base_vecmath_Euler3_hpp 00006 #define base_vecmath_Euler3_hpp 00007 00008 #include "util_vecmath.hpp" 00009 #include "../error/Log.hpp" 00010 #include "../math/BrayT.hpp" 00011 00012 namespace se_core { 00013 00019 class _SeCoreExport Euler3 { 00020 public: 00024 typedef bray_t value_type; 00028 typedef short size_type; 00032 enum { DIMENSION = 3 }; 00033 00037 bray_t yaw_; 00038 00042 bray_t pitch_; 00043 00047 bray_t roll_; 00048 00049 00057 Euler3(bray_t yaw, bray_t pitch, bray_t roll): 00058 yaw_(yaw & BRAY_MASK), pitch_(pitch & BRAY_MASK), roll_(roll & BRAY_MASK) { 00059 set(yaw, pitch, roll); 00060 } 00061 00066 Euler3(const bray_t t[]): yaw_(t[0]), pitch_(t[1]), roll_(t[2]) { } 00067 00071 Euler3() { } 00072 00073 00074 00078 Euler3(const Quat4& q) { 00079 set(q); 00080 } 00081 00085 Euler3(const Euler3& a) { 00086 set(a); 00087 } 00088 00095 void set(bray_t yaw, bray_t pitch, bray_t roll) { 00096 yaw_ = yaw & BRAY_MASK; 00097 pitch_ = pitch & BRAY_MASK; 00098 roll_ = roll & BRAY_MASK; 00099 } 00100 00105 void set(const bray_t t[]) { 00106 yaw_ = t[0] & BRAY_MASK; 00107 pitch_ = t[1] & BRAY_MASK; 00108 roll_ = t[2] & BRAY_MASK; 00109 } 00110 00111 void set(const Quat4& q1); 00112 00117 void set(const Euler3& a1) { 00118 yaw_ = a1.yaw_; 00119 pitch_ = a1.pitch_; 00120 roll_ = a1.roll_; 00121 } 00122 00123 00124 void setEuler(const Euler3& a1) { 00125 set(a1); 00126 } 00127 00128 00132 void setYaw(bray_t yaw) { 00133 yaw_ = yaw; 00134 pitch_ = 0; 00135 roll_ = 0; 00136 } 00137 00144 void setPitch(bray_t yaw) { 00145 yaw_ = yaw; 00146 pitch_ = 0; 00147 roll_ = 0; 00148 } 00149 00156 void setRoll(bray_t roll) { 00157 yaw_ = 0; 00158 pitch_ = 0; 00159 roll_ = roll; 00160 } 00161 00168 void setYawAndPitch(bray_t yaw, bray_t pitch) { 00169 yaw_ = yaw; 00170 pitch_ = pitch; 00171 roll_ = 0; 00172 } 00173 00177 void setEuler(bray_t yaw, bray_t pitch, bray_t roll) { 00178 yaw_ = yaw; 00179 pitch_ = pitch; 00180 roll_ = roll; 00181 } 00182 00183 00184 00185 void reset() { 00186 yaw_ = pitch_ = roll_ = 0; 00187 } 00188 00189 void setIdentity() { 00190 reset(); 00191 } 00192 00197 void get(bray_t t[]) const { 00198 t[0] = yaw_; 00199 t[1] = pitch_; 00200 t[2] = roll_; 00201 } 00202 00207 void get(Euler3* t) const { 00208 Assert(t); 00209 t->yaw_ = yaw_; 00210 t->pitch_ = pitch_; 00211 t->roll_ = roll_; 00212 } 00213 00219 void add(const Euler3& a1, const Euler3& a2) { 00220 yaw_ = (a1.yaw_ + a2.yaw_) & BRAY_MASK; 00221 pitch_ = (a1.pitch_ + a2.pitch_) & BRAY_MASK; 00222 roll_ = (a1.roll_ + a2.roll_) & BRAY_MASK; 00223 } 00224 00229 void add(const Euler3& a1) { 00230 yaw_ = (yaw_ + a1.yaw_) & BRAY_MASK; 00231 pitch_ = (pitch_ + a1.pitch_) & BRAY_MASK; 00232 roll_ = (roll_ + a1.roll_) & BRAY_MASK; 00233 } 00234 00235 00240 inline void rotate(const Euler3& a1) { 00241 add(a1); 00242 } 00243 00244 inline void rotateInverse(const Euler3& a1) { 00245 sub(a1); 00246 } 00247 00253 void sub(const Euler3& a1, const Euler3& a2) { 00254 yaw_ = (a1.yaw_ - a2.yaw_) & BRAY_MASK; 00255 pitch_ = (a1.pitch_ - a2.pitch_) & BRAY_MASK; 00256 roll_ = (a1.roll_ - a2.roll_) & BRAY_MASK; 00257 } 00258 00263 void sub(const Euler3& a1) { 00264 yaw_ = (yaw_ - a1.yaw_) & BRAY_MASK; 00265 pitch_ = (pitch_ - a1.pitch_) & BRAY_MASK; 00266 roll_ = (roll_ - a1.roll_) & BRAY_MASK; 00267 } 00268 00273 void invert(const Euler3& a1) { 00274 yaw_ = BrayT::negate(a1.yaw_); 00275 pitch_ = BrayT::negate(a1.pitch_); 00276 roll_ = BrayT::negate(a1.roll_); 00277 } 00278 00282 void invert() { 00283 yaw_ = BrayT::negate(yaw_); 00284 pitch_ = BrayT::negate(pitch_); 00285 roll_ = BrayT::negate(roll_); 00286 } 00287 00288 00294 void scale(scale_t s, const Euler3& a1) { 00295 yaw_ = BrayT::scale(s, a1.roll_); 00296 pitch_ = BrayT::scale(s, a1.pitch_); 00297 roll_ = BrayT::scale(s, a1.roll_); 00298 } 00299 00304 void scale(scale_t s) { 00305 yaw_ = BrayT::scale(s, yaw_); 00306 pitch_ = BrayT::scale(s, pitch_); 00307 roll_ = BrayT::scale(s, roll_); 00308 } 00309 00310 inline void normalize() { 00311 yaw_ &= BRAY_MASK; 00312 pitch_ &= BRAY_MASK; 00313 roll_ &= BRAY_MASK; 00314 } 00315 00323 void scaleAdd(scale_t s, const Euler3& a1, const Euler3& a2) { 00324 yaw_ = (BrayT::scale(s, a1.roll_) + a2.yaw_) & BRAY_MASK; 00325 pitch_ = (BrayT::scale(s, a1.pitch_) + a2.pitch_) & BRAY_MASK; 00326 roll_ = (BrayT::scale(s, a1.roll_) + a2.roll_) & BRAY_MASK; 00327 } 00328 00335 void scaleAdd(scale_t s, const Euler3& a1) { 00336 yaw_ = BrayT::scale(s, yaw_) + a1.yaw_; 00337 pitch_ = BrayT::scale(s, pitch_) + a1.pitch_; 00338 roll_ = BrayT::scale(s, roll_) + a1.roll_; 00339 } 00340 00341 00347 bool equals(const Euler3& a1) const { 00348 return yaw_ == a1.yaw_ && pitch_ == a1.pitch_ && roll_ == a1.roll_; 00349 } 00350 00351 bool isIdentity() const { 00352 return yaw_ == 0 && pitch_ == 0 && roll_ == 0; 00353 } 00354 00362 bool epsilonEquals(const Euler3& a1, bray_t epsilon) const; 00363 00371 void interpolate(const Euler3& a1, const Euler3& a2, scale_t alpha) { 00372 set(a1); 00373 interpolate(a2, alpha); 00374 } 00375 00382 void interpolate(const Euler3& a1, scale_t alpha); 00383 00384 00389 char* toString(char* buffer) const; 00390 00391 // copy constructor and operator = is made by complier 00392 00393 bool operator==(const Euler3& a1) const { 00394 return equals(a1); 00395 } 00396 00397 bray_t operator[](size_type index) const { 00398 Assert(index < (size_type)DIMENSION); 00399 switch (index) { 00400 case 0: 00401 return yaw_; 00402 case 1: 00403 return pitch_; 00404 case 2: 00405 return roll_; 00406 default: 00407 // error ! 00408 return 0; 00409 } 00410 } 00411 bray_t& operator[](size_type index) { 00412 static bray_t dummy; 00413 Assert(index < (size_type)DIMENSION); 00414 switch (index) { 00415 case 0: 00416 return yaw_; 00417 case 1: 00418 return pitch_; 00419 case 2: 00420 return roll_; 00421 default: 00422 // error ! 00423 return dummy; 00424 } 00425 } 00426 00427 Euler3& operator=(const Euler3& a1) { 00428 set(a1); 00429 return *this; 00430 } 00431 00432 Euler3& operator+=(const Euler3& a1) { 00433 add(a1); 00434 return *this; 00435 } 00436 Euler3& operator-=(const Euler3& a1) { 00437 sub(a1); 00438 return *this; 00439 } 00440 Euler3& operator*=(scale_t s) { 00441 scale(s); 00442 return *this; 00443 } 00444 Euler3 operator+(const Euler3& a1) const { 00445 return (Euler3(*this)).operator+=(a1); 00446 } 00447 Euler3 operator-(const Euler3& a1) const { 00448 return (Euler3(*this)).operator-=(a1); 00449 } 00450 Euler3 operator*(scale_t s) const { 00451 return (Euler3(*this)).operator*=(s); 00452 } 00453 00454 const char* toLog() const; 00455 }; 00456 00457 se_err::Log& operator<< (se_err::Log& log, const Euler3& t); 00458 00459 } // Namespace 00460 00461 inline 00462 se_core::Euler3 operator*(scale_t s, const se_core::Euler3& a1) { 00463 return (se_core::Euler3(a1)).operator*=(s); 00464 } 00465 00466 00467 #endif /* ANGLE4_H */
Home Page | SagaEngine trunk (updated nightly) reference generated Sun Dec 2 20:06:13 2007 by Doxygen version 1.3.9.1.