diff --git a/ostd/vecmath.hh b/ostd/vecmath.hh index a7db303..fb7ed69 100644 --- a/ostd/vecmath.hh +++ b/ostd/vecmath.hh @@ -24,6 +24,42 @@ struct Vec2 { T &operator[](Size idx) { return value[idx]; } T operator[](Size idx) const { return value[idx]; } + + Vec2 &add(T v) { + x += v; y += v; + return *this; + } + Vec2 &add(const Vec2 &o) { + x += o.x; y += o.y; + return *this; + } + + Vec2 &sub(T v) { + x -= v; y -= v; + return *this; + } + Vec2 &sub(const Vec2 &o) { + x -= o.x; y -= o.y; + return *this; + } + + Vec2 &mul(T v) { + x *= v; y *= v; + return *this; + } + Vec2 &mul(const Vec2 &o) { + x *= o.x; y *= o.y; + return *this; + } + + Vec2 &div(T v) { + x /= v; y /= v; + return *this; + } + Vec2 &div(const Vec2 &o) { + x /= o.x; y /= o.y; + return *this; + } }; template @@ -36,10 +72,29 @@ inline bool operator!=(const Vec2 &a, const Vec2 &b) { return (a.x != b.x) || (a.y != b.y); } +template +inline Vec2 operator+(const Vec2 &a, const Vec2 &b) { + return Vec2(a).add(b); +} + +template +inline Vec2 operator-(const Vec2 &a, const Vec2 &b) { + return Vec2(a).sub(b); +} + +template +inline Vec2 operator*(const Vec2 &a, const Vec2 &b) { + return Vec2(a).mul(b); +} + +template +inline Vec2 operator/(const Vec2 &a, const Vec2 &b) { + return Vec2(a).div(b); +} + using Vec2f = Vec2; using Vec2d = Vec2; using Vec2b = Vec2; -using Vec2s = Vec2; using Vec2i = Vec2; template @@ -54,6 +109,45 @@ struct Vec3 { Vec3(const Vec3 &v): x(v.x), y(v.y), z(v.z) {} Vec3(T v): x(v), y(v), z(v) {} Vec3(T x, T y, T z): x(x), y(y), z(z) {} + + T &operator[](Size idx) { return value[idx]; } + T operator[](Size idx) const { return value[idx]; } + + Vec3 &add(T v) { + x += v; y += v; z += v; + return *this; + } + Vec3 &add(const Vec3 &o) { + x += o.x; y += o.y; z += o.z; + return *this; + } + + Vec3 &sub(T v) { + x -= v; y -= v; z -= v; + return *this; + } + Vec3 &sub(const Vec3 &o) { + x -= o.x; y -= o.y; z -= o.z; + return *this; + } + + Vec3 &mul(T v) { + x *= v; y *= v; z *= v; + return *this; + } + Vec3 &mul(const Vec3 &o) { + x *= o.x; y *= o.y; z *= o.z; + return *this; + } + + Vec3 &div(T v) { + x /= v; y /= v; z /= v; + return *this; + } + Vec3 &div(const Vec3 &o) { + x /= o.x; y /= o.y; z /= o.z; + return *this; + } }; template @@ -66,10 +160,29 @@ inline bool operator!=(const Vec3 &a, const Vec3 &b) { return (a.x != b.x) || (a.y != b.y) || (a.z != b.z); } +template +inline Vec3 operator+(const Vec3 &a, const Vec3 &b) { + return Vec3(a).add(b); +} + +template +inline Vec3 operator-(const Vec3 &a, const Vec3 &b) { + return Vec3(a).sub(b); +} + +template +inline Vec3 operator*(const Vec3 &a, const Vec3 &b) { + return Vec3(a).mul(b); +} + +template +inline Vec3 operator/(const Vec3 &a, const Vec3 &b) { + return Vec3(a).div(b); +} + using Vec3f = Vec3; using Vec3d = Vec3; using Vec3b = Vec3; -using Vec3s = Vec3; using Vec3i = Vec3; template @@ -81,9 +194,48 @@ struct Vec4 { }; Vec4(): x(0), y(0), z(0), w(0) {} - Vec4(const Vec3 &v): x(v.x), y(v.y), z(v.z), w(v.w) {} + Vec4(const Vec4 &v): x(v.x), y(v.y), z(v.z), w(v.w) {} Vec4(T v): x(v), y(v), z(v), w(v) {} Vec4(T x, T y, T z, T w): x(x), y(y), z(z), w(w) {} + + T &operator[](Size idx) { return value[idx]; } + T operator[](Size idx) const { return value[idx]; } + + Vec4 &add(T v) { + x += v; y += v; z += v; w += v; + return *this; + } + Vec4 &add(const Vec4 &o) { + x += o.x; y += o.y; z += o.z; w += o.w; + return *this; + } + + Vec4 &sub(T v) { + x -= v; y -= v; z -= v; w -= v; + return *this; + } + Vec4 &sub(const Vec4 &o) { + x -= o.x; y -= o.y; z -= o.z; w -= o.w; + return *this; + } + + Vec4 &mul(T v) { + x *= v; y *= v; z *= v; w *= v; + return *this; + } + Vec4 &mul(const Vec4 &o) { + x *= o.x; y *= o.y; z *= o.z; w *= o.w; + return *this; + } + + Vec4 &div(T v) { + x /= v; y /= v; z /= v; w /= v; + return *this; + } + Vec4 &div(const Vec4 &o) { + x /= o.x; y /= o.y; z /= o.z; w /= o.w; + return *this; + } }; template @@ -96,10 +248,29 @@ inline bool operator!=(const Vec4 &a, const Vec4 &b) { return (a.x != b.x) || (a.y != b.y) || (a.z != b.z) || (a.w != b.w); } +template +inline Vec4 operator+(const Vec4 &a, const Vec4 &b) { + return Vec4(a).add(b); +} + +template +inline Vec4 operator-(const Vec4 &a, const Vec4 &b) { + return Vec4(a).sub(b); +} + +template +inline Vec4 operator*(const Vec4 &a, const Vec4 &b) { + return Vec4(a).mul(b); +} + +template +inline Vec4 operator/(const Vec4 &a, const Vec4 &b) { + return Vec4(a).div(b); +} + using Vec4f = Vec4; using Vec4d = Vec4; using Vec4b = Vec4; -using Vec4s = Vec4; using Vec4i = Vec4; } /* namespace ostd */