SBSPSS/Utils/Libs/Maths/vector3.h

214 lines
4.1 KiB
C
Raw Normal View History

2000-12-04 17:58:10 +01:00
#ifndef __VECTOR3_H__
#define __VECTOR3_H__
#include "mathtypes.h"
#include "math.h"
//AF - added this to suppress warning for nonstandard [unnamed union]
#pragma warning(push)
#pragma warning(disable:4201)
// there should be _NO_ constructor
2001-01-03 23:15:22 +01:00
// there is now :o)
2000-12-04 17:58:10 +01:00
struct Vector3
{
2001-01-03 23:15:22 +01:00
Vector3(){};
Vector3(real _x,real _y,real _z)
{
x=_x;
y=_y;
z=_z;
}
2000-12-04 17:58:10 +01:00
union
{
real m_Vec[3];
struct
{
real x, y, z;
};
};
inline bool operator==( Vector3 const &other );
inline Vector3 & operator+=( Vector3 const &other );
inline Vector3 & operator-=( Vector3 const &other );
inline Vector3 & operator/=( real val );
inline Vector3 & operator*=( real val );
inline real &operator[](int idx);
inline real const &operator[](int idx) const;
inline real GetLength( void ) const;
inline real GetLengthSquared( void ) const;
inline void Normalise( void );
inline void Zero(void); //AF - hope mike don't mind me fiddling with his bits...
friend inline real operator*( Vector3 const &a, Vector3 const &b ); // dot product
friend inline Vector3 operator^( Vector3 const &a, Vector3 const &b ); // cross product
friend inline Vector3 operator+( Vector3 const &a, Vector3 const &b );
friend inline Vector3 operator-( Vector3 const &a, Vector3 const &b );
friend inline Vector3 operator*( Vector3 const &a, real val );
friend inline Vector3 operator/( Vector3 const &a, real val );
friend inline Vector3 operator*( real val, Vector3 const &a );
friend inline Vector3 operator/( real val, Vector3 const &a );
};
#pragma warning(pop)
//AF - warning no longer suppressed
inline bool Vector3::operator==( Vector3 const &other )
{
return (x==other.x && y==other.y && z==other.z);
}
inline Vector3 & Vector3::operator+=( Vector3 const &other )
{
x += other.x;
y += other.y;
z += other.z;
return *this;
}
inline Vector3 & Vector3::operator-=( Vector3 const &other )
{
x -= other.x;
y -= other.y;
z -= other.z;
return *this;
}
inline Vector3 & Vector3::operator/=( real val )
{
float temp = 1.f / val;
x *= temp;
y *= temp;
z *= temp;
return *this;
}
inline Vector3 & Vector3::operator*=( real val )
{
x *= val;
y *= val;
z *= val;
return *this;
}
inline real Vector3::GetLength( void ) const
{
real sqmag = x * x + y * y + z * z;
real mag = (real)sqrt( sqmag );
return mag;
}
inline real Vector3::GetLengthSquared( void ) const
{
real sqmag = x * x + y * y + z * z;
return sqmag;
}
inline void Vector3::Normalise( void )
{
real mag = GetLength();
real oneomag = 1.f / mag;
x *= oneomag;
y *= oneomag;
z *= oneomag;
}
inline void Vector3::Zero(void)
{
x=0;
y=0;
z=0;
}
inline real &Vector3::operator[](int idx)
{
return m_Vec[idx];
}
inline real const &Vector3::operator[](int idx) const
{
return m_Vec[idx];
}
inline real operator*( Vector3 const &a, Vector3 const &b ) // dot product, assumes
{
real tot = a.x * b.x + a.y * b.y + a.z * b.z;
return tot;
}
inline Vector3 operator^( Vector3 const &a, Vector3 const &b ) // cross product
{
Vector3 temp;
temp.x = a.y * b.z - a.z * b.y;
temp.y = a.z * b.x - a.x * b.z;
temp.z = a.x * b.y - a.y * b.x;
return temp;
}
inline Vector3 operator+( Vector3 const &a, Vector3 const &b )
{
Vector3 temp;
temp.x = a.x + b.x;
temp.y = a.y + b.y;
temp.z = a.z + b.z;
return temp;
}
inline Vector3 operator-( Vector3 const &a, Vector3 const &b )
{
Vector3 temp;
temp.x = a.x - b.x;
temp.y = a.y - b.y;
temp.z = a.z - b.z;
return temp;
}
inline Vector3 operator*( Vector3 const &a, real val )
{
Vector3 temp;
temp.x = a.x * val;
temp.y = a.y * val;
temp.z = a.z * val;
return temp;
}
inline Vector3 operator/( Vector3 const &a, real val )
{
Vector3 temp;
float oneoval = 1.f / val;
temp.x = a.x * oneoval;
temp.y = a.y * oneoval;
temp.z = a.z * oneoval;
return temp;
}
inline Vector3 operator*( real val, Vector3 const &a )
{
Vector3 temp;
temp.x = a.x * val;
temp.y = a.y * val;
temp.z = a.z * val;
return temp;
}
inline Vector3 operator/( real val, Vector3 const &a )
{
Vector3 temp;
float oneoval = 1.f / val;
temp.x = a.x * oneoval;
temp.y = a.y * oneoval;
temp.z = a.z * oneoval;
return temp;
}
#endif