xsi_vector4.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 __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 //inline functions
    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__