diff --git a/mta-mono/mta-mono.vcxproj b/mta-mono/mta-mono.vcxproj index 5759963..6c9b44a 100644 --- a/mta-mono/mta-mono.vcxproj +++ b/mta-mono/mta-mono.vcxproj @@ -29,6 +29,8 @@ + + diff --git a/mta-mono/src/extra/Vector2.h b/mta-mono/src/extra/Vector2.h new file mode 100644 index 0000000..903002c --- /dev/null +++ b/mta-mono/src/extra/Vector2.h @@ -0,0 +1,157 @@ +/***************************************************************************** +* +* PROJECT: Multi Theft Auto v1.0 +* LICENSE: See LICENSE in the top level directory +* FILE: sdk/CVector2D.h +* PURPOSE: 2D vector class +* +* Multi Theft Auto is available from http://www.multitheftauto.com/ +* +*****************************************************************************/ + +#ifndef __CVector2D_H +#define __CVector2D_H + +#include +#include "Vector3.h" + +/** + * CVector2D Structure used to store a 2D vertex. + */ +class Vector2 +{ +public: + Vector2 ( void ) + { + fX = 0; + fY = 0; + } + + Vector2 ( float _fX, float _fY ) + { + fX = _fX; + fY = _fY; + } + + float DotProduct ( Vector2& other ) const + { + return fX*other.fX + fY*other.fY; + } + + float Length () const + { + return sqrt ( fX * fX + fY * fY ); + } + + float LengthSquared ( void ) const + { + return (fX*fX) + (fY*fY); + } + + void Normalize ( void ) + { + float fLength = Length (); + if ( fLength > 0.0f ) + { + fX /= fLength; + fY /= fLength; + } + } + + Vector2 operator * ( float fRight ) const + { + return Vector2 ( fX * fRight, fY * fRight ); + } + + Vector2 operator / ( float fRight ) const + { + float fRcpValue = 1 / fRight; + return Vector2 ( fX * fRcpValue, fY * fRcpValue ); + } + + Vector2 operator + ( const Vector2& vecRight ) const + { + return Vector2 ( fX + vecRight.fX, fY + vecRight.fY ); + } + + Vector2 operator - ( const Vector2& vecRight ) const + { + return Vector2 ( fX - vecRight.fX, fY - vecRight.fY ); + } + + Vector2 operator * ( const Vector2& vecRight ) const + { + return Vector2 ( fX * vecRight.fX, fY * vecRight.fY ); + } + + Vector2 operator / ( const Vector2& vecRight ) const + { + return Vector2 ( fX / vecRight.fX, fY / vecRight.fY ); + } + + void operator += ( float fRight ) + { + fX += fRight; + fY += fRight; + } + + void operator += ( const Vector2& vecRight ) + { + fX += vecRight.fX; + fY += vecRight.fY; + } + + void operator -= ( float fRight ) + { + fX -= fRight; + fY -= fRight; + } + + void operator -= ( const Vector2& vecRight ) + { + fX -= vecRight.fX; + fY -= vecRight.fY; + } + + void operator *= ( float fRight ) + { + fX *= fRight; + fY *= fRight; + } + + void operator *= ( const Vector2& vecRight ) + { + fX *= vecRight.fX; + fY *= vecRight.fY; + } + + void operator /= ( float fRight ) + { + fX /= fRight; + fY /= fRight; + } + + void operator /= ( const Vector2& vecRight ) + { + fX /= vecRight.fX; + fY /= vecRight.fY; + } + + bool operator== ( const Vector2& param ) const + { + return ( ( fabs ( fX - param.fX ) < FLOAT_EPSILON ) && + ( fabs ( fY - param.fY ) < FLOAT_EPSILON ) ); + } + + bool operator!= ( const Vector2& param ) const + { + return ( ( fabs ( fX - param.fX ) >= FLOAT_EPSILON ) || + ( fabs ( fY - param.fY ) >= FLOAT_EPSILON ) ); + } + + float fX; + float fY; +}; + + +#endif diff --git a/mta-mono/src/extra/Vector3.h b/mta-mono/src/extra/Vector3.h new file mode 100644 index 0000000..f1f5894 --- /dev/null +++ b/mta-mono/src/extra/Vector3.h @@ -0,0 +1,214 @@ +/***************************************************************************** +* +* PROJECT: Multi Theft Auto v1.0 +* LICENSE: See LICENSE in the top level directory +* FILE: sdk/CVector.h +* PURPOSE: 3D vector math implementation +* +* Multi Theft Auto is available from http://www.multitheftauto.com/ +* +*****************************************************************************/ + +#ifndef __CVector_H +#define __CVector_H + +#ifdef WIN32 +#include +#endif + +#include + +#define FLOAT_EPSILON 0.0001f +#define PI (3.14159265358979323846f) +/** + * CVector Structure used to store a 3D vertex. + */ +class Vector3 +{ +public: + float fX, fY, fZ; + + Vector3 () + { + this->fX = 0; + this->fY = 0; + this->fZ = 0; + }; + + Vector3 ( float fX, float fY, float fZ) + { + this->fX = fX; + this->fY = fY; + this->fZ = fZ; + } + + float Normalize ( void ) + { + float t = sqrt(fX*fX + fY*fY + fZ*fZ); + if ( t > FLOAT_EPSILON ) + { + float fRcpt = 1 / t; + fX *= fRcpt; + fY *= fRcpt; + fZ *= fRcpt; + } + else + t = 0; + return t; + } + + float Length ( void ) const + { + return sqrt ( (fX*fX) + (fY*fY) + (fZ*fZ) ); + } + + float LengthSquared ( void ) const + { + return (fX*fX) + (fY*fY) + (fZ*fZ); + } + + float DotProduct ( const Vector3 * param ) const + { + return fX*param->fX + fY*param->fY + fZ*param->fZ; + } + + void CrossProduct ( const Vector3 * param ) + { + float _fX = fX, _fY = fY, _fZ = fZ; + fX = _fY * param->fZ - param->fY * _fZ; + fY = _fZ * param->fX - param->fZ * _fX; + fZ = _fX * param->fY - param->fX * _fY; + } + + // Convert (direction) to rotation + Vector3 ToRotation ( void ) const + { + Vector3 vecRotation; + vecRotation.fZ = atan2 ( fY, fX ); + Vector3 vecTemp ( sqrt ( fX * fX + fY * fY ), fZ, 0 ); + vecTemp.Normalize (); + vecRotation.fY = atan2 ( vecTemp.fX, vecTemp.fY ) - PI / 2; + return vecRotation; + } + + // Return a perpendicular direction + Vector3 GetOtherAxis ( void ) const + { + Vector3 vecResult; + if ( abs( fX ) > abs( fY ) ) + vecResult = Vector3( fZ, 0, -fX ); + else + vecResult = Vector3( 0, -fZ, fY ); + vecResult.Normalize(); + return vecResult; + } + + Vector3 operator + ( const Vector3& vecRight ) const + { + return Vector3 ( fX + vecRight.fX, fY + vecRight.fY, fZ + vecRight.fZ ); + } + + Vector3 operator - ( const Vector3& vecRight ) const + { + return Vector3 ( fX - vecRight.fX, fY - vecRight.fY, fZ - vecRight.fZ ); + } + + Vector3 operator * ( const Vector3& vecRight ) const + { + return Vector3 ( fX * vecRight.fX, fY * vecRight.fY, fZ * vecRight.fZ ); + } + + Vector3 operator * ( float fRight ) const + { + return Vector3 ( fX * fRight, fY * fRight, fZ * fRight ); + } + + Vector3 operator / ( const Vector3& vecRight ) const + { + return Vector3 ( fX / vecRight.fX, fY / vecRight.fY, fZ / vecRight.fZ ); + } + + Vector3 operator / ( float fRight ) const + { + float fRcpValue = 1 / fRight; + return Vector3 ( fX * fRcpValue, fY * fRcpValue, fZ * fRcpValue ); + } + + Vector3 operator - () const + { + return Vector3 ( -fX, -fY, -fZ ); + } + + void operator += ( float fRight ) + { + fX += fRight; + fY += fRight; + fZ += fRight; + } + + void operator += ( const Vector3& vecRight ) + { + fX += vecRight.fX; + fY += vecRight.fY; + fZ += vecRight.fZ; + } + + void operator -= ( float fRight ) + { + fX -= fRight; + fY -= fRight; + fZ -= fRight; + } + + void operator -= ( const Vector3& vecRight ) + { + fX -= vecRight.fX; + fY -= vecRight.fY; + fZ -= vecRight.fZ; + } + + void operator *= ( float fRight ) + { + fX *= fRight; + fY *= fRight; + fZ *= fRight; + } + + void operator *= ( const Vector3& vecRight ) + { + fX *= vecRight.fX; + fY *= vecRight.fY; + fZ *= vecRight.fZ; + } + + void operator /= ( float fRight ) + { + float fRcpValue = 1 / fRight; + fX *= fRcpValue; + fY *= fRcpValue; + fZ *= fRcpValue; + } + + void operator /= ( const Vector3& vecRight ) + { + fX /= vecRight.fX; + fY /= vecRight.fY; + fZ /= vecRight.fZ; + } + + bool operator== ( const Vector3& param ) const + { + return ( ( fabs ( fX - param.fX ) < FLOAT_EPSILON ) && + ( fabs ( fY - param.fY ) < FLOAT_EPSILON ) && + ( fabs ( fZ - param.fZ ) < FLOAT_EPSILON ) ); + } + + bool operator!= ( const Vector3& param ) const + { + return ( ( fabs ( fX - param.fX ) >= FLOAT_EPSILON ) || + ( fabs ( fY - param.fY ) >= FLOAT_EPSILON ) || + ( fabs ( fZ - param.fZ ) >= FLOAT_EPSILON ) ); + } +}; + +#endif