| #ifndef _RIVE_VEC2D_HPP_ | |
| #define _RIVE_VEC2D_HPP_ | |
| #include "rive/rive_types.hpp" | |
| namespace rive | |
| { | |
| class Mat2D; | |
| class Vec2D | |
| { | |
| public: | |
| float x, y; | |
| Vec2D() = default; | |
| constexpr Vec2D(float x, float y) : x(x), y(y) {} | |
| float lengthSquared() const { return x * x + y * y; } | |
| float length() const; | |
| Vec2D normalized() const; | |
| // Normalize this Vec, and return its previous length | |
| float normalizeLength() | |
| { | |
| const float len = this->length(); | |
| if (len > 0) | |
| { | |
| x /= len; | |
| y /= len; | |
| } | |
| return len; | |
| } | |
| Vec2D operator-() const { return {-x, -y}; } | |
| void operator*=(float s) | |
| { | |
| x *= s; | |
| y *= s; | |
| } | |
| void operator/=(float s) | |
| { | |
| x /= s; | |
| y /= s; | |
| } | |
| friend inline Vec2D operator-(const Vec2D& a, const Vec2D& b) { return {a.x - b.x, a.y - b.y}; } | |
| static inline Vec2D lerp(Vec2D a, Vec2D b, float f); | |
| static Vec2D transformDir(const Vec2D& a, const Mat2D& m); | |
| static Vec2D transformMat2D(const Vec2D& a, const Mat2D& m); | |
| static float dot(Vec2D a, Vec2D b) { return a.x * b.x + a.y * b.y; } | |
| static float cross(Vec2D a, Vec2D b) { return a.x * b.y - a.y * b.x; } | |
| static Vec2D scaleAndAdd(Vec2D a, Vec2D b, float scale) | |
| { | |
| return { | |
| a.x + b.x * scale, | |
| a.y + b.y * scale, | |
| }; | |
| } | |
| static float distance(const Vec2D& a, const Vec2D& b) { return (a - b).length(); } | |
| static float distanceSquared(const Vec2D& a, const Vec2D& b) { return (a - b).lengthSquared(); } | |
| Vec2D& operator+=(Vec2D v) | |
| { | |
| x += v.x; | |
| y += v.y; | |
| return *this; | |
| } | |
| Vec2D& operator-=(Vec2D v) | |
| { | |
| x -= v.x; | |
| y -= v.y; | |
| return *this; | |
| } | |
| }; | |
| static_assert(std::is_pod<Vec2D>::value, "Vec2D must be plain-old-data"); | |
| inline Vec2D operator*(const Vec2D& v, float s) { return {v.x * s, v.y * s}; } | |
| inline Vec2D operator*(float s, const Vec2D& v) { return {v.x * s, v.y * s}; } | |
| inline Vec2D operator/(const Vec2D& v, float s) { return {v.x / s, v.y / s}; } | |
| inline Vec2D operator+(const Vec2D& a, const Vec2D& b) { return {a.x + b.x, a.y + b.y}; } | |
| inline bool operator==(const Vec2D& a, const Vec2D& b) { return a.x == b.x && a.y == b.y; } | |
| inline bool operator!=(const Vec2D& a, const Vec2D& b) { return a.x != b.x || a.y != b.y; } | |
| Vec2D Vec2D::lerp(Vec2D a, Vec2D b, float t) { return a + (b - a) * t; } | |
| } // namespace rive | |
| #endif |