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