00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "ExCMatrix4x4.h"
00025
00026
00027 ExCMatrix4x4::ExCMatrix4x4()
00028 {
00029 Guard(ExCMatrix4x4::ExCMatrix4x4())
00030 LoadIdentity();
00031 UnGuard
00032 }
00033
00034 ExCMatrix4x4::~ExCMatrix4x4()
00035 {
00036 Guard(ExCMatrix4x4::~ExCMatrix4x4())
00037 UnGuard
00038 }
00039
00040
00041 void ExCMatrix4x4::SetLine(short line,float c1,float c2,float c3,float c4)
00042 {
00043 Guard(void ExCMatrix4x4::SetLine(short line,float c1,float c2,float c3,float c4))
00044 switch(line)
00045 {
00046 case 1:
00047 m_Matrix[0] =c1;m_Matrix[4] =c2;m_Matrix[8] =c3;m_Matrix[12]=c4;
00048 break;
00049 case 2:
00050 m_Matrix[1] =c1;m_Matrix[5] =c2;m_Matrix[9] =c3;m_Matrix[13]=c4;
00051 break;
00052 case 3:
00053 m_Matrix[2] =c1;m_Matrix[6] =c2;m_Matrix[10]=c3;m_Matrix[14]=c4;
00054 break;
00055 case 4:
00056 m_Matrix[3] =c1;m_Matrix[7] =c2;m_Matrix[11]=c3;m_Matrix[15]=c4;
00057 break;
00058 }
00059 UnGuard
00060 }
00061
00062 void ExCMatrix4x4::SetColone(short colone,float l1,float l2,float l3,float l4)
00063 {
00064 Guard(void ExCMatrix4x4::SetColone(short colone,float l1,float l2,float l3,float l4))
00065 switch(colone)
00066 {
00067 case 1:
00068 m_Matrix[0] =l1;m_Matrix[1] =l2;m_Matrix[2] =l3;m_Matrix[3]=l4;
00069 break;
00070 case 2:
00071 m_Matrix[4] =l1;m_Matrix[5] =l2;m_Matrix[6] =l3;m_Matrix[7]=l4;
00072 break;
00073 case 3:
00074 m_Matrix[8] =l1;m_Matrix[9] =l2;m_Matrix[10]=l3;m_Matrix[11]=l4;
00075 break;
00076 case 4:
00077 m_Matrix[12] =l1;m_Matrix[13] =l2;m_Matrix[14]=l3;m_Matrix[15]=l4;
00078 break;
00079 }
00080 UnGuard
00081 }
00082
00083 void ExCMatrix4x4::SetMatrix(float Matrix[16])
00084 {
00085 m_Matrix[0]= Matrix[0];
00086 m_Matrix[1]= Matrix[4];
00087 m_Matrix[2]= Matrix[8];
00088 m_Matrix[3]= Matrix[12];
00089 m_Matrix[4]= Matrix[1];
00090 m_Matrix[5]= Matrix[5];
00091 m_Matrix[6]= Matrix[9];
00092 m_Matrix[7]= Matrix[13];
00093 m_Matrix[8]= Matrix[2];
00094 m_Matrix[9]= Matrix[6];
00095 m_Matrix[10]=Matrix[10];
00096 m_Matrix[11]=Matrix[14];
00097 m_Matrix[12]=Matrix[3];
00098 m_Matrix[13]=Matrix[7];
00099 m_Matrix[14]=Matrix[11];
00100 m_Matrix[15]=Matrix[15];
00101 }
00102
00103 void ExCMatrix4x4::SetMatrix(float l1c1,float l1c2,float l1c3,float l1c4,
00104 float l2c1,float l2c2,float l2c3,float l2c4,
00105 float l3c1,float l3c2,float l3c3,float l3c4,
00106 float l4c1,float l4c2,float l4c3,float l4c4)
00107 {
00108 Guard(ExCMatrix4x4::SetMatrix(float l1c1...))
00109 SetLine(1,l1c1,l1c2,l1c3,l1c4);
00110 SetLine(2,l2c1,l2c2,l2c3,l2c4);
00111 SetLine(3,l3c1,l3c2,l3c3,l3c4);
00112 SetLine(4,l4c1,l4c2,l4c3,l4c4);
00113 UnGuard
00114 }
00115
00116 void ExCMatrix4x4::LoadIdentity(void)
00117 {
00118 Guard(void ExCMatrix4x4::LoadIdentity(void))
00119 m_Matrix[0] =1.0f;m_Matrix[4] =0.0f;m_Matrix[8] =0.0f;m_Matrix[12]=0.0f;
00120 m_Matrix[1] =0.0f;m_Matrix[5] =1.0f;m_Matrix[9] =0.0f;m_Matrix[13]=0.0f;
00121 m_Matrix[2] =0.0f;m_Matrix[6] =0.0f;m_Matrix[10]=1.0f;m_Matrix[14]=0.0f;
00122 m_Matrix[3] =0.0f;m_Matrix[7] =0.0f;m_Matrix[11]=0.0f;m_Matrix[15]=1.0f;
00123 UnGuard
00124 }
00125
00126 float ExCMatrix4x4::GetDeterminant(void)
00127 {
00128 Guard(float ExCMatrix4x4::GetDeterminant(void))
00129
00130
00131 return
00132 ((m_Matrix[5]*((m_Matrix[10]*m_Matrix[15])-(m_Matrix[11]*m_Matrix[14])))
00133 -(m_Matrix[9]*((m_Matrix[14]*m_Matrix[7])-(m_Matrix[6]*m_Matrix[15])))
00134 +(m_Matrix[13]*((m_Matrix[6]*m_Matrix[11])-(m_Matrix[7]*m_Matrix[10]))))
00135 -((m_Matrix[1]*((m_Matrix[10]*m_Matrix[15])-(m_Matrix[11]*m_Matrix[14])))
00136 -(m_Matrix[9]*((m_Matrix[14]*m_Matrix[3])-(m_Matrix[2]*m_Matrix[15])))
00137 +(m_Matrix[13]*((m_Matrix[6]*m_Matrix[11])-(m_Matrix[7]*m_Matrix[10]))))
00138 +((m_Matrix[1]*((m_Matrix[6]*m_Matrix[15])-(m_Matrix[7]*m_Matrix[14])))
00139 -(m_Matrix[5]*((m_Matrix[14]*m_Matrix[3])-(m_Matrix[2]*m_Matrix[15])))
00140 +(m_Matrix[13]*((m_Matrix[2]*m_Matrix[7])-(m_Matrix[3]*m_Matrix[6]))))
00141 -((m_Matrix[1]*((m_Matrix[2]*m_Matrix[7])-(m_Matrix[3]*m_Matrix[6])))
00142 -(m_Matrix[5]*((m_Matrix[10]*m_Matrix[3])-(m_Matrix[2]*m_Matrix[11])))
00143 +(m_Matrix[9]*((m_Matrix[2]*m_Matrix[7])-(m_Matrix[3]*m_Matrix[6]))));
00144 UnGuard
00145 }
00146
00147
00148
00149 ExCMatrix4x4 ExCMatrix4x4::GetTransposee(void)
00150 {
00151 Guard(ExCMatrix4x4 ExCMatrix4x4::GetTransposee(void))
00152 ExCMatrix4x4 result;
00153 result.m_Matrix[0]= m_Matrix[0];
00154 result.m_Matrix[1]= m_Matrix[4];
00155 result.m_Matrix[2]= m_Matrix[8];
00156 result.m_Matrix[3]= m_Matrix[12];
00157 result.m_Matrix[4]= m_Matrix[1];
00158 result.m_Matrix[5]= m_Matrix[5];
00159 result.m_Matrix[6]= m_Matrix[9];
00160 result.m_Matrix[7]= m_Matrix[13];
00161 result.m_Matrix[8]= m_Matrix[2];
00162 result.m_Matrix[9]= m_Matrix[6];
00163 result.m_Matrix[10]=m_Matrix[10];
00164 result.m_Matrix[11]=m_Matrix[14];
00165 result.m_Matrix[12]=m_Matrix[3];
00166 result.m_Matrix[13]=m_Matrix[7];
00167 result.m_Matrix[14]=m_Matrix[11];
00168 result.m_Matrix[15]=m_Matrix[15];
00169 return result;
00170 UnGuard
00171 }
00173
00175 ExCMatrix4x4 ExCMatrix4x4::operator- (const ExCMatrix4x4 &m2)
00176 {
00177 ExCMatrix4x4 result;
00178 ExCMatrix4x4 m1=*this;
00179 result.m_Matrix[0]= m1.m_Matrix[0]-m2.m_Matrix[0];
00180 result.m_Matrix[1]= m1.m_Matrix[1]-m2.m_Matrix[1];
00181 result.m_Matrix[2]= m1.m_Matrix[2]-m2.m_Matrix[2];
00182 result.m_Matrix[3]= m1.m_Matrix[3]-m2.m_Matrix[3];
00183 result.m_Matrix[4]= m1.m_Matrix[4]-m2.m_Matrix[4];
00184 result.m_Matrix[5]= m1.m_Matrix[5]-m2.m_Matrix[5];
00185 result.m_Matrix[6]= m1.m_Matrix[6]-m2.m_Matrix[6];
00186 result.m_Matrix[7]= m1.m_Matrix[7]-m2.m_Matrix[7];
00187 result.m_Matrix[8]= m1.m_Matrix[8]-m2.m_Matrix[8];
00188 result.m_Matrix[9]= m1.m_Matrix[9]-m2.m_Matrix[9];
00189 result.m_Matrix[10]=m1.m_Matrix[10]-m2.m_Matrix[10];
00190 result.m_Matrix[11]=m1.m_Matrix[11]-m2.m_Matrix[11];
00191 result.m_Matrix[12]=m1.m_Matrix[12]-m2.m_Matrix[12];
00192 result.m_Matrix[13]=m1.m_Matrix[13]-m2.m_Matrix[13];
00193 result.m_Matrix[14]=m1.m_Matrix[14]-m2.m_Matrix[14];
00194 result.m_Matrix[15]=m1.m_Matrix[15]-m2.m_Matrix[15];
00195 return result;
00196 }
00197
00198 ExCMatrix4x4 ExCMatrix4x4::operator+(const ExCMatrix4x4 &m2)
00199 {
00200 ExCMatrix4x4 result;
00201 ExCMatrix4x4 m1=*this;
00202 result.m_Matrix[0]= m1.m_Matrix[0]+m2.m_Matrix[0];
00203 result.m_Matrix[1]= m1.m_Matrix[1]+m2.m_Matrix[1];
00204 result.m_Matrix[2]= m1.m_Matrix[2]+m2.m_Matrix[2];
00205 result.m_Matrix[3]= m1.m_Matrix[3]+m2.m_Matrix[3];
00206 result.m_Matrix[4]= m1.m_Matrix[4]+m2.m_Matrix[4];
00207 result.m_Matrix[5]= m1.m_Matrix[5]+m2.m_Matrix[5];
00208 result.m_Matrix[6]= m1.m_Matrix[6]+m2.m_Matrix[6];
00209 result.m_Matrix[7]= m1.m_Matrix[7]+m2.m_Matrix[7];
00210 result.m_Matrix[8]= m1.m_Matrix[8]+m2.m_Matrix[8];
00211 result.m_Matrix[9]= m1.m_Matrix[9]+m2.m_Matrix[9];
00212 result.m_Matrix[10]=m1.m_Matrix[10]+m2.m_Matrix[10];
00213 result.m_Matrix[11]=m1.m_Matrix[11]+m2.m_Matrix[11];
00214 result.m_Matrix[12]=m1.m_Matrix[12]+m2.m_Matrix[12];
00215 result.m_Matrix[13]=m1.m_Matrix[13]+m2.m_Matrix[13];
00216 result.m_Matrix[14]=m1.m_Matrix[14]+m2.m_Matrix[14];
00217 result.m_Matrix[15]=m1.m_Matrix[15]+m2.m_Matrix[15];
00218 return result;
00219 }
00220
00221
00222 ExCMatrix4x4 ExCMatrix4x4::operator * (const float scalar)
00223 {
00224 ExCMatrix4x4 result;
00225 ExCMatrix4x4 m1=*this;
00226 result.m_Matrix[0]= m1.m_Matrix[0]*scalar;
00227 result.m_Matrix[1]= m1.m_Matrix[1]*scalar;
00228 result.m_Matrix[2]= m1.m_Matrix[2]*scalar;
00229 result.m_Matrix[3]= m1.m_Matrix[3]*scalar;
00230 result.m_Matrix[4]= m1.m_Matrix[4]*scalar;
00231 result.m_Matrix[5]= m1.m_Matrix[5]*scalar;
00232 result.m_Matrix[6]= m1.m_Matrix[6]*scalar;
00233 result.m_Matrix[7]= m1.m_Matrix[7]*scalar;
00234 result.m_Matrix[8]= m1.m_Matrix[8]*scalar;
00235 result.m_Matrix[9]= m1.m_Matrix[9]*scalar;
00236 result.m_Matrix[10]=m1.m_Matrix[10]*scalar;
00237 result.m_Matrix[11]=m1.m_Matrix[11]*scalar;
00238 result.m_Matrix[12]=m1.m_Matrix[12]*scalar;
00239 result.m_Matrix[13]=m1.m_Matrix[13]*scalar;
00240 result.m_Matrix[14]=m1.m_Matrix[14]*scalar;
00241 result.m_Matrix[15]=m1.m_Matrix[15]*scalar;
00242 return result;
00243 }
00244
00245 ExCMatrix4x4 ExCMatrix4x4::operator* (const ExCMatrix4x4 &m2)
00246 {
00247 ExCMatrix4x4 result;
00248 ExCMatrix4x4 m1=*this;
00249
00250 result.m_Matrix[0]= (m1.m_Matrix[0]*m2.m_Matrix[0])+(m1.m_Matrix[4]*m2.m_Matrix[1])+(m1.m_Matrix[8]*m2.m_Matrix[2])+(m1.m_Matrix[12]*m2.m_Matrix[3]);
00251 result.m_Matrix[4]= (m1.m_Matrix[0]*m2.m_Matrix[4])+(m1.m_Matrix[4]*m2.m_Matrix[5])+(m1.m_Matrix[8]*m2.m_Matrix[6])+(m1.m_Matrix[12]*m2.m_Matrix[7]);
00252 result.m_Matrix[8]= (m1.m_Matrix[0]*m2.m_Matrix[8])+(m1.m_Matrix[4]*m2.m_Matrix[9])+(m1.m_Matrix[8]*m2.m_Matrix[10])+(m1.m_Matrix[12]*m2.m_Matrix[11]);
00253 result.m_Matrix[12]= (m1.m_Matrix[0]*m2.m_Matrix[12])+(m1.m_Matrix[4]*m2.m_Matrix[13])+(m1.m_Matrix[8]*m2.m_Matrix[14])+(m1.m_Matrix[12]*m2.m_Matrix[15]);
00254
00255 result.m_Matrix[1]= (m1.m_Matrix[1]*m2.m_Matrix[0])+(m1.m_Matrix[5]*m2.m_Matrix[1])+(m1.m_Matrix[9]*m2.m_Matrix[2])+(m1.m_Matrix[13]*m2.m_Matrix[3]);
00256 result.m_Matrix[5]= (m1.m_Matrix[1]*m2.m_Matrix[4])+(m1.m_Matrix[5]*m2.m_Matrix[5])+(m1.m_Matrix[9]*m2.m_Matrix[6])+(m1.m_Matrix[13]*m2.m_Matrix[7]);
00257 result.m_Matrix[9]= (m1.m_Matrix[1]*m2.m_Matrix[8])+(m1.m_Matrix[5]*m2.m_Matrix[9])+(m1.m_Matrix[9]*m2.m_Matrix[10])+(m1.m_Matrix[13]*m2.m_Matrix[11]);
00258 result.m_Matrix[13]= (m1.m_Matrix[1]*m2.m_Matrix[12])+(m1.m_Matrix[5]*m2.m_Matrix[13])+(m1.m_Matrix[9]*m2.m_Matrix[14])+(m1.m_Matrix[13]*m2.m_Matrix[15]);
00259
00260 result.m_Matrix[2]= (m1.m_Matrix[2]*m2.m_Matrix[0])+(m1.m_Matrix[6]*m2.m_Matrix[1])+(m1.m_Matrix[10]*m2.m_Matrix[2])+(m1.m_Matrix[14]*m2.m_Matrix[3]);
00261 result.m_Matrix[6]= (m1.m_Matrix[2]*m2.m_Matrix[4])+(m1.m_Matrix[6]*m2.m_Matrix[5])+(m1.m_Matrix[10]*m2.m_Matrix[6])+(m1.m_Matrix[14]*m2.m_Matrix[7]);
00262 result.m_Matrix[10]= (m1.m_Matrix[2]*m2.m_Matrix[8])+(m1.m_Matrix[6]*m2.m_Matrix[9])+(m1.m_Matrix[10]*m2.m_Matrix[10])+(m1.m_Matrix[14]*m2.m_Matrix[11]);
00263 result.m_Matrix[14]= (m1.m_Matrix[2]*m2.m_Matrix[12])+(m1.m_Matrix[6]*m2.m_Matrix[13])+(m1.m_Matrix[10]*m2.m_Matrix[14])+(m1.m_Matrix[14]*m2.m_Matrix[15]);
00264
00265 result.m_Matrix[3]= (m1.m_Matrix[3]*m2.m_Matrix[0])+(m1.m_Matrix[7]*m2.m_Matrix[1])+(m1.m_Matrix[11]*m2.m_Matrix[2])+(m1.m_Matrix[15]*m2.m_Matrix[3]);
00266 result.m_Matrix[7]= (m1.m_Matrix[3]*m2.m_Matrix[4])+(m1.m_Matrix[7]*m2.m_Matrix[5])+(m1.m_Matrix[11]*m2.m_Matrix[6])+(m1.m_Matrix[15]*m2.m_Matrix[7]);
00267 result.m_Matrix[11]= (m1.m_Matrix[3]*m2.m_Matrix[8])+(m1.m_Matrix[7]*m2.m_Matrix[9])+(m1.m_Matrix[11]*m2.m_Matrix[10])+(m1.m_Matrix[15]*m2.m_Matrix[11]);
00268 result.m_Matrix[15]= (m1.m_Matrix[3]*m2.m_Matrix[12])+(m1.m_Matrix[7]*m2.m_Matrix[13])+(m1.m_Matrix[11]*m2.m_Matrix[14])+(m1.m_Matrix[15]*m2.m_Matrix[15]);
00269
00270 return result;
00271 }
00272
00274
00276
00277 std::ostream& operator<<(std::ostream& s,const ExCMatrix4x4 &m)
00278 {
00279 Guard(friend std::ostream& operator<<(std::ostream& s,const ExCMatrix4x4 &m))
00280 s<<std::endl<<"|["<<m.m_Matrix[0]<<"]"<<"["<<m.m_Matrix[4]<<"]"<<"["<<m.m_Matrix[8]<<"]"<<"["<<m.m_Matrix[12]<<"]|"<<std::endl;
00281 s<<"|["<<m.m_Matrix[1]<<"]"<<"["<<m.m_Matrix[5]<<"]"<<"["<<m.m_Matrix[9]<<"]"<<"["<<m.m_Matrix[13]<<"]|"<<std::endl;
00282 s<<"|["<<m.m_Matrix[2]<<"]"<<"["<<m.m_Matrix[6]<<"]"<<"["<<m.m_Matrix[10]<<"]"<<"["<<m.m_Matrix[14]<<"]|"<<std::endl;
00283 s<<"|["<<m.m_Matrix[3]<<"]"<<"["<<m.m_Matrix[7]<<"]"<<"["<<m.m_Matrix[11]<<"]"<<"["<<m.m_Matrix[15]<<"]|";
00284 return s;
00285 UnGuard
00286 }