12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #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 <windows.h>
- #include <gdiplus.h>
- #else
- #endif
-
- #include <string>
- #include <cmath>
-
- namespace olc {
- enum rcode {
- FAIL = 0,
- OK = 1,
- NO_FILE = -1,
- };
- std::wstring ConvertS2W(std::string s);
-
-
- template <class T>
- 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<class T> inline v2d_generic<T> operator * (const float& lhs, const v2d_generic<T>& rhs) { return v2d_generic<T>(lhs * rhs.x, lhs * rhs.y); }
- template<class T> inline v2d_generic<T> operator * (const double& lhs, const v2d_generic<T>& rhs){ return v2d_generic<T>(lhs * rhs.x, lhs * rhs.y); }
- template<class T> inline v2d_generic<T> operator * (const int& lhs, const v2d_generic<T>& rhs) { return v2d_generic<T>(lhs * rhs.x, lhs * rhs.y); }
- template<class T> inline v2d_generic<T> operator / (const float& lhs, const v2d_generic<T>& rhs) { return v2d_generic<T>(lhs / rhs.x, lhs / rhs.y); }
- template<class T> inline v2d_generic<T> operator / (const double& lhs, const v2d_generic<T>& rhs){ return v2d_generic<T>(lhs / rhs.x, lhs / rhs.y); }
- template<class T> inline v2d_generic<T> operator / (const int& lhs, const v2d_generic<T>& rhs) { return v2d_generic<T>(lhs / rhs.x, lhs / rhs.y); }
-
- typedef v2d_generic<int> vi2d;
- typedef v2d_generic<float> vf2d;
- typedef v2d_generic<double> vd2d;
- }
-
- #endif
|