00001 #ifndef __VECMATH_EULER4_HPP
00002 #define __VECMATH_EULER4_HPP
00003
00004
00005
00006
00007 #ifndef __LANG_MATH_HPP
00008 #include <vecmath/Math.h>
00009 #endif
00010
00011 template <class Type> class _Euler4;
00012
00013 #ifndef __VECMATH_TUPLE4_HPP
00014 #include <vecmath/_Tuple4.h>
00015 #endif
00016
00017
00018
00019
00020
00021 #ifndef __VECMATH_MATRIX4_HPP
00022 #include <vecmath/_Matrix4.h>
00023 #endif
00024
00025 typedef int order_t;
00026
00027
00028 #define DEBUGEULER4(d)
00029
00030 #define EulSafe "\000\001\002\000"
00031 #define EulNext "\001\002\000\001"
00032 #define EulFrm(ord) ((unsigned)(ord)&1)
00033 #define EulRep(ord) (((unsigned)(ord)>>1)&1)
00034 #define EulPar(ord) (((unsigned)(ord)>>2)&1)
00035 #define EulOrd(i, p, r, f) (((((((i)<<1)+(p))<<1)+(r))<<1)+(f))
00036 #define EulGetOrd(ord,i,j,k,h,n,s,f) {unsigned o=ord;f=o&1;o>>=1;s=o&1;o>>=1;\
00037 n=o&1;o>>=1;i=EulSafe[o&3];j=EulNext[i+n];k=EulNext[i+1-n];h=s?k:i;}
00038
00039
00040
00041
00042 template <class Type> class VECMATH_EXPORT _Euler4 {
00043 public:
00044 enum { X, Y, Z, W };
00045 static const order_t EulFrmS = 0;
00046 static const order_t EulFrmR = 1;
00047 static const order_t EulRepNo = 0;
00048 static const order_t EulRepYes = 1;
00049 static const order_t EulParEven = 0;
00050 static const order_t EulParOdd = 1;
00051
00052
00053 static const order_t EulOrdXYZs = EulOrd(X,EulParEven,EulRepNo,EulFrmS);
00054 static const order_t EulOrdXYXs = EulOrd(X,EulParEven,EulRepYes,EulFrmS);
00055 static const order_t EulOrdXZYs = EulOrd(X,EulParOdd,EulRepNo,EulFrmS);
00056 static const order_t EulOrdXZXs = EulOrd(X,EulParOdd,EulRepYes,EulFrmS);
00057 static const order_t EulOrdYZXs = EulOrd(Y,EulParEven,EulRepNo,EulFrmS);
00058 static const order_t EulOrdYZYs = EulOrd(Y,EulParEven,EulRepYes,EulFrmS);
00059 static const order_t EulOrdYXZs = EulOrd(Y,EulParOdd,EulRepNo,EulFrmS);
00060 static const order_t EulOrdYXYs = EulOrd(Y,EulParOdd,EulRepYes,EulFrmS);
00061 static const order_t EulOrdZXYs = EulOrd(Z,EulParEven,EulRepNo,EulFrmS);
00062 static const order_t EulOrdZXZs = EulOrd(Z,EulParEven,EulRepYes,EulFrmS);
00063 static const order_t EulOrdZYXs = EulOrd(Z,EulParOdd,EulRepNo,EulFrmS);
00064 static const order_t EulOrdZYZs = EulOrd(Z,EulParOdd,EulRepYes,EulFrmS);
00065
00066 static const order_t EulOrdZYXr = EulOrd(X,EulParEven,EulRepNo,EulFrmR);
00067 static const order_t EulOrdXYXr = EulOrd(X,EulParEven,EulRepYes,EulFrmR);
00068 static const order_t EulOrdYZXr = EulOrd(X,EulParOdd,EulRepNo,EulFrmR);
00069 static const order_t EulOrdXZXr = EulOrd(X,EulParOdd,EulRepYes,EulFrmR);
00070 static const order_t EulOrdXZYr = EulOrd(Y,EulParEven,EulRepNo,EulFrmR);
00071 static const order_t EulOrdYZYr = EulOrd(Y,EulParEven,EulRepYes,EulFrmR);
00072 static const order_t EulOrdZXYr = EulOrd(Y,EulParOdd,EulRepNo,EulFrmR);
00073 static const order_t EulOrdYXYr = EulOrd(Y,EulParOdd,EulRepYes,EulFrmR);
00074 static const order_t EulOrdYXZr = EulOrd(Z,EulParEven,EulRepNo,EulFrmR);
00075 static const order_t EulOrdZXZr = EulOrd(Z,EulParEven,EulRepYes,EulFrmR);
00076 static const order_t EulOrdXYZr = EulOrd(Z,EulParOdd,EulRepNo,EulFrmR);
00077 static const order_t EulOrdZYZr = EulOrd(Z,EulParOdd,EulRepYes,EulFrmR);
00078
00079 static const Type EPS;
00080 static const Type EPS1;
00081 Type x, y, z;
00082 order_t order;
00083
00084 _Euler4<Type>() {}
00085
00086 explicit _Euler4<Type>(Type x, Type y = 0, Type z = 0, order_t order = EulOrdXYZs) : x(x), y(y), z(z), order(order) {
00087 DEBUGEULER4(cout << "_Euler4 explicit constructor x,y,z,w " << *this << endl);
00088 }
00089
00090 _Euler4<Type>(const _Tuple4<double>& t) {
00091 set(t);
00092 DEBUGEULER4(cout << "_Euler4 constructor &double " << *this << endl);
00093 }
00094
00095 _Euler4<Type>(const _Tuple4<float>& t) {
00096 set(t);
00097 DEBUGEULER4(cout << "_Euler4 constructor &float " << *this << endl);
00098 }
00099
00100 _Euler4<Type>(const Type t[4]) {
00101 set(t);
00102 DEBUGEULER4(cout << "_Euler4 constructor t[4] " << *this << endl);
00103 }
00104
00105
00106 void get(_Matrix4<double>& m) const;
00107 void get(_Matrix4<float>& m) const;
00108 void get(_Matrix3<double>& m) const;
00109 void get(_Matrix3<float>& m) const;
00110
00111 void get(_Quat4<double>& q) const;
00112
00113 void interpolate(const _Euler4<Type>& q, Type d) {
00114 interpolate(*this, q, d);
00115 }
00116
00117 void interpolate(const _Euler4<Type>& q, const _Euler4<Type>& q1, Type d) {}
00118
00119 void set(Type _x, Type _y = 0.0, Type _z = 0.0, order_t _order = EulOrdXYZs) {
00120 x = _x;
00121 y = _y;
00122 z = _z;
00123 order = _order;
00124 }
00125
00126 void set(const _Tuple4<double>& t) {
00127 set(t.x, t.y, t.z, (order_t) t.w);
00128 }
00129
00130 void set(const _Tuple4<float>& t) {
00131 set(t.x, t.y, t.z, (order_t) t.w);
00132 }
00133
00134 void set(const _Quat4<float>& m) {
00135
00136 }
00137
00138 void set(const double v[4]) {
00139 set(v[0], v[1], v[2], (order_t) v[3]);
00140 }
00141
00142 void set(const float v[4]) {
00143 set(v[0], v[1], v[2], (order_t) v[3]);
00144 }
00145
00146 void set(const _Matrix4<double>& m, order_t _order = EulOrdXYZs);
00147 void set(const _Matrix4<float>& m, order_t _order = EulOrdXYZs);
00148 void set(const _Matrix3<double>& m, order_t _order = EulOrdXYZs);
00149 void set(const _Matrix3<float>& m, order_t _order = EulOrdXYZs);
00150
00151 void set(const _Euler4<double>& e) {
00152 set(e.x, e.y, e.z, e.order);
00153 }
00154
00155 void set(const _Euler4<float>& e) {
00156 set(e.x, e.y, e.z, e.order);
00157 }
00158
00159
00160
00161
00162 private:
00163 void setByMatrix(double m00, double m01, double m02,
00164 double m10, double m11, double m12,
00165 double m20, double m21, double m22) {}
00166
00167 void setByAxis(double ax, double ay, double az, double aa) {}
00168
00169
00170 };
00171
00172 #endif