| #ifndef _RIVE_VEC2D_HPP_ |
| #define _RIVE_VEC2D_HPP_ |
| |
| #include "rive/rive_types.hpp" |
| |
| namespace rive { |
| class Mat2D; |
| class Vec2D { |
| private: |
| float m_Buffer[2]; |
| |
| public: |
| constexpr Vec2D() : m_Buffer{0.0f, 0.0f} {} |
| constexpr Vec2D(float x, float y) : m_Buffer{x, y} {} |
| constexpr Vec2D(const Vec2D&) = default; |
| |
| float x() const { return m_Buffer[0]; } |
| float y() const { return m_Buffer[1]; } |
| inline const float* values() const { return m_Buffer; } |
| |
| float& operator[](std::size_t idx) { return m_Buffer[idx]; } |
| const float& operator[](std::size_t idx) const { return m_Buffer[idx]; } |
| |
| float lengthSquared() const { return x() * x() + y() * y(); } |
| float length() const; |
| Vec2D normalized() const; |
| |
| Vec2D operator-() const { return {-x(), -y()}; } |
| |
| void operator*=(float s) { |
| m_Buffer[0] *= s; |
| m_Buffer[1] *= s; |
| } |
| |
| friend inline Vec2D operator-(const Vec2D& a, const Vec2D& b) { |
| return {a[0] - b[0], a[1] - b[1]}; |
| } |
| |
| static Vec2D lerp(const Vec2D& a, const Vec2D& b, float f); |
| static Vec2D transformDir(const Vec2D& a, const Mat2D& m); |
| |
| static float dot(Vec2D a, Vec2D b) { return a[0] * b[0] + a[1] * b[1]; } |
| static Vec2D scaleAndAdd(Vec2D a, Vec2D b, float scale) { |
| return { |
| a[0] + b[0] * scale, |
| a[1] + b[1] * 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) { |
| m_Buffer[0] += v[0]; |
| m_Buffer[1] += v[1]; |
| return *this; |
| } |
| Vec2D& operator-=(Vec2D v) { |
| m_Buffer[0] -= v[0]; |
| m_Buffer[1] -= v[1]; |
| return *this; |
| } |
| }; |
| |
| inline Vec2D operator*(const Vec2D& v, float s) { return {v[0] * s, v[1] * s}; } |
| inline Vec2D operator*(float s, const Vec2D& v) { return {v[0] * s, v[1] * s}; } |
| inline Vec2D operator/(const Vec2D& v, float s) { return {v[0] / s, v[1] / s}; } |
| |
| inline Vec2D operator+(const Vec2D& a, const Vec2D& b) { return {a[0] + b[0], a[1] + b[1]}; } |
| |
| inline bool operator==(const Vec2D& a, const Vec2D& b) { return a[0] == b[0] && a[1] == b[1]; } |
| inline bool operator!=(const Vec2D& a, const Vec2D& b) { return a[0] != b[0] || a[1] != b[1]; } |
| } // namespace rive |
| #endif |