Page principale   Liste des namespaces   Hiérarchie des classes   Liste par ordre alphabétique   Liste des composants   Liste des fichiers   Composants   Déclarations  

ExCMatrix4x4.cpp

Aller à la documentation de ce fichier.
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 }

Généré le Tue Aug 6 20:25:25 2002 pour ExNihilo par doxygen1.2.17