/* __ __ ___ _____ ____ * \ \ / / / _ \ | __ \ | | * \ \/\/ / / / \ \ | | / / | __| * \_/\_/ /_/ \_\ |_| \_\ |_| * 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( 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*( 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; static TVector3 Zero( void ); }; typedef TVector3< Scalar > Vec3f; template< typename BaseType > inline TVector3< BaseType >::TVector3( BaseType x, BaseType y, BaseType z ) : this->x( x ) , this->y( y ) , this->z( z ) { } template< typename BaseType > inline bool TVector3< BaseType >::operator==( const TVector3& vect ) const { return x == vect.x && y == vect.y && z == vect.z; } template< typename BaseType > inline bool TVector3< BaseType >::operator!=( const TVector3& vect ) const { return x != vect.x || y != vect.y || z != vect.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; } #endif