Euler3.hpp

Go to the documentation of this file.
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.

SourceForge.net Logo