#include "math.h" namespace stingray_plugin_foundation { // Operators __forceinline Vector2 operator / (const Vector2 &lhs, const Vector2 &rhs) { return vector2(lhs.x/rhs.x, lhs.y/rhs.y); } __forceinline Vector2 operator * (const Vector2 &lhs, const Vector2 &rhs) { return vector2(lhs.x*rhs.x, lhs.y*rhs.y); } __forceinline Vector2 operator + (const Vector2 &lhs, const Vector2 &rhs) { return vector2(lhs.x+rhs.x, lhs.y+rhs.y); } __forceinline Vector2 operator - (const Vector2 &lhs, const Vector2 &rhs) { return vector2(lhs.x-rhs.x, lhs.y-rhs.y); } __forceinline Vector2 operator - (const Vector2 &v) { return vector2(-v.x, -v.y); } __forceinline Vector2 operator + (const Vector2 &v) { return v; } __forceinline void operator /= (Vector2 &lhs, const Vector2 &rhs) { lhs.x/=rhs.x; lhs.y/=rhs.y; } __forceinline void operator *= (Vector2 &lhs, const Vector2 &rhs) { lhs.x*=rhs.x; lhs.y*=rhs.y; } __forceinline void operator += (Vector2 &lhs, const Vector2 &rhs) { lhs.x+=rhs.x; lhs.y+=rhs.y; } __forceinline void operator -= (Vector2 &lhs, const Vector2 &rhs) { lhs.x-=rhs.x; lhs.y-=rhs.y; } __forceinline Vector2 operator/(const Vector2 &lhs, float rhs) { return vector2(lhs.x/rhs, lhs.y/rhs); } __forceinline Vector2 operator*(const Vector2 &lhs, float rhs) { return vector2(lhs.x*rhs, lhs.y*rhs); } __forceinline Vector2 operator*(float lhs, const Vector2 &rhs) { return vector2(rhs.x*lhs, rhs.y*lhs); } __forceinline Vector2 operator+(const Vector2 &lhs, float rhs) { return vector2(lhs.x+rhs, lhs.y+rhs); } __forceinline Vector2 operator-(const Vector2 &lhs, float rhs) { return vector2(lhs.x-rhs, lhs.y-rhs); } __forceinline void operator/=(Vector2 &lhs, float rhs) { lhs.x/=rhs; lhs.y/=rhs; } __forceinline void operator*=(Vector2 &lhs, float rhs) { lhs.x*=rhs; lhs.y*=rhs; } __forceinline void operator+=(Vector2 &lhs, float rhs) { lhs.x+=rhs; lhs.y+=rhs; } __forceinline void operator-=(Vector2 &lhs, float rhs) { lhs.x-=rhs; lhs.y-=rhs; } __forceinline bool operator==(const Vector2 &lhs, const Vector2 &rhs) { return lhs.x == rhs.x && lhs.y == rhs.y; } __forceinline bool operator!=(const Vector2 &lhs, const Vector2 &rhs) { return !(lhs == rhs); } // Methods __forceinline Vector2 vector2(float x, float y) { Vector2 v; v.x = x; v.y = y; return v; } __forceinline float & element(Vector2 &v, int i) { return *(&v.x + i); } __forceinline const float & element(const Vector2 &v, int i) { return *(&v.x + i); } __forceinline bool is_zero(const Vector2 &v) { return v.x == 0.0f && v.y == 0.0f; } __forceinline bool is_zero(const Vector2 &v, float eps) { return length_squared(v) <= eps*eps; } __forceinline void zero(Vector2 &v) { v.x=0.f; v.y=0.f; } __forceinline float length(const Vector2 &v) { return math::square_root(v.x*v.x + v.y*v.y); } __forceinline float length_squared(const Vector2 &v) { return v.x*v.x + v.y*v.y; } __forceinline Vector2 normalize(const Vector2 &v) { float l=length(v); if (l<0.0001) return vector2(0.f, 0.f); return v / l; } __forceinline float dot(const Vector2 &v0, const Vector2 &v1) { return v0.x * v1.x + v0.y * v1.y; } __forceinline float distance(const Vector2 &v0, const Vector2 &v1) { Vector2 tmp = vector2(v0.x-v1.x,v0.y-v1.y); return length(tmp); } __forceinline float distance_squared(const Vector2 &v0, const Vector2 &v1) { return (v0.x-v1.x)*(v0.x-v1.x) + (v0.y-v1.y)*(v0.y-v1.y); } __forceinline Vector2 lerp(const Vector2 &a, const Vector2 &b, float p) { return a * (1-p) + b * p; } __forceinline Vector2 min(const Vector2 &v0, const Vector2 &v1) { return vector2(math::min(v0.x,v1.x), math::min(v0.y,v1.y)); } __forceinline Vector2 max(const Vector2 &v0, const Vector2 &v1) { return vector2(math::max(v0.x,v1.x), math::max(v0.y,v1.y)); } }