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__