#pragma once #include namespace egm { template struct tvec2 { T x; T y; tvec2() : x(0), y(0) {} tvec2(const tvec2& v) : x(v.x), y(v.y) {} template tvec2(const tvec2& v) : x((T)v.x), y((T)v.y) {} tvec2(const T& scalar) : x(scalar), y(scalar) {} tvec2(const T& scalar1, const T& scalar2) : x(scalar1), y(scalar2) {} T& operator[](const unsigned int& index) { switch (index) { case 0: return x; case 1: return y; default: throw "Index Out Of Bounds"; } } bool operator==(const tvec2& o) { return (o.x == x && o.y == y); } tvec2& operator=(const tvec2& o) { x = o.x; y = o.y; return *this; } tvec2 operator-() const { return { -x, -y, }; } tvec2 operator+(const tvec2& o) const { return { x + o.x, y + o.y }; } tvec2& operator+=(const tvec2& o) { x += o.x; y += o.y; return *this; } tvec2 operator-(const tvec2& o) const { return { x - o.x, y - o.y }; } tvec2& operator-=(const tvec2& o) { x -= o.x; y -= o.y; return *this; } tvec2 operator*(const tvec2& o) const { return { x * o.x, y * o.y }; } tvec2& operator*=(const tvec2& o) { x *= o.x; y *= o.y; return *this; } tvec2 operator*(const T& scalar) const { return { x * scalar, y * scalar }; } tvec2& operator*=(const T& scalar) { x *= scalar; y *= scalar; return *this; } tvec2 operator/(const tvec2& o) const { return { x / o.x, y / o.y }; } tvec2& operator/=(const tvec2& o) { x /= o.x; y /= o.y; return *this; } tvec2 operator/(const T& scalar) const { return { x / scalar, y / scalar }; } tvec2& operator/=(const T& scalar) { x /= scalar; y /= scalar; return *this; } T length() { return sqrt(x * x + y * y); } T length_squared() { return x * x + y * y; } void normalize() { T l = length(); x /= l; y /= l; } }; typedef tvec2 vec2; typedef tvec2 dvec2; typedef tvec2 ivec2; }