00001
00011
00012
00013 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00014 #pragma once
00015 #endif
00016
00017 #ifndef __XSIVECTOR4_H__
00018 #define __XSIVECTOR4_H__
00019
00020 #include "sicppsdk.h"
00021 #include "xsi_status.h"
00022 #include "xsi_matrix4.h"
00023 #include "xsi_transformation.h"
00024
00025
00026 namespace XSI {
00027
00028
00029 namespace MATH {
00030
00031
00037
00038 class SICPPSDKDECL CVector4
00039 {
00040 public:
00042 SICPPSDK_INLINE CVector4();
00043
00050 SICPPSDK_INLINE CVector4(double in_dX, double in_dY, double in_dZ, double in_dW);
00051
00055 SICPPSDK_INLINE CVector4( const CVector4& in_vector4);
00056
00058 SICPPSDK_INLINE ~CVector4();
00059
00064 SICPPSDK_INLINE CVector4 & operator=( const CVector4 & in_vector4 );
00065
00071 SICPPSDK_INLINE bool operator ==(const CVector4 & in_vector4 )const;
00072
00078 SICPPSDK_INLINE bool operator !=(const CVector4 & in_vector4 )const;
00079
00084 SICPPSDK_INLINE CVector4& operator ~();
00085
00091 SICPPSDK_INLINE CVector4& operator +=(const CVector4& in_vector4);
00092
00098 SICPPSDK_INLINE CVector4& operator -=(const CVector4 & in_vector4);
00099
00100
00106 SICPPSDK_INLINE CVector4& operator *=(const CMatrix4& in_matrix4);
00107
00113 SICPPSDK_INLINE CVector4& operator *=(const CTransformation& in_transformation);
00114
00120 SICPPSDK_INLINE CVector4& operator *=(const double& in_dAlpha);
00121
00127 double operator[](const short& in_sIndex);
00128
00133 SICPPSDK_INLINE CVector4& MulByMatrix4InPlace(const CMatrix4& in_matrix4);
00134
00140 SICPPSDK_INLINE CVector4& MulByMatrix4
00141 (
00142 const CVector4& in_vector4,
00143 const CMatrix4& in_matrix4
00144 );
00145
00150 SICPPSDK_INLINE CVector4& MulByTransformationInPlace
00151 (
00152 const CTransformation& in_transformation
00153 );
00154
00160 SICPPSDK_INLINE CVector4& MulByTransformation
00161 (
00162 const CVector4& in_vector4,
00163 const CTransformation& in_transformation
00164 );
00165
00169 SICPPSDK_INLINE CVector4& PutNull();
00170
00174 double GetLength()const;
00175
00179 double GetLengthSquared()const;
00180
00184 CStatus NormalizeInPlace();
00185
00190 CStatus Normalize(const CVector4& in_vector4);
00191
00196 SICPPSDK_INLINE double Dot(const CVector4& in_vector4)const;
00197
00198
00204 SICPPSDK_INLINE CVector4& Cross(const CVector4& in_vector4A, const CVector4& in_vector4B);
00205
00209 CVector4& AbsoluteInPlace();
00210
00215 CVector4& Absolute(const CVector4& in_vector4);
00216
00222 bool EpsilonEquals
00223 (
00224 const CVector4& in_vector4,
00225 double in_dEpsilon
00226 )const;
00227
00232 SICPPSDK_INLINE bool Equals(const CVector4& in_vector4)const;
00233
00234
00240 SICPPSDK_INLINE CVector4& ScaleAddInPlace(double in_dS,const CVector4& in_vector4);
00241
00248 SICPPSDK_INLINE CVector4& ScaleAdd
00249 (
00250 double in_dS,
00251 const CVector4& in_vector4A,
00252 const CVector4& in_vector4B
00253 );
00254
00259 SICPPSDK_INLINE CVector4& ScaleInPlace(double in_dAlpha);
00260
00266 SICPPSDK_INLINE CVector4& Scale(double in_dAlpha, const CVector4& in_vector4);
00267
00271 SICPPSDK_INLINE CVector4& NegateInPlace();
00272
00277 SICPPSDK_INLINE CVector4& Negate(const CVector4& in_vector4);
00278
00283 SICPPSDK_INLINE CVector4& SubInPlace(const CVector4& in_vector4);
00284
00291 SICPPSDK_INLINE CVector4& Sub(const CVector4& in_vector4A, const CVector4& in_vector4B);
00292
00297 SICPPSDK_INLINE CVector4& AddInPlace(const CVector4& in_vector4);
00298
00304 SICPPSDK_INLINE CVector4& Add(const CVector4& in_vector4A,const CVector4& in_vector4B);
00305
00312 SICPPSDK_INLINE void Get( double& out_dX, double& out_dY,
00313 double& out_dZ, double& out_dW )const;
00314
00322 SICPPSDK_INLINE CVector4& Set(double in_dX, double in_dY, double in_dZ, double in_dW);
00323
00327 SICPPSDK_INLINE double GetW()const;
00328
00333 SICPPSDK_INLINE CVector4& PutW(double in_dW);
00334
00335
00339 SICPPSDK_INLINE double GetZ()const;
00340
00345 SICPPSDK_INLINE CVector4& PutZ(double in_dZ);
00346
00350 SICPPSDK_INLINE double GetY()const;
00351
00356 SICPPSDK_INLINE CVector4& PutY(double in_dY);
00357
00361 SICPPSDK_INLINE double GetX()const;
00362
00367 SICPPSDK_INLINE CVector4& PutX(double in_dX);
00368
00369 private:
00370 double m_dX,m_dY,m_dZ,m_dW;
00371 };
00372
00373
00374 SICPPSDK_INLINE CVector4::CVector4(): m_dX(0.0),m_dY(0.0),m_dZ(0.0), m_dW(0.0)
00375 {}
00376
00377 SICPPSDK_INLINE CVector4::CVector4
00378 (
00379 double in_dX, double in_dY, double in_dZ, double in_dW
00380 ):m_dX(in_dX),m_dY(in_dY),m_dZ(in_dZ), m_dW(in_dW)
00381 {}
00382
00383 SICPPSDK_INLINE CVector4::~CVector4()
00384 {}
00385
00386 SICPPSDK_INLINE CVector4::CVector4( const CVector4& in_vct )
00387 {
00388 in_vct.Get(m_dX,m_dY,m_dZ,m_dW);
00389 }
00390
00391 SICPPSDK_INLINE CVector4& CVector4::operator=( const CVector4 & in_vct )
00392 {
00393 in_vct.Get(m_dX,m_dY,m_dZ,m_dW);
00394 return (*this);
00395 }
00396
00397
00398 SICPPSDK_INLINE bool CVector4::operator ==(const CVector4 & in_vector4 )const
00399 {
00400 return Equals(in_vector4);
00401 }
00402
00403
00404 SICPPSDK_INLINE bool CVector4::operator !=(const CVector4 & in_vector4 )const
00405 {
00406 return ! Equals(in_vector4);
00407 }
00408
00409 SICPPSDK_INLINE CVector4& CVector4::operator ~()
00410 {
00411 return NegateInPlace();
00412 }
00413
00414 SICPPSDK_INLINE CVector4& CVector4::operator +=(const CVector4& in_vector4)
00415 {
00416 return AddInPlace(in_vector4);
00417 }
00418
00419 SICPPSDK_INLINE CVector4& CVector4::operator -=(const CVector4& in_vector4)
00420 {
00421 return SubInPlace(in_vector4);
00422 }
00423
00424 SICPPSDK_INLINE CVector4& CVector4::operator *=(const CMatrix4& in_matrix4)
00425 {
00426 return MulByMatrix4InPlace(in_matrix4);
00427 }
00428
00429 SICPPSDK_INLINE CVector4& CVector4::operator *=(const CTransformation& in_transformation)
00430 {
00431 return MulByTransformationInPlace(in_transformation);
00432 }
00433
00434 SICPPSDK_INLINE CVector4& CVector4::operator *=(const double& in_dAlpha)
00435 {
00436 return ScaleInPlace(in_dAlpha);
00437 }
00438
00439
00440 SICPPSDK_INLINE CVector4& CVector4::MulByMatrix4InPlace
00441 (
00442 const CMatrix4& in_matrix4
00443 )
00444 {
00445 return MulByMatrix4((*this),in_matrix4);
00446 }
00447
00448
00449 SICPPSDK_INLINE CVector4& CVector4::MulByMatrix4
00450 (
00451 const CVector4& in_vector4,
00452 const CMatrix4& in_matrix4
00453 )
00454 {
00455 double l_dX, l_dY, l_dZ, l_dW;
00456
00457 l_dX = in_vector4.GetX() * in_matrix4.GetValue( 0, 0 ) +
00458 in_vector4.GetY() * in_matrix4.GetValue( 1, 0 ) +
00459 in_vector4.GetZ() * in_matrix4.GetValue( 2, 0 ) +
00460 in_vector4.GetW() * in_matrix4.GetValue( 3, 0 );
00461 l_dY = in_vector4.GetX() * in_matrix4.GetValue( 0, 1 ) +
00462 in_vector4.GetY() * in_matrix4.GetValue( 1, 1 ) +
00463 in_vector4.GetZ() * in_matrix4.GetValue( 2, 1 ) +
00464 in_vector4.GetW() * in_matrix4.GetValue( 3, 1 );
00465 l_dZ = in_vector4.GetX() * in_matrix4.GetValue( 0, 2 ) +
00466 in_vector4.GetY() * in_matrix4.GetValue( 1, 2 ) +
00467 in_vector4.GetZ() * in_matrix4.GetValue( 2, 2 ) +
00468 in_vector4.GetW() * in_matrix4.GetValue( 3, 2 );
00469 l_dW = in_vector4.GetX() * in_matrix4.GetValue( 0, 3 ) +
00470 in_vector4.GetY() * in_matrix4.GetValue( 1, 3 ) +
00471 in_vector4.GetZ() * in_matrix4.GetValue( 2, 3 ) +
00472 in_vector4.GetW() * in_matrix4.GetValue( 3, 3 );
00473
00474 return Set(l_dX, l_dY, l_dZ, l_dW);
00475 }
00476
00477
00478 SICPPSDK_INLINE CVector4& CVector4::MulByTransformationInPlace
00479 (
00480 const CTransformation& in_crTrans
00481 )
00482 {
00483 return MulByTransformation((*this), in_crTrans);
00484 }
00485
00486
00487 SICPPSDK_INLINE CVector4& CVector4::MulByTransformation
00488 (
00489 const CVector4& in_vector4,
00490 const CTransformation& in_trans
00491 )
00492 {
00493 CMatrix4 l_matrix4 = in_trans.GetMatrix4();
00494
00495 double l_dX, l_dY, l_dZ, l_dW;
00496
00497 l_dX = in_vector4.GetX() * l_matrix4.GetValue( 0, 0 ) +
00498 in_vector4.GetY() * l_matrix4.GetValue( 1, 0 ) +
00499 in_vector4.GetZ() * l_matrix4.GetValue( 2, 0 ) +
00500 in_vector4.GetW() * l_matrix4.GetValue( 3, 0 );
00501 l_dY = in_vector4.GetX() * l_matrix4.GetValue( 0, 1 ) +
00502 in_vector4.GetY() * l_matrix4.GetValue( 1, 1 ) +
00503 in_vector4.GetZ() * l_matrix4.GetValue( 2, 1 ) +
00504 in_vector4.GetW() * l_matrix4.GetValue( 3, 1 );
00505 l_dZ = in_vector4.GetX() * l_matrix4.GetValue( 0, 2 ) +
00506 in_vector4.GetY() * l_matrix4.GetValue( 1, 2 ) +
00507 in_vector4.GetZ() * l_matrix4.GetValue( 2, 2 ) +
00508 in_vector4.GetW() * l_matrix4.GetValue( 3, 2 );
00509 l_dW = in_vector4.GetX() * l_matrix4.GetValue( 0, 3 ) +
00510 in_vector4.GetY() * l_matrix4.GetValue( 1, 3 ) +
00511 in_vector4.GetZ() * l_matrix4.GetValue( 2, 3 ) +
00512 in_vector4.GetW() * l_matrix4.GetValue( 3, 3 );
00513
00514
00515 return Set(l_dX, l_dY, l_dZ, l_dW);
00516 }
00517
00518
00519 SICPPSDK_INLINE CVector4& CVector4::PutNull()
00520 {
00521 m_dX = m_dY = m_dZ = m_dW = 0.0;
00522 return (*this);
00523 }
00524
00525
00526 SICPPSDK_INLINE double CVector4::Dot(const CVector4& in_vector4)const
00527 {
00528
00529 return ( m_dX*in_vector4.GetX() + m_dY*in_vector4.GetY() +
00530 m_dZ*in_vector4.GetZ() + m_dW*in_vector4.GetW());
00531 }
00532
00533 SICPPSDK_INLINE bool CVector4::Equals(const CVector4& in_vector4)const
00534 {
00535 return (this == &in_vector4) ? true :
00536 ( ( m_dX == in_vector4.GetX() ) &&
00537 ( m_dY == in_vector4.GetY() ) &&
00538 ( m_dZ == in_vector4.GetZ() ) &&
00539 ( m_dW == in_vector4.GetW() ) );
00540 }
00541
00542 SICPPSDK_INLINE CVector4& CVector4::ScaleAddInPlace
00543 (
00544 double in_dScalingFactor,
00545 const CVector4& in_vector4
00546 )
00547 {
00548 ScaleInPlace(in_dScalingFactor);
00549 return AddInPlace(in_vector4);
00550 }
00551
00552
00553 SICPPSDK_INLINE CVector4& CVector4::ScaleAdd
00554 (
00555 const double in_dScalingFactor,
00556 const CVector4& in_vector4A,
00557 const CVector4& in_vector4B
00558 )
00559 {
00560 Scale(in_dScalingFactor, in_vector4A);
00561 return AddInPlace(in_vector4B);
00562 }
00563
00564 SICPPSDK_INLINE CVector4& CVector4::ScaleInPlace(double in_dScalingFactor)
00565 {
00566 m_dX *= in_dScalingFactor;
00567 m_dY *= in_dScalingFactor;
00568 m_dZ *= in_dScalingFactor;
00569 m_dW *= in_dScalingFactor;
00570 return (*this);
00571 }
00572
00573 SICPPSDK_INLINE CVector4& CVector4::Scale
00574 (
00575 double in_dScalingFactor,
00576 const CVector4& in_vector4
00577 )
00578 {
00579 m_dX = in_vector4.GetX() * in_dScalingFactor;
00580 m_dY = in_vector4.GetY() * in_dScalingFactor;
00581 m_dZ = in_vector4.GetZ() * in_dScalingFactor;
00582 m_dW = in_vector4.GetW() * in_dScalingFactor;
00583 return (*this);
00584 }
00585
00586 SICPPSDK_INLINE CVector4& CVector4::NegateInPlace()
00587 {
00588 m_dX = -m_dX;
00589 m_dY = -m_dY;
00590 m_dZ = -m_dZ;
00591 m_dW = -m_dW;
00592 return (*this);
00593 }
00594
00595 SICPPSDK_INLINE CVector4& CVector4::Negate(const CVector4& in_vector4 )
00596 {
00597 m_dX = -in_vector4.GetX();
00598 m_dY = -in_vector4.GetY();
00599 m_dZ = -in_vector4.GetZ();
00600 m_dW = -in_vector4.GetW();
00601 return (*this);
00602 }
00603
00604 SICPPSDK_INLINE CVector4& CVector4::SubInPlace(const CVector4& in_vector4)
00605 {
00606 m_dX -= in_vector4.GetX();
00607 m_dY -= in_vector4.GetY();
00608 m_dZ -= in_vector4.GetZ();
00609 m_dW -= in_vector4.GetW();
00610 return (*this);
00611 }
00612
00613 SICPPSDK_INLINE CVector4& CVector4::Sub
00614 (
00615 const CVector4& in_vector4A,
00616 const CVector4& in_vector4B
00617 )
00618 {
00619 m_dX = in_vector4A.GetX() - in_vector4B.GetX();
00620 m_dY = in_vector4A.GetY() - in_vector4B.GetY();
00621 m_dZ = in_vector4A.GetZ() - in_vector4B.GetZ();
00622 m_dW = in_vector4A.GetW() - in_vector4B.GetW();
00623 return (*this);
00624 }
00625
00626 SICPPSDK_INLINE CVector4& CVector4::AddInPlace(const CVector4& in_vector4)
00627 {
00628 m_dX += in_vector4.GetX();
00629 m_dY += in_vector4.GetY();
00630 m_dZ += in_vector4.GetZ();
00631 m_dW += in_vector4.GetW();
00632 return (*this);
00633 }
00634
00635 SICPPSDK_INLINE CVector4& CVector4::Add
00636 (
00637 const CVector4& in_vector4A,
00638 const CVector4& in_vector4B
00639 )
00640 {
00641 m_dX = in_vector4A.GetX() + in_vector4B.GetX();
00642 m_dY = in_vector4A.GetY() + in_vector4B.GetY();
00643 m_dZ = in_vector4A.GetZ() + in_vector4B.GetZ();
00644 m_dW = in_vector4A.GetW() + in_vector4B.GetW();
00645 return (*this);
00646 }
00647
00648
00649 SICPPSDK_INLINE void CVector4::Get
00650 (
00651 double& out_rdX,
00652 double& out_rdY,
00653 double& out_rdZ,
00654 double& out_rdW
00655 )const
00656 {
00657 out_rdX = m_dX;
00658 out_rdY = m_dY;
00659 out_rdZ = m_dZ;
00660 out_rdW = m_dW;
00661 }
00662
00663 SICPPSDK_INLINE CVector4& CVector4::Set
00664 (
00665 double in_dX,
00666 double in_dY,
00667 double in_dZ,
00668 double in_dW
00669 )
00670 {
00671 m_dX = in_dX;
00672 m_dY = in_dY;
00673 m_dZ = in_dZ;
00674 m_dW = in_dW;
00675 return (*this);
00676 }
00677
00678 SICPPSDK_INLINE double CVector4::GetW()const
00679 {
00680 return m_dW;
00681 }
00682
00683 SICPPSDK_INLINE CVector4& CVector4::PutW(double in_dW)
00684 {
00685 m_dW = in_dW;
00686 return (*this);
00687 }
00688
00689 SICPPSDK_INLINE double CVector4::GetZ()const
00690 {
00691 return m_dZ;
00692 }
00693
00694 SICPPSDK_INLINE CVector4& CVector4::PutZ(double in_dZ)
00695 {
00696 m_dZ = in_dZ;
00697 return (*this);
00698 }
00699
00700 SICPPSDK_INLINE double CVector4::GetY()const
00701 {
00702 return m_dY;
00703 }
00704
00705 SICPPSDK_INLINE CVector4& CVector4::PutY(double in_dY)
00706 {
00707 m_dY = in_dY;
00708 return (*this);
00709 }
00710
00711 SICPPSDK_INLINE double CVector4::GetX()const
00712 {
00713 return m_dX;
00714 }
00715
00716 SICPPSDK_INLINE CVector4& CVector4::PutX(double in_dX)
00717 {
00718 m_dX = in_dX;
00719 return (*this);
00720 }
00721
00722
00732
00733 class SICPPSDKDECL CVector4Array
00734 {
00735 public:
00739 CVector4Array( LONG in_size=0);
00740
00744 CVector4Array(const CVector4Array& in_ArrayToCopy);
00745
00747 ~CVector4Array();
00748
00753 CVector4Array& operator=( const CVector4Array& in_array );
00754
00758 LONG GetCount() const;
00759
00764 CStatus Add( const CVector4& in_item );
00765
00769 CStatus Clear();
00770
00776 CStatus Resize( LONG in_size);
00777
00784 const CVector4& operator[]( LONG in_index ) const;
00785
00791 CVector4& operator[]( LONG in_index );
00792
00798 bool operator==(const CVector4Array& in_array) const;
00799
00805 bool operator!=(const CVector4Array& in_array) const;
00806
00807 private:
00808
00809 void* m_ptr;
00810 };
00811
00812 };
00813 };
00814
00815 #endif // __XSIVECTOR4_H__