#ifndef OLC_PGE_COMMON #define OLC_PGE_COMMON #ifdef _WIN32 // Link to libraries #ifndef __MINGW32__ #pragma comment(lib, "user32.lib") #pragma comment(lib, "gdi32.lib") #pragma comment(lib, "gdiplus.lib") #else // In Code::Blocks, Select C++14 in your build options, and add the // following libs to your linker: user32 gdi32 opengl32 gdiplus #if !defined _WIN32_WINNT #ifdef HAVE_MSMF #define _WIN32_WINNT 0x0600 // Windows Vista #else #define _WIN32_WINNT 0x0500 // Windows 2000 #endif #endif #endif // Include WinAPI #include #include #else #endif #include #include namespace olc { enum rcode { FAIL = 0, OK = 1, NO_FILE = -1, }; std::wstring ConvertS2W(std::string s); template struct v2d_generic { T x = 0; T y = 0; inline v2d_generic() : x(0), y(0) { } inline v2d_generic(T _x, T _y) : x(_x), y(_y) { } inline v2d_generic(const v2d_generic& v) : x(v.x), y(v.y){ } inline T mag() { return sqrt(x * x + y * y); } inline v2d_generic norm() { T r = 1 / mag(); return v2d_generic(x*r, y*r); } inline v2d_generic perp() { return v2d_generic(-y, x); } inline T dot(const v2d_generic& rhs) { return this->x * rhs.x + this->y * rhs.y; } inline T cross(const v2d_generic& rhs) { return this->x * rhs.y - this->y * rhs.x; } inline v2d_generic operator + (const v2d_generic& rhs) const { return v2d_generic(this->x + rhs.x, this->y + rhs.y);} inline v2d_generic operator - (const v2d_generic& rhs) const { return v2d_generic(this->x - rhs.x, this->y - rhs.y);} inline v2d_generic operator * (const T& rhs) const { return v2d_generic(this->x * rhs, this->y * rhs); } inline v2d_generic operator / (const T& rhs) const { return v2d_generic(this->x / rhs, this->y / rhs); } inline v2d_generic& operator += (const v2d_generic& rhs) { this->x += rhs.x; this->y += rhs.y; return *this; } inline v2d_generic& operator -= (const v2d_generic& rhs) { this->x -= rhs.x; this->y -= rhs.y; return *this; } inline v2d_generic& operator *= (const T& rhs) { this->x *= rhs; this->y *= rhs; return *this; } inline v2d_generic& operator /= (const T& rhs) { this->x /= rhs; this->y /= rhs; return *this; } inline T& operator [] (std::size_t i) { return *((T*)this + i); /* <-- D'oh :( */ } }; template inline v2d_generic operator * (const float& lhs, const v2d_generic& rhs) { return v2d_generic(lhs * rhs.x, lhs * rhs.y); } template inline v2d_generic operator * (const double& lhs, const v2d_generic& rhs){ return v2d_generic(lhs * rhs.x, lhs * rhs.y); } template inline v2d_generic operator * (const int& lhs, const v2d_generic& rhs) { return v2d_generic(lhs * rhs.x, lhs * rhs.y); } template inline v2d_generic operator / (const float& lhs, const v2d_generic& rhs) { return v2d_generic(lhs / rhs.x, lhs / rhs.y); } template inline v2d_generic operator / (const double& lhs, const v2d_generic& rhs){ return v2d_generic(lhs / rhs.x, lhs / rhs.y); } template inline v2d_generic operator / (const int& lhs, const v2d_generic& rhs) { return v2d_generic(lhs / rhs.x, lhs / rhs.y); } typedef v2d_generic vi2d; typedef v2d_generic vf2d; typedef v2d_generic vd2d; } #endif