diff options
Diffstat (limited to 'src/math/Vector.h')
-rw-r--r-- | src/math/Vector.h | 169 |
1 files changed, 56 insertions, 113 deletions
diff --git a/src/math/Vector.h b/src/math/Vector.h index e45906c8..3dba07ca 100644 --- a/src/math/Vector.h +++ b/src/math/Vector.h @@ -6,128 +6,71 @@ public: float x, y, z; CVector(void) {} CVector(float x, float y, float z) : x(x), y(y), z(z) {} -// CVector(CVector &refVector) : x(refVector.x), y(refVector.y), z(refVector.z) { } -// CVector(const CVector &refVector) : x(refVector.x), y(refVector.y), z(refVector.z) {} -// CVector(CVector2D &refVector, float _z = 0.0f) : x(refVector.x), y(refVector.y), z(_z) {} #ifdef RWCORE_H - CVector(RwV3d const &v) : x(v.x), y(v.y), z(v.z) {} + CVector(const RwV3d &v) : x(v.x), y(v.y), z(v.z) {} operator RwV3d (void) const { RwV3d vecRw = { this->x, this->y, this->z }; return vecRw; } - operator RwV3d *(void) - { - return (RwV3d *)this; + operator RwV3d *(void) { + return (RwV3d*)this; } - operator RwV3d &(void) - { - return *((RwV3d *)this); + operator RwV3d &(void) { + return *((RwV3d*)this); } #endif float Magnitude(void) const { return sqrt(x*x + y*y + z*z); } float MagnitudeSqr(void) const { return x*x + y*y + z*z; } float Magnitude2D(void) const { return sqrt(x*x + y*y); } - void Normalise(void); - - - // operator = - inline CVector const& operator = (CVector const &refRight) - { - x = refRight.x; - y = refRight.y; - z = refRight.z; - return *this; - } - - inline CVector const& operator = (float fRight) - { - x = fRight; - y = fRight; - z = fRight; - return *this; - } - - // operator += - inline CVector const& operator += (CVector const &refRight) - { - x += refRight.x; - y += refRight.y; - z += refRight.z; - return *this; - } - - inline CVector const& operator += (float fRight) - { - x += fRight; - y += fRight; - z += fRight; - return *this; - } - - // operator -= - inline CVector const& operator -= (CVector const &refRight) - { - x -= refRight.x; - y -= refRight.y; - z -= refRight.z; - return *this; + void Normalise(void) { + float sq = MagnitudeSqr(); + if(sq > 0.0f){ + float invsqrt = 1.0f/sqrt(sq); // CMaths::RecipSqrt + x *= invsqrt; + y *= invsqrt; + z *= invsqrt; + }else + x = 1.0f; } - - inline CVector const& operator -= (float fRight) - { - x -= fRight; - y -= fRight; - z -= fRight; + + inline const CVector &operator+=(CVector const &right) { + x += right.x; + y += right.y; + z += right.z; return *this; } - - // operator *= - inline CVector const& operator *= (CVector const &refRight) - { - x *= refRight.x; - y *= refRight.y; - z *= refRight.z; + + inline const CVector &operator-=(CVector const &right) { + x -= right.x; + y -= right.y; + z -= right.z; return *this; } - - inline CVector const& operator *= (float fRight) - { - x *= fRight; - y *= fRight; - z *= fRight; + + inline const CVector &operator*=(float right) { + x *= right; + y *= right; + z *= right; return *this; } - - // operator /= - inline CVector const& operator /= (CVector const &refRight) - { - x /= refRight.x; - y /= refRight.y; - z /= refRight.z; + + inline const CVector &operator/=(float right) { + x /= right; + y /= right; + z /= right; return *this; } - - inline CVector const& operator /= (float fRight) - { - x /= fRight; - y /= fRight; - z /= fRight; - return *this; + + inline CVector operator-() const { + return CVector(-x, -y, -z); } - - inline CVector operator - () const - { - return CVector(-x, -y, -z); - } - + bool IsZero(void) { return x == 0.0f && y == 0.0f && z == 0.0f; } }; -//extern CVector operator*(CMatrix const& matrix, CVector const& vector); - inline float DotProduct(const CVector &v1, const CVector &v2) { @@ -143,22 +86,22 @@ CrossProduct(const CVector &v1, const CVector &v2) v1.x*v2.y - v1.y*v2.x); } -// operator + -extern CVector operator + (CVector const &refLeft, CVector const &refRight); -extern CVector operator + (CVector const &refLeft, float fRight); -extern CVector operator + (float fLeft, CVector const &refRight); +inline CVector operator+(const CVector &left, const CVector &right) +{ + return CVector(left.x + right.x, left.y + right.y, left.z + right.z); +} + +inline CVector operator-(const CVector &left, const CVector &right) +{ + return CVector(left.x - right.x, left.y - right.y, left.z - right.z); +} -// operator - -extern CVector operator - (CVector const &refLeft, CVector const &refRight); -extern CVector operator - (CVector const &refLeft, float fRight); -extern CVector operator - (float fLeft, CVector const &refRight); - -// operator * -extern CVector operator * (CVector const &refLeft, CVector const &refRight); -extern CVector operator * (CVector const &refLeft, float fRight); -extern CVector operator * (float fLeft, CVector const &refRight); - -// operator / -extern CVector operator / (CVector const &refLeft, CVector const &refRight); -extern CVector operator / (CVector const &refLeft, float fRight); -extern CVector operator / (float fLeft, CVector const &refRight);
\ No newline at end of file +inline CVector operator*(const CVector &left, float right) +{ + return CVector(left.x * right, left.y * right, left.z * right); +} + +inline CVector operator/(const CVector &left, float right) +{ + return CVector(left.x / right, left.y / right, left.z / right); +} |