xsi_vector4f.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 __XSIVECTOR4F_H__
    00018 #define __XSIVECTOR4F_H__
    00019
    00020 #include "sicppsdk.h"
    00021 #include "xsi_matrix4f.h"
    00022
    00023 namespace XSI {
    00024
    00025 namespace MATH {
    00026
    00027 //*****************************************************************************
    00034 //*****************************************************************************
    00035 class SICPPSDKDECL CVector4f
    00036 {
    00037 public:
    00039     SICPPSDK_INLINE CVector4f();
    00040
    00047     SICPPSDK_INLINE CVector4f(float in_fX, float in_fY, float in_fZ, float in_fW);
    00048
    00052     SICPPSDK_INLINE CVector4f( const CVector4f& in_vector4);
    00053
    00055     SICPPSDK_INLINE ~CVector4f();
    00056
    00061     SICPPSDK_INLINE CVector4f & operator=( const CVector4f & in_vector4 );
    00062
    00068     SICPPSDK_INLINE bool operator ==(const CVector4f & in_vector4 )const;
    00069
    00075     SICPPSDK_INLINE bool operator !=(const CVector4f & in_vector4 )const;
    00076
    00084     SICPPSDK_INLINE bool operator < ( const CVector4f & in_vector4 ) const;
    00085
    00090     SICPPSDK_INLINE CVector4f& operator ~();
    00091
    00097     SICPPSDK_INLINE CVector4f& operator +=(const CVector4f& in_vector4);
    00098
    00104     SICPPSDK_INLINE CVector4f& operator -=(const CVector4f & in_vector4);
    00105
    00111     SICPPSDK_INLINE CVector4f& operator *=(const CMatrix4f& in_matrix4);
    00112
    00118     SICPPSDK_INLINE CVector4f& operator *=(const float& in_fAlpha);
    00119
    00125     SICPPSDK_INLINE float operator[](const short& in_sIndex);
    00126
    00131     SICPPSDK_INLINE CVector4f& MulByMatrix4InPlace(const CMatrix4f& in_matrix4);
    00132
    00138     SICPPSDK_INLINE CVector4f& MulByMatrix4
    00139     (
    00140         const CVector4f& in_vector4,
    00141         const CMatrix4f& in_matrix4
    00142     );
    00143
    00147     SICPPSDK_INLINE CVector4f& SetNull();
    00148
    00152     float GetLength()const;
    00153
    00157     float GetLengthSquared()const;
    00158
    00162     SICPPSDK_INLINE CStatus NormalizeInPlace();
    00163
    00168     SICPPSDK_INLINE CStatus Normalize(const CVector4f& in_vector4);
    00169
    00174     SICPPSDK_INLINE float Dot(const CVector4f& in_vector4)const;
    00175
    00181     SICPPSDK_INLINE CVector4f& Cross(const CVector4f& in_vector4A, const CVector4f& in_vector4B);
    00182
    00186     CVector4f& AbsoluteInPlace();
    00187
    00192     CVector4f& Absolute(const CVector4f& in_vector4);
    00193
    00199     bool EpsilonEquals( const CVector4f& in_vector4, float in_fEpsilon) const;
    00200
    00205     SICPPSDK_INLINE bool Equals(const CVector4f& in_vector4)const;
    00206
    00212     SICPPSDK_INLINE CVector4f& ScaleAddInPlace(float in_fS,const CVector4f& in_vector4);
    00213
    00220     SICPPSDK_INLINE CVector4f& ScaleAdd
    00221     (
    00222         float               in_fS,
    00223         const CVector4f&    in_vector4A,
    00224         const CVector4f&    in_vector4B
    00225     );
    00226
    00231     SICPPSDK_INLINE CVector4f& ScaleInPlace(float in_fAlpha);
    00232
    00238     SICPPSDK_INLINE CVector4f& Scale(float in_fAlpha, const CVector4f& in_vector4);
    00239
    00243     SICPPSDK_INLINE CVector4f& NegateInPlace();
    00244
    00249     SICPPSDK_INLINE CVector4f& Negate(const CVector4f& in_vector4);
    00250
    00255     SICPPSDK_INLINE CVector4f& SubInPlace(const CVector4f& in_vector4);
    00256
    00263     SICPPSDK_INLINE CVector4f& Sub(const CVector4f& in_vector4A, const CVector4f& in_vector4B);
    00264
    00269     SICPPSDK_INLINE CVector4f& AddInPlace(const CVector4f& in_vector4);
    00270
    00276     SICPPSDK_INLINE CVector4f& Add(const CVector4f& in_vector4A,const CVector4f& in_vector4B);
    00277
    00284     SICPPSDK_INLINE void Get( float& out_fX, float& out_fY, float& out_fZ, float& out_fW )const;
    00285
    00293     SICPPSDK_INLINE CVector4f& Set(float in_fX, float in_fY, float in_fZ, float in_fW);
    00294
    00298     SICPPSDK_INLINE float GetW()const;
    00299
    00304     SICPPSDK_INLINE CVector4f& PutW(float in_fW);
    00305
    00309     SICPPSDK_INLINE float GetZ()const;
    00310
    00315     SICPPSDK_INLINE CVector4f& PutZ(float in_fZ);
    00316
    00320     SICPPSDK_INLINE float GetY()const;
    00321
    00326     SICPPSDK_INLINE CVector4f& PutY(float in_fY);
    00327
    00331     SICPPSDK_INLINE float GetX()const;
    00332
    00337     SICPPSDK_INLINE CVector4f& PutX(float in_fX);
    00338
    00339 private:
    00340     float m_fX,m_fY,m_fZ,m_fW;
    00341 };
    00342
    00343 SICPPSDK_INLINE CVector4f::CVector4f(): m_fX(0.0),m_fY(0.0),m_fZ(0.0), m_fW(0.0)
    00344 {}
    00345
    00346 SICPPSDK_INLINE CVector4f::CVector4f
    00347 (
    00348  float in_fX, float in_fY, float in_fZ, float in_fW
    00349 ):m_fX(in_fX),m_fY(in_fY),m_fZ(in_fZ), m_fW(in_fW)
    00350 {}
    00351
    00352 SICPPSDK_INLINE CVector4f::~CVector4f()
    00353 {}
    00354
    00355 SICPPSDK_INLINE CVector4f::CVector4f( const CVector4f& in_vct )
    00356 {
    00357     in_vct.Get(m_fX,m_fY,m_fZ,m_fW);
    00358 }
    00359
    00360 SICPPSDK_INLINE CVector4f& CVector4f::operator=( const CVector4f & in_vct )
    00361 {
    00362     in_vct.Get(m_fX,m_fY,m_fZ,m_fW);
    00363     return (*this);
    00364 }
    00365
    00366 SICPPSDK_INLINE bool CVector4f::operator ==(const CVector4f & in_vector4 )const
    00367 {
    00368     return Equals(in_vector4);
    00369 }
    00370
    00371 SICPPSDK_INLINE bool CVector4f::operator !=(const CVector4f & in_vector4 )const
    00372 {
    00373     return ! Equals(in_vector4);
    00374 }
    00375
    00376 SICPPSDK_INLINE bool CVector4f::operator < ( const CVector4f& in_vector4 ) const
    00377 {
    00378     if ( m_fW != in_vector4.m_fW ) return m_fW < in_vector4.m_fW;
    00379     if ( m_fZ != in_vector4.m_fZ ) return m_fZ < in_vector4.m_fZ;
    00380     if ( m_fY != in_vector4.m_fY ) return m_fY < in_vector4.m_fY;
    00381     if ( m_fX != in_vector4.m_fX ) return m_fX < in_vector4.m_fX;
    00382     return false;
    00383 }
    00384
    00385 SICPPSDK_INLINE CVector4f& CVector4f::operator ~()
    00386 {
    00387     return NegateInPlace();
    00388 }
    00389
    00390 SICPPSDK_INLINE CVector4f& CVector4f::operator +=(const CVector4f& in_vector4)
    00391 {
    00392     return AddInPlace(in_vector4);
    00393 }
    00394
    00395 SICPPSDK_INLINE CVector4f& CVector4f::operator -=(const CVector4f& in_vector4)
    00396 {
    00397     return SubInPlace(in_vector4);
    00398 }
    00399
    00400 SICPPSDK_INLINE CVector4f& CVector4f::operator *=(const CMatrix4f& in_matrix4)
    00401 {
    00402     return MulByMatrix4InPlace(in_matrix4);
    00403 }
    00404
    00405 SICPPSDK_INLINE CVector4f& CVector4f::operator *=(const float& in_fAlpha)
    00406 {
    00407     return ScaleInPlace(in_fAlpha);
    00408 }
    00409
    00410 SICPPSDK_INLINE CVector4f& CVector4f::MulByMatrix4InPlace
    00411 (
    00412     const CMatrix4f& in_matrix4
    00413 )
    00414 {
    00415     return MulByMatrix4((*this),in_matrix4);
    00416 }
    00417
    00418 SICPPSDK_INLINE CVector4f& CVector4f::MulByMatrix4
    00419 (
    00420     const CVector4f& in_vector4,
    00421     const CMatrix4f& in_matrix4
    00422 )
    00423 {
    00424     float l_fX, l_fY, l_fZ, l_fW;
    00425
    00426     l_fX =  in_vector4.GetX() * in_matrix4.GetValue( 0, 0 ) +
    00427             in_vector4.GetY() * in_matrix4.GetValue( 1, 0 ) +
    00428             in_vector4.GetZ() * in_matrix4.GetValue( 2, 0 ) +
    00429             in_vector4.GetW() * in_matrix4.GetValue( 3, 0 );
    00430     l_fY =  in_vector4.GetX() * in_matrix4.GetValue( 0, 1 ) +
    00431             in_vector4.GetY() * in_matrix4.GetValue( 1, 1 ) +
    00432             in_vector4.GetZ() * in_matrix4.GetValue( 2, 1 ) +
    00433             in_vector4.GetW() * in_matrix4.GetValue( 3, 1 );
    00434     l_fZ =  in_vector4.GetX() * in_matrix4.GetValue( 0, 2 ) +
    00435             in_vector4.GetY() * in_matrix4.GetValue( 1, 2 ) +
    00436             in_vector4.GetZ() * in_matrix4.GetValue( 2, 2 ) +
    00437             in_vector4.GetW() * in_matrix4.GetValue( 3, 2 );
    00438     l_fW =  in_vector4.GetX() * in_matrix4.GetValue( 0, 3 ) +
    00439             in_vector4.GetY() * in_matrix4.GetValue( 1, 3 ) +
    00440             in_vector4.GetZ() * in_matrix4.GetValue( 2, 3 ) +
    00441             in_vector4.GetW() * in_matrix4.GetValue( 3, 3 );
    00442
    00443     return Set(l_fX, l_fY, l_fZ, l_fW);
    00444 }
    00445
    00446 SICPPSDK_INLINE CVector4f& CVector4f::SetNull()
    00447 {
    00448     m_fX = m_fY = m_fZ = m_fW = 0.0;
    00449     return (*this);
    00450 }
    00451
    00452 SICPPSDK_INLINE float CVector4f::Dot(const CVector4f& in_vector4)const
    00453 {
    00454
    00455     return ( m_fX*in_vector4.GetX() + m_fY*in_vector4.GetY() +
    00456             m_fZ*in_vector4.GetZ() + m_fW*in_vector4.GetW());
    00457 }
    00458
    00459 SICPPSDK_INLINE bool CVector4f::Equals(const CVector4f& in_vector4)const
    00460 {
    00461     return (this == &in_vector4) ? true :
    00462             ( ( m_fX == in_vector4.GetX() ) &&
    00463               ( m_fY == in_vector4.GetY() ) &&
    00464               ( m_fZ == in_vector4.GetZ() ) &&
    00465               ( m_fW == in_vector4.GetW() ) );
    00466 }
    00467
    00468 SICPPSDK_INLINE CVector4f& CVector4f::ScaleAddInPlace
    00469 (
    00470     float in_fScalingFactor,
    00471     const CVector4f& in_vector4
    00472 )
    00473 {
    00474     ScaleInPlace(in_fScalingFactor);
    00475     return AddInPlace(in_vector4);
    00476 }
    00477
    00478 SICPPSDK_INLINE CVector4f& CVector4f::ScaleAdd
    00479 (
    00480     const float in_fScalingFactor,
    00481     const CVector4f& in_vector4A,
    00482     const CVector4f& in_vector4B
    00483 )
    00484 {
    00485     Scale(in_fScalingFactor, in_vector4A);
    00486     return AddInPlace(in_vector4B);
    00487 }
    00488
    00489 SICPPSDK_INLINE CVector4f& CVector4f::ScaleInPlace(float in_fScalingFactor)
    00490 {
    00491     m_fX *= in_fScalingFactor;
    00492     m_fY *= in_fScalingFactor;
    00493     m_fZ *= in_fScalingFactor;
    00494     m_fW *= in_fScalingFactor;
    00495     return (*this);
    00496 }
    00497
    00498 SICPPSDK_INLINE CVector4f& CVector4f::Scale
    00499 (
    00500  float in_fScalingFactor,
    00501  const CVector4f& in_vector4
    00502 )
    00503 {
    00504     m_fX = in_vector4.GetX() * in_fScalingFactor;
    00505     m_fY = in_vector4.GetY() * in_fScalingFactor;
    00506     m_fZ = in_vector4.GetZ() * in_fScalingFactor;
    00507     m_fW = in_vector4.GetW() * in_fScalingFactor;
    00508     return (*this);
    00509 }
    00510
    00511 SICPPSDK_INLINE CVector4f& CVector4f::NegateInPlace()
    00512 {
    00513     m_fX = -m_fX;
    00514     m_fY = -m_fY;
    00515     m_fZ = -m_fZ;
    00516     m_fW = -m_fW;
    00517     return (*this);
    00518 }
    00519
    00520 SICPPSDK_INLINE CVector4f& CVector4f::Negate(const CVector4f& in_vector4 )
    00521 {
    00522     m_fX = -in_vector4.GetX();
    00523     m_fY = -in_vector4.GetY();
    00524     m_fZ = -in_vector4.GetZ();
    00525     m_fW = -in_vector4.GetW();
    00526     return (*this);
    00527 }
    00528
    00529 SICPPSDK_INLINE CVector4f& CVector4f::SubInPlace(const CVector4f& in_vector4)
    00530 {
    00531     m_fX -= in_vector4.GetX();
    00532     m_fY -= in_vector4.GetY();
    00533     m_fZ -= in_vector4.GetZ();
    00534     m_fW -= in_vector4.GetW();
    00535     return (*this);
    00536 }
    00537
    00538 SICPPSDK_INLINE CVector4f& CVector4f::Sub
    00539 (
    00540     const CVector4f& in_vector4A,
    00541     const CVector4f& in_vector4B
    00542 )
    00543 {
    00544     m_fX = in_vector4A.GetX() - in_vector4B.GetX();
    00545     m_fY = in_vector4A.GetY() - in_vector4B.GetY();
    00546     m_fZ = in_vector4A.GetZ() - in_vector4B.GetZ();
    00547     m_fW = in_vector4A.GetW() - in_vector4B.GetW();
    00548     return (*this);
    00549 }
    00550
    00551 SICPPSDK_INLINE CVector4f& CVector4f::AddInPlace(const CVector4f& in_vector4)
    00552 {
    00553     m_fX += in_vector4.GetX();
    00554     m_fY += in_vector4.GetY();
    00555     m_fZ += in_vector4.GetZ();
    00556     m_fW += in_vector4.GetW();
    00557     return (*this);
    00558 }
    00559
    00560 SICPPSDK_INLINE CVector4f& CVector4f::Add
    00561 (
    00562     const CVector4f& in_vector4A,
    00563     const CVector4f& in_vector4B
    00564 )
    00565 {
    00566     m_fX = in_vector4A.GetX() + in_vector4B.GetX();
    00567     m_fY = in_vector4A.GetY() + in_vector4B.GetY();
    00568     m_fZ = in_vector4A.GetZ() + in_vector4B.GetZ();
    00569     m_fW = in_vector4A.GetW() + in_vector4B.GetW();
    00570     return (*this);
    00571 }
    00572
    00573 SICPPSDK_INLINE void CVector4f::Get
    00574 (
    00575     float& out_rdX,
    00576     float& out_rdY,
    00577     float& out_rdZ,
    00578     float& out_rdW
    00579 )const
    00580 {
    00581     out_rdX = m_fX;
    00582     out_rdY = m_fY;
    00583     out_rdZ = m_fZ;
    00584     out_rdW = m_fW;
    00585 }
    00586
    00587 SICPPSDK_INLINE CVector4f& CVector4f::Set
    00588 (
    00589     float in_fX,
    00590     float in_fY,
    00591     float in_fZ,
    00592     float in_fW
    00593 )
    00594 {
    00595     m_fX = in_fX;
    00596     m_fY = in_fY;
    00597     m_fZ = in_fZ;
    00598     m_fW = in_fW;
    00599     return (*this);
    00600 }
    00601
    00602 SICPPSDK_INLINE float CVector4f::GetW()const
    00603 {
    00604     return m_fW;
    00605 }
    00606
    00607 SICPPSDK_INLINE CVector4f&  CVector4f::PutW(float in_fW)
    00608 {
    00609     m_fW = in_fW;
    00610     return (*this);
    00611 }
    00612
    00613 SICPPSDK_INLINE float CVector4f::GetZ()const
    00614 {
    00615     return m_fZ;
    00616 }
    00617
    00618 SICPPSDK_INLINE CVector4f&  CVector4f::PutZ(float in_fZ)
    00619 {
    00620     m_fZ = in_fZ;
    00621     return (*this);
    00622 }
    00623
    00624 SICPPSDK_INLINE float CVector4f::GetY()const
    00625 {
    00626     return m_fY;
    00627 }
    00628
    00629 SICPPSDK_INLINE CVector4f& CVector4f::PutY(float in_fY)
    00630 {
    00631     m_fY = in_fY;
    00632     return (*this);
    00633 }
    00634
    00635 SICPPSDK_INLINE float CVector4f::GetX()const
    00636 {
    00637     return m_fX;
    00638 }
    00639
    00640 SICPPSDK_INLINE CVector4f& CVector4f::PutX(float in_fX)
    00641 {
    00642     m_fX = in_fX;
    00643     return (*this);
    00644 }
    00645
    00646 SICPPSDK_INLINE float CVector4f::operator[](const short& in_sIndex)
    00647 {
    00648     assert(in_sIndex >= 0 && in_sIndex < 4);
    00649     switch(in_sIndex)
    00650     {
    00651         case 0:
    00652             return m_fX;
    00653             break;
    00654         case 1:
    00655             return m_fY;
    00656             break;
    00657         case 2:
    00658             return m_fZ;
    00659             break;
    00660         case 3:
    00661             return m_fW;
    00662             break;
    00663     }
    00664     return FLT_MAX;
    00665 }
    00666
    00667 SICPPSDK_INLINE CVector4f& CVector4f::AbsoluteInPlace()
    00668 {
    00669     ::fabs(m_fX);
    00670     ::fabs(m_fY);
    00671     ::fabs(m_fZ);
    00672     ::fabs(m_fW);
    00673     return (*this);
    00674 }
    00675
    00676 SICPPSDK_INLINE CVector4f& CVector4f::Absolute(const CVector4f& in_vector4)
    00677 {
    00678     float dX, dY, dZ, dW;
    00679     in_vector4.Get(dX, dY, dZ, dW);
    00680     m_fX = ::fabs(dX);
    00681     m_fY = ::fabs(dY);
    00682     m_fZ = ::fabs(dZ);
    00683     m_fW = ::fabs(dW);
    00684
    00685     return (*this);
    00686 }
    00687 SICPPSDK_INLINE bool CVector4f::EpsilonEquals
    00688 (
    00689     const CVector4f& in_vector4,
    00690     float in_fEpsilon
    00691 )const
    00692 {
    00693     return (this == &in_vector4) ? true :
    00694         (fabs( m_fX - in_vector4.GetX() ) < ::fabs(in_fEpsilon) &&
    00695          fabs( m_fY - in_vector4.GetY() ) < ::fabs(in_fEpsilon) &&
    00696          fabs( m_fZ - in_vector4.GetZ() ) < ::fabs(in_fEpsilon) &&
    00697          fabs( m_fW - in_vector4.GetW() ) < ::fabs(in_fEpsilon));
    00698 }
    00699
    00700 SICPPSDK_INLINE float CVector4f::GetLength()const
    00701 {
    00702     return sqrt( GetLengthSquared() );
    00703 }
    00704
    00705 SICPPSDK_INLINE float CVector4f::GetLengthSquared()const
    00706 {
    00707      return(m_fX*m_fX + m_fY*m_fY + m_fZ*m_fZ  + m_fW*m_fW);
    00708 }
    00709
    00710 SICPPSDK_INLINE CStatus CVector4f::NormalizeInPlace()
    00711 {
    00712     float rLen = GetLength();
    00713
    00714     if ( rLen > MicroEPS )
    00715     {
    00716         m_fX /= rLen ;
    00717         m_fY /= rLen ;
    00718         m_fZ /= rLen ;
    00719         m_fW /= rLen ;
    00720         return CStatus::OK;
    00721     }
    00722
    00723     return CStatus::Fail;
    00724 }
    00725
    00726 SICPPSDK_INLINE CStatus CVector4f::Normalize(const CVector4f& in_vector4)
    00727 {
    00728     float rLen = in_vector4.GetLength();
    00729
    00730     if ( rLen > MicroEPS )
    00731     {
    00732         m_fX = in_vector4.GetX() / rLen ;
    00733         m_fY = in_vector4.GetY() / rLen ;
    00734         m_fZ = in_vector4.GetZ() / rLen ;
    00735         m_fW = in_vector4.GetW() / rLen ;
    00736         return CStatus::OK;
    00737     }
    00738
    00739     return CStatus::Fail;
    00740 }
    00741
    00742 };
    00743 };
    00744
    00745 #endif // __XSIVECTOR4_H__