xsi_vector3.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 __XSIVECTOR3_H__
    00018 #define __XSIVECTOR3_H__
    00019
    00020 #include "sicppsdk.h"
    00021 #include "xsi_status.h"
    00022 #include "xsi_matrix3.h"
    00023 #include "xsi_matrix4.h"
    00024 #include <math.h>
    00025
    00026 // uncomment this if you want the debug version of your plugin to catch uninitialized CVector3
    00027 // #define _DEBUG_NonInitialized_CVector3
    00028
    00029 #ifdef _DEBUG_NonInitialized_CVector3
    00030 #define MAGIC_DEBUG_VALUE ((double)0x5555555555555555)
    00031 #define XSI_DEBUG_VECTOR3 SelfDebug();
    00032 #else
    00033 #define XSI_DEBUG_VECTOR3
    00034 #endif
    00035
    00036
    00037 namespace XSI {
    00038
    00039 namespace MATH {
    00040
    00041 class CTransformation;
    00042 class CMatrix3;
    00043 class CMatrix4;
    00044
    00045 //*****************************************************************************
    00099 //*****************************************************************************
    00100 class SICPPSDKDECL CVector3
    00101 {
    00102 public:
    00104     SICPPSDK_INLINE CVector3();
    00105
    00111     SICPPSDK_INLINE CVector3(double in_dX, double in_dY, double in_dZ);
    00112
    00116     SICPPSDK_INLINE CVector3( const CVector3& in_vector3);
    00117
    00119     SICPPSDK_INLINE ~CVector3();
    00120
    00125     SICPPSDK_INLINE CVector3 & operator=( const CVector3 & in_vector3 );
    00126
    00132     SICPPSDK_INLINE bool operator ==(const CVector3 & in_vector3 )const;
    00133
    00139     SICPPSDK_INLINE bool operator !=(const CVector3 & in_vector3 )const;
    00140
    00145     SICPPSDK_INLINE CVector3& operator ~();
    00146
    00152     SICPPSDK_INLINE CVector3& operator +=(const CVector3& in_vector3);
    00153
    00159     SICPPSDK_INLINE CVector3& operator -=(const CVector3 & in_vector3);
    00160
    00161
    00167     SICPPSDK_INLINE CVector3& operator *=(const CMatrix3& in_matrix3);
    00168
    00174     SICPPSDK_INLINE CVector3& operator *=(const CMatrix4& in_matrix4);
    00175
    00181     SICPPSDK_INLINE CVector3& operator *=(const CTransformation& in_transformation);
    00182
    00188     SICPPSDK_INLINE CVector3& operator *=(const double& in_dAlpha);
    00189
    00195     SICPPSDK_INLINE double operator[](const short& in_sIndex);
    00196
    00201     SICPPSDK_INLINE CVector3& MulByMatrix3InPlace(const CMatrix3& in_matrix3);
    00202
    00208     SICPPSDK_INLINE CVector3& MulByMatrix3
    00209     (
    00210         const CVector3& in_vector3,
    00211         const CMatrix3& in_matrix3
    00212     );
    00213
    00218     SICPPSDK_INLINE CVector3& MulByMatrix4InPlace(const CMatrix4& in_matrix4);
    00219
    00225     SICPPSDK_INLINE CVector3& MulByMatrix4
    00226     (
    00227         const CVector3& in_vector3,
    00228         const CMatrix4& in_matrix4
    00229     );
    00230
    00235     SICPPSDK_INLINE CVector3& MulByTransformationInPlace
    00236     (
    00237         const CTransformation& in_transformation
    00238     );
    00239
    00245     CVector3& MulByTransformation
    00246     (
    00247         const CVector3&         in_vector3,
    00248         const CTransformation&  in_transformation
    00249     );
    00250
    00254     SICPPSDK_INLINE CVector3& PutNull();
    00255
    00259     SICPPSDK_INLINE short GetMaxComponentIndex()const;
    00260
    00264     SICPPSDK_INLINE double GetMaxComponent()const;
    00265
    00269     SICPPSDK_INLINE short GetMinComponentIndex()const;
    00270
    00274     SICPPSDK_INLINE double GetMinComponent()const;
    00275
    00279     SICPPSDK_INLINE double GetLength()const;
    00280
    00284     SICPPSDK_INLINE double GetLengthSquared()const;
    00285
    00289     CStatus NormalizeInPlace();
    00290
    00295     CStatus Normalize(const CVector3& in_vector3);
    00296
    00301     SICPPSDK_INLINE double Dot(const CVector3& in_vector3)const;
    00302
    00303
    00309     SICPPSDK_INLINE CVector3& Cross(const CVector3& in_vector3A, const CVector3& in_vector3B);
    00310
    00315     double GetAngle(const CVector3& in_vector3 )const;
    00316
    00325     SICPPSDK_INLINE CVector3& LinearlyInterpolate
    00326     (
    00327         const CVector3& in_vector3A,
    00328         const CVector3& in_vector3B,
    00329         double in_dAlpha
    00330     );
    00331
    00335     CVector3& AbsoluteInPlace();
    00336
    00342     CVector3& Absolute(const CVector3& in_vector3);
    00343
    00349     CVector3& ClampInPlace(double in_dMinValue, double in_dMaxValue);
    00350
    00358     SICPPSDK_INLINE CVector3& Clamp
    00359     (
    00360         double          in_dMinValue,
    00361         double          in_dMaxValue,
    00362         const CVector3& in_vector3
    00363     );
    00364
    00371     SICPPSDK_INLINE bool EpsilonEquals
    00372     (
    00373         const CVector3& in_vector3,
    00374         double in_dEpsilon
    00375     )const;
    00376
    00381     SICPPSDK_INLINE bool Equals(const CVector3& in_vector3)const;
    00382
    00383
    00390     SICPPSDK_INLINE CVector3& ScaleAddInPlace(double in_dS,const CVector3& in_vector3);
    00391
    00399     SICPPSDK_INLINE CVector3& ScaleAdd
    00400     (
    00401         double          in_dS,
    00402         const CVector3& in_vector3A,
    00403         const CVector3& in_vector3B
    00404     );
    00405
    00410     SICPPSDK_INLINE CVector3& ScaleInPlace(double in_dAlpha);
    00411
    00417     SICPPSDK_INLINE CVector3& Scale(double in_dAlpha, const CVector3& in_vector3);
    00418
    00422     SICPPSDK_INLINE CVector3& NegateInPlace();
    00423
    00428     SICPPSDK_INLINE CVector3& Negate(const CVector3& in_vector3);
    00429
    00434     SICPPSDK_INLINE CVector3& SubInPlace(const CVector3&in_vector3);
    00435
    00442     SICPPSDK_INLINE CVector3& Sub(const CVector3& in_vector3A, const CVector3& in_vector3B);
    00443
    00448     SICPPSDK_INLINE CVector3& AddInPlace(const CVector3& in_vector3);
    00449
    00455     SICPPSDK_INLINE CVector3& Add(const CVector3& in_vector3A,const CVector3& in_vector3B);
    00456
    00462     void Get(double& io_dX, double& io_dY, double& io_dZ)const;
    00463
    00470     SICPPSDK_INLINE CVector3& Set(double in_dX, double in_dY, double in_dZ);
    00471
    00475     SICPPSDK_INLINE double GetZ()const;
    00476
    00481     SICPPSDK_INLINE CVector3& PutZ(double in_dZ);
    00482
    00486     SICPPSDK_INLINE double GetY()const;
    00487
    00492     SICPPSDK_INLINE CVector3& PutY(double in_dY);
    00493
    00497     SICPPSDK_INLINE double GetX()const;
    00498
    00503     SICPPSDK_INLINE CVector3& PutX(double in_dX);
    00504
    00505 #ifdef _DEBUG_NonInitialized_CVector3
    00506     void DoDebugInit()
    00507     {
    00508         m_dX = MAGIC_DEBUG_VALUE;  // 64 bits of alternating 010101010101...
    00509         m_dY = MAGIC_DEBUG_VALUE;  // 64 bits of alternating 010101010101...
    00510         m_dZ = MAGIC_DEBUG_VALUE;  // 64 bits of alternating 010101010101...
    00511     }
    00512
    00513
    00514     void SelfDebug() const
    00515     {
    00516         assert( m_dX != MAGIC_DEBUG_VALUE && m_dY != MAGIC_DEBUG_VALUE && m_dZ != MAGIC_DEBUG_VALUE );
    00517     }
    00518 #endif
    00519
    00520 private:
    00521     double m_dX,m_dY,m_dZ;
    00522 };
    00523
    00524 //inline functions
    00525 SICPPSDK_INLINE CVector3::CVector3()
    00526 {
    00527 #ifdef _DEBUG_NonInitialized_CVector3
    00528     DoDebugInit(); // This method sets the debug values
    00529 #else
    00530     m_dX = 0;
    00531     m_dY = 0;
    00532     m_dZ = 0;
    00533 #endif
    00534 }
    00535
    00536 SICPPSDK_INLINE CVector3::CVector3( const CVector3& in_vct )
    00537 {
    00538     in_vct.Get(m_dX,m_dY,m_dZ);
    00539 }
    00540
    00541 SICPPSDK_INLINE CVector3::CVector3
    00542 (
    00543  double in_dX, double in_dY, double in_dZ
    00544 ):m_dX(in_dX),m_dY(in_dY),m_dZ(in_dZ)
    00545 {}
    00546
    00547 SICPPSDK_INLINE CVector3::~CVector3()
    00548 {}
    00549
    00550 SICPPSDK_INLINE CVector3& CVector3::operator=( const CVector3 & in_vct )
    00551 {
    00552     in_vct.Get(m_dX,m_dY,m_dZ);
    00553     return (*this);
    00554 }
    00555
    00556 SICPPSDK_INLINE bool CVector3::operator ==(const CVector3 & in_vector3 )const
    00557 {
    00558     return Equals(in_vector3);
    00559 }
    00560
    00561
    00562 SICPPSDK_INLINE bool CVector3::operator !=(const CVector3 & in_vector3 )const
    00563 {
    00564     return ! Equals(in_vector3);
    00565 }
    00566
    00567 SICPPSDK_INLINE CVector3& CVector3::operator ~()
    00568 {
    00569     return NegateInPlace();
    00570 }
    00571
    00572 SICPPSDK_INLINE CVector3& CVector3::operator +=(const CVector3& in_vector3)
    00573 {
    00574     return AddInPlace(in_vector3);
    00575 }
    00576
    00577 SICPPSDK_INLINE CVector3& CVector3::operator -=(const CVector3& in_vector3)
    00578 {
    00579     return SubInPlace(in_vector3);
    00580 }
    00581
    00582 SICPPSDK_INLINE CVector3& CVector3::operator *=(const CMatrix3& in_matrix3)
    00583 {
    00584     return MulByMatrix3InPlace(in_matrix3);
    00585 }
    00586
    00587 SICPPSDK_INLINE CVector3& CVector3::operator *=(const CMatrix4& in_matrix4)
    00588 {
    00589     return MulByMatrix4InPlace(in_matrix4);
    00590 }
    00591
    00592 SICPPSDK_INLINE CVector3& CVector3::operator *=(const CTransformation& in_transformation)
    00593 {
    00594     return MulByTransformationInPlace(in_transformation);
    00595 }
    00596
    00597 SICPPSDK_INLINE CVector3& CVector3::operator *=(const double& in_dAlpha)
    00598 {
    00599     return ScaleInPlace(in_dAlpha);
    00600 }
    00601
    00602 SICPPSDK_INLINE double CVector3::operator[](const short& in_sIndex)
    00603 {
    00604     XSI_DEBUG_VECTOR3;
    00605     assert(in_sIndex >= 0 && in_sIndex < 3);
    00606     switch(in_sIndex)
    00607     {
    00608     case 0:
    00609         return m_dX;
    00610         break;
    00611     case 1:
    00612         return m_dY;
    00613         break;
    00614     case 2:
    00615         return m_dZ;
    00616         break;
    00617     }
    00618     return DBL_MAX;
    00619 }
    00620
    00621 SICPPSDK_INLINE CVector3& CVector3::MulByMatrix3InPlace
    00622 (
    00623     const CMatrix3& in_matrix3
    00624 )
    00625 {
    00626     XSI_DEBUG_VECTOR3;
    00627     return MulByMatrix3((*this),in_matrix3);
    00628 }
    00629
    00630 SICPPSDK_INLINE CVector3& CVector3::MulByMatrix3
    00631 (
    00632     const CVector3& in_vector3,
    00633     const CMatrix3& in_matrix3
    00634 )
    00635 {
    00636     double l_dX, l_dY,l_dZ;
    00637     l_dX = in_vector3.GetX() * in_matrix3.GetValue(0,0) +
    00638            in_vector3.GetY() * in_matrix3.GetValue(1,0) +
    00639            in_vector3.GetZ() * in_matrix3.GetValue(2,0);
    00640     l_dY = in_vector3.GetX() * in_matrix3.GetValue(0,1) +
    00641            in_vector3.GetY() * in_matrix3.GetValue(1,1) +
    00642            in_vector3.GetZ() * in_matrix3.GetValue(2,1);
    00643     l_dZ = in_vector3.GetX() * in_matrix3.GetValue(0,2) +
    00644            in_vector3.GetY() * in_matrix3.GetValue(1,2) +
    00645            in_vector3.GetZ() * in_matrix3.GetValue(2,2);
    00646
    00647     return Set(l_dX,l_dY,l_dZ);
    00648 }
    00649
    00650 SICPPSDK_INLINE CVector3& CVector3::MulByMatrix4InPlace
    00651 (
    00652     const CMatrix4& in_matrix4
    00653 )
    00654 {
    00655     XSI_DEBUG_VECTOR3;
    00656     return MulByMatrix4((*this),in_matrix4);
    00657 }
    00658
    00659
    00660 SICPPSDK_INLINE CVector3& CVector3::MulByMatrix4
    00661 (
    00662     const CVector3& in_vector3,
    00663     const CMatrix4& in_matrix4
    00664 )
    00665 {
    00666     double l_dX, l_dY, l_dZ, l_dW;
    00667
    00668     l_dX =  in_vector3.GetX() * in_matrix4.GetValue( 0, 0 ) +
    00669             in_vector3.GetY() * in_matrix4.GetValue( 1, 0 ) +
    00670             in_vector3.GetZ() * in_matrix4.GetValue( 2, 0 ) +
    00671             in_matrix4.GetValue( 3, 0 );
    00672     l_dY =  in_vector3.GetX() * in_matrix4.GetValue( 0, 1 ) +
    00673             in_vector3.GetY() * in_matrix4.GetValue( 1, 1 ) +
    00674             in_vector3.GetZ() * in_matrix4.GetValue( 2, 1 ) +
    00675             in_matrix4.GetValue( 3, 1 );
    00676     l_dZ =  in_vector3.GetX() * in_matrix4.GetValue( 0, 2 ) +
    00677             in_vector3.GetY() * in_matrix4.GetValue( 1, 2 ) +
    00678             in_vector3.GetZ() * in_matrix4.GetValue( 2, 2 ) +
    00679             in_matrix4.GetValue( 3, 2 );
    00680     l_dW =  in_vector3.GetX() * in_matrix4.GetValue( 0, 3 ) +
    00681             in_vector3.GetY() * in_matrix4.GetValue( 1, 3 ) +
    00682             in_vector3.GetZ() * in_matrix4.GetValue( 2, 3 ) +
    00683             in_matrix4.GetValue( 3, 3 );
    00684
    00685     return Set(l_dX/l_dW, l_dY/l_dW, l_dZ/l_dW);
    00686 }
    00687
    00688
    00689 SICPPSDK_INLINE CVector3& CVector3::MulByTransformationInPlace
    00690 (
    00691     const CTransformation& in_crTrans
    00692 )
    00693 {
    00694     XSI_DEBUG_VECTOR3;
    00695     return MulByTransformation((*this), in_crTrans);;
    00696 }
    00697
    00698
    00699 SICPPSDK_INLINE CVector3& CVector3::PutNull()
    00700 {
    00701     m_dX = m_dY = m_dZ = 0.0;
    00702     return (*this);
    00703 }
    00704
    00705 SICPPSDK_INLINE short CVector3::GetMaxComponentIndex()const
    00706 {
    00707     XSI_DEBUG_VECTOR3;
    00708     if( m_dX > m_dY )
    00709     {
    00710         return (short)(( m_dX > m_dZ ) ? 0 : 2);
    00711     }
    00712     else
    00713     {
    00714         return (short)(( m_dY > m_dZ ) ? 1 : 2);
    00715     }
    00716 }
    00717
    00718 SICPPSDK_INLINE double CVector3::GetMaxComponent()const
    00719 {
    00720     XSI_DEBUG_VECTOR3;
    00721     if( m_dX > m_dY )
    00722     {
    00723         return ( m_dX > m_dZ ) ? m_dX : m_dZ;
    00724     }
    00725     else
    00726     {
    00727         return ( m_dY > m_dZ ) ? m_dY : m_dZ;
    00728     }
    00729 }
    00730
    00731 SICPPSDK_INLINE short CVector3::GetMinComponentIndex()const
    00732 {
    00733     XSI_DEBUG_VECTOR3;
    00734     if( m_dX < m_dY )
    00735     {
    00736         return (short)(( m_dX < m_dZ ) ? 0 : 2);
    00737     }
    00738     else
    00739     {
    00740         return (short)(( m_dY < m_dZ ) ? 1 : 2);
    00741     }
    00742 }
    00743
    00744 SICPPSDK_INLINE double CVector3::GetMinComponent()const
    00745 {
    00746     XSI_DEBUG_VECTOR3;
    00747     if( m_dX < m_dY )
    00748     {
    00749         return ( m_dX < m_dZ ) ? m_dX : m_dZ;
    00750     }
    00751     else
    00752     {
    00753         return ( m_dY < m_dZ ) ? m_dY : m_dZ;
    00754     }
    00755 }
    00756
    00757 SICPPSDK_INLINE double CVector3::GetLength()const
    00758 {
    00759     XSI_DEBUG_VECTOR3;
    00760     return sqrt( GetLengthSquared() );
    00761 }
    00762
    00763 SICPPSDK_INLINE double CVector3::GetLengthSquared()const
    00764 {
    00765     XSI_DEBUG_VECTOR3;
    00766     return(m_dX*m_dX + m_dY*m_dY + m_dZ*m_dZ );
    00767 }
    00768
    00769 SICPPSDK_INLINE double  CVector3::Dot(const CVector3& io_vec3)const
    00770 {
    00771     XSI_DEBUG_VECTOR3;
    00772     return ( m_dX*io_vec3.GetX() + m_dY*io_vec3.GetY() + m_dZ*io_vec3.GetZ() );
    00773 }
    00774
    00775 SICPPSDK_INLINE CVector3& CVector3::Cross
    00776 (
    00777     const CVector3& in_vec3A,
    00778     const CVector3& in_vec3B
    00779 )
    00780 {
    00781     double dX, dY, dZ;
    00782
    00783     dX =    in_vec3A.GetY() * in_vec3B.GetZ() -
    00784             in_vec3A.GetZ() * in_vec3B.GetY();
    00785     dY =   -in_vec3A.GetX() * in_vec3B.GetZ() +
    00786             in_vec3A.GetZ() * in_vec3B.GetX();
    00787     dZ =    in_vec3A.GetX() * in_vec3B.GetY() -
    00788             in_vec3A.GetY() * in_vec3B.GetX();
    00789
    00790    return( Set( dX, dY, dZ ) );
    00791 }
    00792
    00793 SICPPSDK_INLINE CVector3& CVector3::LinearlyInterpolate
    00794 (
    00795  const CVector3&    in_vec3A,
    00796  const CVector3&    in_vec3B,
    00797  const double       in_dAlpha
    00798 )
    00799 {
    00800     m_dX = (1 - in_dAlpha) * in_vec3A.GetX() + in_dAlpha * in_vec3B.GetX();
    00801     m_dY = (1 - in_dAlpha) * in_vec3A.GetY() + in_dAlpha * in_vec3B.GetY();
    00802     m_dZ = (1 - in_dAlpha) * in_vec3A.GetZ() + in_dAlpha * in_vec3B.GetZ();
    00803
    00804     return (*this);
    00805 }
    00806
    00807 SICPPSDK_INLINE bool CVector3::EpsilonEquals
    00808 (
    00809     const CVector3& in_cVec3,
    00810     double in_dEpsilon
    00811 )const
    00812 {
    00813     XSI_DEBUG_VECTOR3;
    00814     return (this == &in_cVec3) ? true :
    00815         (fabs( m_dX - in_cVec3.GetX() ) < ::fabs(in_dEpsilon) &&
    00816            fabs( m_dY - in_cVec3.GetY() ) < ::fabs(in_dEpsilon) &&
    00817            fabs( m_dZ - in_cVec3.GetZ() ) < ::fabs(in_dEpsilon) );
    00818 }
    00819
    00820
    00821 SICPPSDK_INLINE bool CVector3::Equals(const CVector3& in_vec3)const
    00822 {
    00823     XSI_DEBUG_VECTOR3;
    00824     return (this == &in_vec3) ? true :
    00825         ( ( m_dX == in_vec3.GetX() ) &&
    00826           ( m_dY == in_vec3.GetY() ) &&
    00827           ( m_dZ == in_vec3.GetZ() ) );
    00828 }
    00829
    00830 SICPPSDK_INLINE CVector3& CVector3::ScaleAddInPlace
    00831 (
    00832     double in_dScalingFactor,
    00833     const CVector3& in_vec3
    00834 )
    00835 {
    00836     ScaleInPlace(in_dScalingFactor);
    00837     return AddInPlace(in_vec3);
    00838 }
    00839
    00840
    00841 SICPPSDK_INLINE CVector3& CVector3::ScaleAdd
    00842 (
    00843     const double in_dScalingFactor,
    00844     const CVector3& in_vec3A,
    00845     const CVector3& in_vec3B
    00846 )
    00847 {
    00848     Scale(in_dScalingFactor, in_vec3A);
    00849     return AddInPlace(in_vec3B);
    00850 }
    00851
    00852 SICPPSDK_INLINE CVector3& CVector3::ScaleInPlace(double in_dScalingFactor)
    00853 {
    00854     XSI_DEBUG_VECTOR3;
    00855     m_dX *= in_dScalingFactor;
    00856     m_dY *= in_dScalingFactor;
    00857     m_dZ *= in_dScalingFactor;
    00858     return (*this);
    00859 }
    00860
    00861 SICPPSDK_INLINE CVector3& CVector3::Scale
    00862 (
    00863  double in_dScalingFactor,
    00864  const CVector3& in_vec3
    00865 )
    00866 {
    00867     m_dX = in_vec3.GetX() * in_dScalingFactor;
    00868     m_dY = in_vec3.GetY() * in_dScalingFactor;
    00869     m_dZ = in_vec3.GetZ() * in_dScalingFactor;
    00870     return (*this);
    00871 }
    00872
    00873 SICPPSDK_INLINE CVector3& CVector3::NegateInPlace()
    00874 {
    00875     XSI_DEBUG_VECTOR3;
    00876     m_dX = -m_dX;
    00877     m_dY = -m_dY;
    00878     m_dZ = -m_dZ;
    00879     return (*this);
    00880 }
    00881
    00882 SICPPSDK_INLINE CVector3& CVector3::Negate(const CVector3& in_vec3 )
    00883 {
    00884     m_dX = -in_vec3.GetX();
    00885     m_dY = -in_vec3.GetY();
    00886     m_dZ = -in_vec3.GetZ();
    00887     return (*this);
    00888 }
    00889
    00890 SICPPSDK_INLINE CVector3& CVector3::SubInPlace(const CVector3& in_vec3)
    00891 {
    00892     XSI_DEBUG_VECTOR3;
    00893     m_dX -= in_vec3.GetX();
    00894     m_dY -= in_vec3.GetY();
    00895     m_dZ -= in_vec3.GetZ();
    00896     return (*this);
    00897 }
    00898
    00899 SICPPSDK_INLINE CVector3& CVector3::Sub
    00900 (
    00901     const CVector3& in_vec3A,
    00902     const CVector3& in_vec3B
    00903 )
    00904 {
    00905     m_dX = in_vec3A.GetX() - in_vec3B.GetX();
    00906     m_dY = in_vec3A.GetY() - in_vec3B.GetY();
    00907     m_dZ = in_vec3A.GetZ() - in_vec3B.GetZ();
    00908     return (*this);
    00909 }
    00910
    00911 SICPPSDK_INLINE CVector3& CVector3::AddInPlace(const CVector3& in_vec3)
    00912 {
    00913     XSI_DEBUG_VECTOR3;
    00914     m_dX += in_vec3.GetX();
    00915     m_dY += in_vec3.GetY();
    00916     m_dZ += in_vec3.GetZ();
    00917     return (*this);
    00918 }
    00919
    00920 SICPPSDK_INLINE CVector3& CVector3::Add
    00921 (
    00922     const CVector3& in_vec3A,
    00923     const CVector3& in_vec3B
    00924 )
    00925 {
    00926     m_dX = in_vec3A.GetX() + in_vec3B.GetX();
    00927     m_dY = in_vec3A.GetY() + in_vec3B.GetY();
    00928     m_dZ = in_vec3A.GetZ() + in_vec3B.GetZ();
    00929     return (*this);
    00930 }
    00931
    00932
    00933 SICPPSDK_INLINE void CVector3::Get(double& io_rdX, double& io_rdY, double& io_rdZ)const
    00934 {
    00935     XSI_DEBUG_VECTOR3;
    00936     io_rdX = m_dX;
    00937     io_rdY = m_dY;
    00938     io_rdZ = m_dZ;
    00939 }
    00940
    00941 SICPPSDK_INLINE CVector3& CVector3::Set(double in_dX, double in_dY, double in_dZ)
    00942 {
    00943     m_dX = in_dX;
    00944     m_dY = in_dY;
    00945     m_dZ = in_dZ;
    00946     return (*this);
    00947 }
    00948
    00949 SICPPSDK_INLINE double CVector3::GetZ()const
    00950 {
    00951     XSI_DEBUG_VECTOR3;
    00952     return m_dZ;
    00953 }
    00954
    00955 SICPPSDK_INLINE CVector3&   CVector3::PutZ(double in_dZ)
    00956 {
    00957     m_dZ = in_dZ;
    00958     return (*this);
    00959 }
    00960
    00961 SICPPSDK_INLINE double CVector3::GetY()const
    00962 {
    00963     XSI_DEBUG_VECTOR3;
    00964     return m_dY;
    00965 }
    00966
    00967 SICPPSDK_INLINE CVector3& CVector3::PutY(double in_dY)
    00968 {
    00969     m_dY = in_dY;
    00970     return (*this);
    00971 }
    00972
    00973 SICPPSDK_INLINE double CVector3::GetX()const
    00974 {
    00975     XSI_DEBUG_VECTOR3;
    00976     return m_dX;
    00977 }
    00978
    00979 SICPPSDK_INLINE CVector3& CVector3::PutX(double in_dX)
    00980 {
    00981     m_dX = in_dX;
    00982     return (*this);
    00983 }
    00984
    00985 //*************************************************************************
    00999 //*************************************************************************
    01000 class SICPPSDKDECL CVector3Array
    01001 {
    01002 public:
    01006     CVector3Array( LONG in_size=0);
    01007
    01011     CVector3Array(const CVector3Array& in_Array);
    01012
    01014     ~CVector3Array();
    01015
    01020     CVector3Array& operator=( const CVector3Array& in_array );
    01021
    01025     LONG GetCount() const;
    01026
    01031     CStatus Add( const CVector3& in_item );
    01032
    01036     CStatus Clear();
    01037
    01043     CStatus Resize( LONG in_size);
    01044
    01051     const CVector3& operator[]( LONG in_index ) const;
    01052
    01058     CVector3& operator[]( LONG in_index );
    01059
    01065     bool operator==(const CVector3Array& in_array) const;
    01066
    01072     bool operator!=(const CVector3Array& in_array) const;
    01073
    01074
    01075 private:
    01076
    01077     void* m_ptr;
    01078 };
    01079
    01080 };
    01081 };
    01082
    01083 #endif // __XSIVECTOR3_H__