00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef RTC_SMAT4_H
00020 #define RTC_SMAT4_H
00021
00022
00023 #include "rtc/rtcMath.h"
00024 #include "rtc/rtcVec4.h"
00025 #include "rtc/rtcSMat.h"
00026
00027
00028 namespace rtc {
00029
00030
00031 template <class T, int M> class SMat;
00032 template <class T> class Vec4;
00033 template <class T> class SMat4;
00034
00039 template <class T>
00040 class SMat4: public SMat<T,4> {
00041 public:
00042
00043 SMat4();
00044 SMat4(const T* d);
00045 SMat4(const T diagVal);
00046 SMat4(const Vec4<T>& diagVec);
00047 SMat4(const Mat<T,4,4>& m);
00048 SMat4(const T x11, const T x12, const T x13, const T x14,
00049 const T x21, const T x22, const T x23, const T x24,
00050 const T x31, const T x32, const T x33, const T x34,
00051 const T x41, const T x42, const T x43, const T x44);
00052 SMat4(const Vec4<T>& q0,const Vec4<T>& q1,
00053 const Vec4<T>& q2,const Vec4<T>& q3);
00054
00055
00056
00057 template <class U> SMat4(const Mat<U,4,4>& m);
00058
00059
00060 static SMat4<T> fromRows(const Vec4<T>& q0, const Vec4<T>& q1, const Vec4<T>& q2, const Vec4<T>& q3);
00061 static SMat4<T> fromCols(const Vec4<T>& q0, const Vec4<T>& q1, const Vec4<T>& q2, const Vec4<T>& q3);
00062
00063
00064 void set(const T x11, const T x12, const T x13, const T x14,
00065 const T x21, const T x22, const T x23, const T x24,
00066 const T x31, const T x32, const T x33, const T x34,
00067 const T x41, const T x42, const T x43, const T x44);
00068 void setRows(const Vec4<T>& q0, const Vec4<T>& q1, const Vec4<T>& q2, const Vec4<T>& q3);
00069 void setCols(const Vec4<T>& q0, const Vec4<T>& q1, const Vec4<T>& q2, const Vec4<T>& q3);
00070
00071
00072 using SMat<T,4>::x;
00073 using SMat<T,4>::set;
00074 };
00075
00076
00077 typedef SMat4<bool> SMat4b;
00078 typedef SMat4<char> SMat4c;
00079 typedef SMat4<unsigned char> SMat4uc;
00080 typedef SMat4<int> SMat4i;
00081 typedef SMat4<float> SMat4f;
00082 typedef SMat4<double> SMat4d;
00083
00084
00085
00086
00087
00088
00089
00092 template <class T>
00093 inline SMat4<T>::SMat4() {}
00094
00098 template <class T>
00099 inline SMat4<T>::SMat4(const T* d) : SMat<T,4>(d) {}
00100
00104 template <class T>
00105 inline SMat4<T>::SMat4(const T diagVal) : SMat<T,4>(diagVal) {}
00106
00110 template <class T>
00111 inline SMat4<T>::SMat4(const Vec4<T>& diagVec) : SMat<T,4>(diagVec) {}
00112
00115 template <class T>
00116 inline SMat4<T>::SMat4(const Mat<T,4,4>& m) : SMat<T,4>(m) {}
00117
00120 template <class T>
00121 inline SMat4<T>::SMat4(const T x11, const T x12, const T x13, const T x14,
00122 const T x21, const T x22, const T x23, const T x24,
00123 const T x31, const T x32, const T x33, const T x34,
00124 const T x41, const T x42, const T x43, const T x44) {
00125 set(x11, x12, x13, x14,
00126 x21, x22, x23, x24,
00127 x31, x32, x33, x34,
00128 x41, x42, x43, x44);
00129 }
00130
00133 template <class T>
00134 inline SMat4<T>::SMat4(const Vec4<T>& q0,const Vec4<T>& q1,
00135 const Vec4<T>& q2, const Vec4<T>& q3) {
00136 setCols(q0,q1,q2,q3);
00137 }
00138
00139
00140
00143 template <class T> template <class U>
00144 inline SMat4<T>::SMat4(const Mat<U,4,4>& m) : SMat<T,4>(m) {}
00145
00146
00147
00150 template <class T>
00151 inline SMat4<T> SMat4<T>::fromRows(const Vec4<T>& q0, const Vec4<T>& q1,
00152 const Vec4<T>& q2, const Vec4<T>& q3) {
00153 SMat4<T> m;
00154 m.setRows(q0,q1,q2,q3);
00155 return m;
00156 }
00157
00160 template <class T>
00161 inline SMat4<T> SMat4<T>::fromCols(const Vec4<T>& q0, const Vec4<T>& q1,
00162 const Vec4<T>& q2, const Vec4<T>& q3) {
00163 SMat4<T> m;
00164 m.setCols(q0,q1,q2,q3);
00165 return m;
00166 }
00167
00168
00169
00172 template <class T>
00173 inline void SMat4<T>::set(const T x11,const T x12,const T x13,const T x14,
00174 const T x21,const T x22,const T x23,const T x24,
00175 const T x31,const T x32,const T x33,const T x34,
00176 const T x41,const T x42,const T x43,const T x44){
00177 x[0] = x11; x[1] = x12; x[2] = x13; x[3] = x14;
00178 x[4] = x21; x[5] = x22; x[6] = x23; x[7] = x24;
00179 x[8] = x31; x[9] = x32; x[10] = x33; x[11] = x34;
00180 x[12] = x41; x[13] = x42; x[14] = x43; x[15] = x44;
00181 }
00182
00185 template <class T>
00186 inline void SMat4<T>::setRows(const Vec4<T>& q0, const Vec4<T>& q1,
00187 const Vec4<T>& q2, const Vec4<T>& q3) {
00188 setRow(0,q0); setRow(1,q1); setRow(2,q2); setRow(3,q3);
00189 }
00190
00193 template <class T>
00194 inline void SMat4<T>::setCols(const Vec4<T>& q0, const Vec4<T>& q1,
00195 const Vec4<T>& q2, const Vec4<T>& q3) {
00196 setCol(0,q0); setCol(1,q1); setCol(2,q2); setCol(3,q3);
00197 }
00198
00199
00200 }
00201
00202 #endif // RTC_SMAT4_H defined
00203
00204