Main Page Namespace List Class Hierarchy Alphabetical List Data Structures File List Namespace Members Data Fields Globals

# ExCMatrix4x4.cpp

Go to the documentation of this file.

    00001 /*
    00002  * ExNihilo 3D Engine
    00003  *
    00004  *  This program is free software; you can redistribute it and/or modify
    00005  *  it under the terms of the GNU General Public License as published by
    00006  *  the Free Software Foundation; either version 2 of the License, or
    00007  *  (at your option) any later version.
    00008  *
    00009  *  This program is distributed in the hope that it will be useful,
    00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
    00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    00012  *  GNU Library General Public License for more details.
    00013  *
    00014  *  You should have received a copy of the GNU General Public License
    00015  *  along with this program; if not, write to the Free Software
    00016  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
    00017  *
    00018  * Please read AUTHORS file !!!
    00019  *
    00020  * $Id: ExCMatrix4x4.cpp,v 1.5 2002/07/07 00:35:10 data Exp $
    00021  *
    00022  */
    00023
    00024 #include "ExCMatrix4x4.h"
    00025
    00026 // Construction/Destruction
    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 // Methode
    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 //Using Kramer rule to calculate determinant
    00130 //si deter !=0 inverse posible
    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 //Transposeé Ligne=colone
    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 // Operator
    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 // friends methode
    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 }