xsi_matrix4.h
Go to the documentation of this file.
00001 //*****************************************************************************
00011 //*****************************************************************************
00012 
00013 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00014 #pragma once
00015 #endif
00016 
00017 #ifndef __XSIMATRIX4_H__
00018 #define __XSIMATRIX4_H__
00019 
00020 #include "sicppsdk.h"
00021 
00022 namespace XSI {
00023 namespace MATH {
00024 
00025 
00026 //*****************************************************************************
00058 //*****************************************************************************
00059 class SICPPSDKDECL CMatrix4
00060 {
00061 public:
00062 
00064     SICPPSDK_INLINE CMatrix4();
00065 
00084     SICPPSDK_INLINE CMatrix4(double in_d00, double in_d01, double in_d02, double in_d03,
00085              double in_d10, double in_d11, double in_d12, double in_d13,
00086              double in_d20, double in_d21, double in_d22, double in_d23,
00087              double in_d30, double in_d31, double in_d32, double in_d33);
00088 
00092     SICPPSDK_INLINE CMatrix4( const CMatrix4& in_matrix4);
00093 
00095     SICPPSDK_INLINE ~CMatrix4();
00096 
00101     SICPPSDK_INLINE CMatrix4  & operator=( const CMatrix4 & in_matrix4 );
00102 
00109     SICPPSDK_INLINE CMatrix4 & operator*=(const CMatrix4 & in_matrix4);
00110 
00114     SICPPSDK_INLINE CMatrix4&   SetIdentity();
00115 
00119     bool        InvertInPlace();
00120 
00125     bool        Invert(const CMatrix4& in_matrix4);
00126 
00131     bool        TransposeInverseInPlace();
00132 
00138     bool        TransposeInverse(const CMatrix4& in_matrix4);
00139 
00142     void        TransposeInPlace();
00143 
00147     SICPPSDK_INLINE void        Transpose(const CMatrix4& in_matrix4);
00148 
00154     SICPPSDK_INLINE CMatrix4&       MulInPlace(const CMatrix4& in_matrix4);
00155 
00162     SICPPSDK_INLINE CMatrix4&       Mul(const CMatrix4& in_matrix4A, const CMatrix4& in_matrix4B);
00163 
00182     SICPPSDK_INLINE void Get
00183     (
00184         double& io_d00, double& io_d01, double& io_d02, double& io_d03,
00185         double& io_d10, double& io_d11, double& io_d12, double& io_d13,
00186         double& io_d20, double& io_d21, double& io_d22, double& io_d23,
00187         double& io_d30, double& io_d31, double& io_d32, double& io_d33
00188     ) const;
00189 
00190 
00209     SICPPSDK_INLINE void    Set(double in_d00, double in_d01, double in_d02, double in_d03,
00210                 double in_d10, double in_d11, double in_d12, double in_d13,
00211                 double in_d20, double in_d21, double in_d22, double in_d23,
00212                 double in_d30, double in_d31, double in_d32, double in_d33);
00213 
00217     SICPPSDK_INLINE void Set(const double in_vals[4][4]);
00218 
00224     SICPPSDK_INLINE double      GetValue(short in_sRow,short in_sCol )const;
00225 
00231     SICPPSDK_INLINE void        SetValue(short in_sRow, short in_sCol, double in_dVal );
00232 
00238     bool EpsilonEquals
00239     (
00240         const CMatrix4& in_matrix4,
00241         double in_dEpsilon
00242     ) const;
00243 
00248     SICPPSDK_INLINE bool Equals(const CMatrix4& in_matrix4) const;
00249 
00255     SICPPSDK_INLINE bool operator ==(const CMatrix4 & in_matrix4 ) const;
00256 
00262     SICPPSDK_INLINE bool operator !=(const CMatrix4 & in_matrix4 ) const;
00263 private:
00264     double m_dMat[4][4];
00265 };
00266 
00267 //inline functions
00268 SICPPSDK_INLINE CMatrix4::CMatrix4()
00269 {
00270     m_dMat[0][0] = 0.0;
00271     m_dMat[0][1] = 0.0;
00272     m_dMat[0][2] = 0.0;
00273     m_dMat[0][3] = 0.0;
00274     m_dMat[1][0] = 0.0;
00275     m_dMat[1][1] = 0.0;
00276     m_dMat[1][2] = 0.0;
00277     m_dMat[1][3] = 0.0;
00278     m_dMat[2][0] = 0.0;
00279     m_dMat[2][1] = 0.0;
00280     m_dMat[2][2] = 0.0;
00281     m_dMat[2][3] = 0.0;
00282     m_dMat[3][0] = 0.0;
00283     m_dMat[3][1] = 0.0;
00284     m_dMat[3][2] = 0.0;
00285     m_dMat[3][3] = 0.0;
00286 }
00287 
00288 SICPPSDK_INLINE CMatrix4::CMatrix4
00289 (double in_d00, double in_d01, double in_d02, double in_d03,
00290  double in_d10, double in_d11, double in_d12, double in_d13,
00291  double in_d20, double in_d21, double in_d22, double in_d23,
00292  double in_d30, double in_d31, double in_d32, double in_d33
00293 )
00294 {
00295     m_dMat[0][0] = in_d00;
00296     m_dMat[0][1] = in_d01;
00297     m_dMat[0][2] = in_d02;
00298     m_dMat[0][3] = in_d03;
00299     m_dMat[1][0] = in_d10;
00300     m_dMat[1][1] = in_d11;
00301     m_dMat[1][2] = in_d12;
00302     m_dMat[1][3] = in_d13;
00303     m_dMat[2][0] = in_d20;
00304     m_dMat[2][1] = in_d21;
00305     m_dMat[2][2] = in_d22;
00306     m_dMat[2][3] = in_d23;
00307     m_dMat[3][0] = in_d30;
00308     m_dMat[3][1] = in_d31;
00309     m_dMat[3][2] = in_d32;
00310     m_dMat[3][3] = in_d33;
00311 }
00312 
00313 SICPPSDK_INLINE CMatrix4::CMatrix4(const CMatrix4& in_matrix4)
00314 {
00315     m_dMat[0][0] = in_matrix4.m_dMat[0][0];
00316     m_dMat[0][1] = in_matrix4.m_dMat[0][1];
00317     m_dMat[0][2] = in_matrix4.m_dMat[0][2];
00318     m_dMat[0][3] = in_matrix4.m_dMat[0][3];
00319     m_dMat[1][0] = in_matrix4.m_dMat[1][0];
00320     m_dMat[1][1] = in_matrix4.m_dMat[1][1];
00321     m_dMat[1][2] = in_matrix4.m_dMat[1][2];
00322     m_dMat[1][3] = in_matrix4.m_dMat[1][3];
00323     m_dMat[2][0] = in_matrix4.m_dMat[2][0];
00324     m_dMat[2][1] = in_matrix4.m_dMat[2][1];
00325     m_dMat[2][2] = in_matrix4.m_dMat[2][2];
00326     m_dMat[2][3] = in_matrix4.m_dMat[2][3];
00327     m_dMat[3][0] = in_matrix4.m_dMat[3][0];
00328     m_dMat[3][1] = in_matrix4.m_dMat[3][1];
00329     m_dMat[3][2] = in_matrix4.m_dMat[3][2];
00330     m_dMat[3][3] = in_matrix4.m_dMat[3][3];
00331 }
00332 
00333 SICPPSDK_INLINE CMatrix4::~CMatrix4() 
00334 {}
00335 
00336 SICPPSDK_INLINE CMatrix4& CMatrix4::operator=( const CMatrix4 & in_matrix4 )
00337 {
00338     m_dMat[0][0] = in_matrix4.m_dMat[0][0];
00339     m_dMat[0][1] = in_matrix4.m_dMat[0][1];
00340     m_dMat[0][2] = in_matrix4.m_dMat[0][2];
00341     m_dMat[0][3] = in_matrix4.m_dMat[0][3];
00342     m_dMat[1][0] = in_matrix4.m_dMat[1][0];
00343     m_dMat[1][1] = in_matrix4.m_dMat[1][1];
00344     m_dMat[1][2] = in_matrix4.m_dMat[1][2];
00345     m_dMat[1][3] = in_matrix4.m_dMat[1][3];
00346     m_dMat[2][0] = in_matrix4.m_dMat[2][0];
00347     m_dMat[2][1] = in_matrix4.m_dMat[2][1];
00348     m_dMat[2][2] = in_matrix4.m_dMat[2][2];
00349     m_dMat[2][3] = in_matrix4.m_dMat[2][3];
00350     m_dMat[3][0] = in_matrix4.m_dMat[3][0];
00351     m_dMat[3][1] = in_matrix4.m_dMat[3][1];
00352     m_dMat[3][2] = in_matrix4.m_dMat[3][2];
00353     m_dMat[3][3] = in_matrix4.m_dMat[3][3];
00354     return *this;
00355 }
00356 
00357 SICPPSDK_INLINE CMatrix4& CMatrix4::operator*=(const CMatrix4& in_matrix4)
00358 {
00359     return MulInPlace(in_matrix4);
00360 }
00361 
00362 SICPPSDK_INLINE CMatrix4&   CMatrix4::SetIdentity()
00363 {
00364     m_dMat[0][0] = 1.0;
00365     m_dMat[0][1] = 0.0;
00366     m_dMat[0][2] = 0.0;
00367     m_dMat[0][3] = 0.0;
00368     m_dMat[1][0] = 0.0;
00369     m_dMat[1][1] = 1.0;
00370     m_dMat[1][2] = 0.0;
00371     m_dMat[1][3] = 0.0;
00372     m_dMat[2][0] = 0.0;
00373     m_dMat[2][1] = 0.0;
00374     m_dMat[2][2] = 1.0;
00375     m_dMat[2][3] = 0.0;
00376     m_dMat[3][0] = 0.0;
00377     m_dMat[3][1] = 0.0;
00378     m_dMat[3][2] = 0.0;
00379     m_dMat[3][3] = 1.0;
00380     return *this;
00381 }
00382 
00383 SICPPSDK_INLINE void CMatrix4::TransposeInPlace()
00384 {
00385     Transpose(*this);
00386 }
00387 
00388 SICPPSDK_INLINE void CMatrix4::Transpose(const CMatrix4& in_matrix4)
00389 {
00390     double  dTempMat[4][4];
00391     for(int nR=0; nR<4; nR++)
00392         for(int nC=0; nC<4; nC++)
00393             dTempMat[nR][nC] = in_matrix4.m_dMat[nC][nR];
00394     Set(dTempMat);
00395 }
00396 
00397 SICPPSDK_INLINE CMatrix4&   CMatrix4::MulInPlace(const CMatrix4& in_matrix4)
00398 {
00399     return Mul(*this,in_matrix4);
00400 }
00401 
00402 SICPPSDK_INLINE CMatrix4&   CMatrix4::Mul
00403 (
00404  const CMatrix4& in_matrix4A, 
00405  const CMatrix4& in_matrix4B
00406 )
00407 {
00408     double  dTempMat[4][4];
00409 
00410     for(int nR=0; nR<4; nR++)
00411         for(int nC=0; nC<4; nC++)
00412             dTempMat[nR][nC] = 
00413                 in_matrix4A.m_dMat[nR][0] * in_matrix4B.m_dMat[0][nC] +
00414                 in_matrix4A.m_dMat[nR][1] * in_matrix4B.m_dMat[1][nC] +
00415                 in_matrix4A.m_dMat[nR][2] * in_matrix4B.m_dMat[2][nC] +
00416                 in_matrix4A.m_dMat[nR][3] * in_matrix4B.m_dMat[3][nC];
00417 
00418     Set(dTempMat);
00419     return (*this);
00420 }
00421 
00422 SICPPSDK_INLINE void CMatrix4::Get
00423 (   
00424     double& io_d00, double& io_d01, double& io_d02, double& io_d03,
00425     double& io_d10, double& io_d11, double& io_d12, double& io_d13,
00426     double& io_d20, double& io_d21, double& io_d22, double& io_d23,
00427     double& io_d30, double& io_d31, double& io_d32, double& io_d33
00428 ) const
00429 {
00430     
00431     io_d00 = m_dMat[0][0];
00432     io_d01 = m_dMat[0][1];
00433     io_d02 = m_dMat[0][2];
00434     io_d03 = m_dMat[0][3];
00435     io_d10 = m_dMat[1][0];
00436     io_d11 = m_dMat[1][1];  
00437     io_d12 = m_dMat[1][2];
00438     io_d13 = m_dMat[1][3];
00439     io_d20 = m_dMat[2][0];
00440     io_d21 = m_dMat[2][1];
00441     io_d22 = m_dMat[2][2];
00442     io_d23 = m_dMat[2][3];
00443     io_d30 = m_dMat[3][0];
00444     io_d31 = m_dMat[3][1];
00445     io_d32 = m_dMat[3][2];
00446     io_d33 = m_dMat[3][3];
00447 }
00448 
00449 SICPPSDK_INLINE void CMatrix4::Set
00450 (   
00451     double in_d00, double in_d01, double in_d02, double in_d03,
00452     double in_d10, double in_d11, double in_d12, double in_d13,
00453     double in_d20, double in_d21, double in_d22, double in_d23,
00454     double in_d30, double in_d31, double in_d32, double in_d33
00455 )
00456 {
00457     m_dMat[0][0] = in_d00;
00458     m_dMat[0][1] = in_d01;
00459     m_dMat[0][2] = in_d02;
00460     m_dMat[0][3] = in_d03;
00461     m_dMat[1][0] = in_d10;
00462     m_dMat[1][1] = in_d11;
00463     m_dMat[1][2] = in_d12;
00464     m_dMat[1][3] = in_d13;
00465     m_dMat[2][0] = in_d20;
00466     m_dMat[2][1] = in_d21;
00467     m_dMat[2][2] = in_d22;
00468     m_dMat[2][3] = in_d23;
00469     m_dMat[3][0] = in_d30;
00470     m_dMat[3][1] = in_d31;
00471     m_dMat[3][2] = in_d32;
00472     m_dMat[3][3] = in_d33;
00473 }
00474 
00475 SICPPSDK_INLINE void CMatrix4::Set(const double in_matrix4[4][4])
00476 {
00477     m_dMat[0][0] = in_matrix4[0][0];
00478     m_dMat[0][1] = in_matrix4[0][1];
00479     m_dMat[0][2] = in_matrix4[0][2];
00480     m_dMat[0][3] = in_matrix4[0][3];
00481     m_dMat[1][0] = in_matrix4[1][0];
00482     m_dMat[1][1] = in_matrix4[1][1];
00483     m_dMat[1][2] = in_matrix4[1][2];
00484     m_dMat[1][3] = in_matrix4[1][3];
00485     m_dMat[2][0] = in_matrix4[2][0];
00486     m_dMat[2][1] = in_matrix4[2][1];
00487     m_dMat[2][2] = in_matrix4[2][2];
00488     m_dMat[2][3] = in_matrix4[2][3];
00489     m_dMat[3][0] = in_matrix4[3][0];
00490     m_dMat[3][1] = in_matrix4[3][1];
00491     m_dMat[3][2] = in_matrix4[3][2];
00492     m_dMat[3][3] = in_matrix4[3][3];
00493 }
00494 
00495 
00496 SICPPSDK_INLINE double  CMatrix4::GetValue(short in_sRow,short in_sCol ) const
00497 {
00498     bool l_bValidIndex =  ( in_sRow >=0 && in_sCol >= 0 &&
00499                             in_sRow <=3 && in_sCol <= 3);   
00500     assert(l_bValidIndex);
00501 
00502     if(l_bValidIndex)
00503     {
00504         return m_dMat[in_sRow][in_sCol];
00505     }
00506     return 0.0;
00507 
00508 }
00509 
00510 SICPPSDK_INLINE void CMatrix4::SetValue(short in_sRow, short in_sCol, double in_dVal )
00511 {
00512     bool l_bValidIndex =  ( in_sRow >=0 && in_sCol >= 0 &&
00513                             in_sRow <=3 && in_sCol <= 3);
00514 
00515     assert(l_bValidIndex);
00516     if(l_bValidIndex)
00517     {
00518         m_dMat[in_sRow][in_sCol] = in_dVal;
00519     }
00520 }
00521 
00522 SICPPSDK_INLINE bool CMatrix4::Equals(const CMatrix4& in_matrix4) const
00523 {
00524     return (this == &in_matrix4) ? true :
00525         m_dMat[0][0] == in_matrix4.m_dMat[0][0] &&
00526         m_dMat[0][1] == in_matrix4.m_dMat[0][1] &&
00527         m_dMat[0][2] == in_matrix4.m_dMat[0][2] &&
00528         m_dMat[0][3] == in_matrix4.m_dMat[0][3] &&
00529         m_dMat[1][0] == in_matrix4.m_dMat[1][0] &&
00530         m_dMat[1][1] == in_matrix4.m_dMat[1][1] &&
00531         m_dMat[1][2] == in_matrix4.m_dMat[1][2] &&
00532         m_dMat[1][3] == in_matrix4.m_dMat[1][3] &&
00533         m_dMat[2][0] == in_matrix4.m_dMat[2][0] &&
00534         m_dMat[2][1] == in_matrix4.m_dMat[2][1] &&
00535         m_dMat[2][2] == in_matrix4.m_dMat[2][2] &&
00536         m_dMat[2][3] == in_matrix4.m_dMat[2][3] &&
00537         m_dMat[3][0] == in_matrix4.m_dMat[3][0] &&
00538         m_dMat[3][1] == in_matrix4.m_dMat[3][1] &&
00539         m_dMat[3][2] == in_matrix4.m_dMat[3][2] &&
00540         m_dMat[3][3] == in_matrix4.m_dMat[3][3];
00541 }
00542 
00543 SICPPSDK_INLINE bool CMatrix4::operator ==(const CMatrix4 & in_matrix4 ) const
00544 {
00545     return Equals( in_matrix4 );
00546 }
00547 
00548 SICPPSDK_INLINE bool CMatrix4::operator !=(const CMatrix4 & in_matrix4 ) const
00549 {
00550     return ! Equals( in_matrix4 );
00551 }
00552 
00553 
00554 
00555 };
00556 };
00557 
00558 #endif // __XSIMATRIX4_H__