math.beta/include/math/Vector3.h

195 lines
4.9 KiB
C++

/* __ __ ___ _____ ____
* \ \ / / / _ \ | __ \ | |
* \ \/\/ / / / \ \ | | / / | __|
* \_/\_/ /_/ \_\ |_| \_\ |_|
* Take it to the next Level
*
* 2009 Brian Ernst.
* See ReadMe.md for more license info.
*/
#ifndef __VECTOR3_H__
#define __VECTOR3_H__
# include "Debug.h"
# include "math/MathDefs.h"
template< typename BaseType >
class TVector3
{
public:
BaseType x, y, z;
TVector3( void );
TVector3( BaseType X, BaseType Y, BaseType Z );
virtual ~TVector3( void ) { }
// TODO: Implement and use epsilon comparison
bool operator==( const TVector3& ) const;
bool operator!=( const TVector3& ) const;
TVector3 operator-( void ) const;
TVector3 operator*( BaseType ) const;
TVector3 operator/( BaseType ) const;
TVector3 operator*( const TVector3& ) const;
TVector3 operator/( const TVector3& ) const;
TVector3 operator+( const TVector3& ) const;
TVector3 operator-( const TVector3& ) const;
TVector3& operator*=( BaseType );
TVector3& operator/=( BaseType );
TVector3& operator*=( const TVector3& );
TVector3& operator/=( const TVector3& );
TVector3& operator+=( const TVector3& );
TVector3& operator-=( const TVector3& );
// TODO: Add other helper functions
bool IsZero( void ) const;
// Predefined helper vectors
static TVector3 Zero;
static BaseType Epsilon;
};
typedef TVector3< Scalar > Vec3f;
template< typename BaseType >
inline TVector3< BaseType >::TVector3( void )
{
}
template< typename BaseType >
inline TVector3< BaseType >::TVector3( BaseType X, BaseType Y, BaseType Z )
: x( X )
, y( Y )
, z( Z )
{
}
template< typename BaseType >
inline bool TVector3< BaseType >::operator==( const TVector3& vect ) const
{
return cmpf( x, vect.x ) == 0 && cmpf( y, vect.y ) == 0 && cmpf( z, vect.z ) == 0;
}
template< typename BaseType >
inline bool TVector3< BaseType >::operator!=( const TVector3& vect ) const
{
return cmpf( x, vect.x ) != 0 && cmpf( y, vect.y ) != 0 && cmpf( z, vect.z ) != 0;
}
template< typename BaseType >
inline TVector3< BaseType > TVector3< BaseType >::operator-( void ) const
{
return TVector3< BaseType >( -x, -y, -z );
}
template< typename BaseType >
inline TVector3< BaseType > TVector3< BaseType >::operator*( BaseType val ) const
{
return TVector3< BaseType >( x * val, y * val, z * val );
}
template< typename BaseType >
inline TVector3< BaseType > TVector3< BaseType >::operator/( BaseType val ) const
{
return TVector3< BaseType >( x / val, y / val, z / val );
}
template< typename BaseType >
inline TVector3< BaseType > TVector3< BaseType >::operator*( const TVector3& vect ) const
{
return TVector3< BaseType >( x * vect.x, y * vect.y, z * vect.z );
}
template< typename BaseType >
inline TVector3< BaseType > TVector3< BaseType >::operator/( const TVector3& vect ) const
{
return TVector3< BaseType >( x / vect.x, y / vect.y, z / vect.z );
}
template< typename BaseType >
inline TVector3< BaseType > TVector3< BaseType >::operator+( const TVector3& vect ) const
{
return TVector3< BaseType >( x + vect.x, y + vect.y, z + vect.z );
}
template< typename BaseType >
inline TVector3< BaseType > TVector3< BaseType >::operator-( const TVector3& vect ) const
{
return TVector3< BaseType >( x - vect.x, y - vect.y, z - vect.z );
}
template< typename BaseType >
inline TVector3< BaseType >& TVector3< BaseType >::operator*=( BaseType val )
{
x *= val;
y *= val;
z *= val;
return *this;
}
template< typename BaseType >
inline TVector3< BaseType >& TVector3< BaseType >::operator/=( BaseType val )
{
x /= val;
y /= val;
z /= val;
return *this;
}
template< typename BaseType >
inline TVector3< BaseType >& TVector3< BaseType >::operator*=( const TVector3& vect )
{
x *= vect.x;
y *= vect.y;
z *= vect.z;
return *this;
}
template< typename BaseType >
inline TVector3< BaseType >& TVector3< BaseType >::operator/=( const TVector3& vect )
{
x /= vect.x;
y /= vect.y;
z /= vect.z;
return *this;
}
template< typename BaseType >
inline TVector3< BaseType >& TVector3< BaseType >::operator+=( const TVector3& vect )
{
x += vect.x;
y += vect.y;
z += vect.z;
return *this;
}
template< typename BaseType >
inline TVector3< BaseType >& TVector3< BaseType >::operator-=( const TVector3& vect )
{
x -= vect.x;
y -= vect.y;
z -= vect.z;
return *this;
}
template< typename BaseType >
inline bool TVector3< BaseType >::IsZero( void ) const
{
// TODO: Use epsilon
return x == 0 && y == 0 && z == 0;
}
template< typename BaseType >
TVector3< BaseType > TVector3< BaseType >::Zero = TVector3< BaseType >( 0, 0, 0 );
template< typename BaseType >
BaseType TVector3< BaseType >::Epsilon = std::numeric_limits< BaseType >::epsilon( );
#endif