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
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__