|  | #ifndef _RIVE_VEC2D_HPP_ | 
|  | #define _RIVE_VEC2D_HPP_ | 
|  |  | 
|  | #include <cstddef> | 
|  |  | 
|  | namespace rive { | 
|  | class Mat2D; | 
|  | class Vec2D { | 
|  | private: | 
|  | float m_Buffer[2]; | 
|  |  | 
|  | public: | 
|  | Vec2D(); | 
|  | Vec2D(const Vec2D& copy); | 
|  | Vec2D(float x, float y); | 
|  |  | 
|  | 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]; } | 
|  |  | 
|  | static void transform(Vec2D& result, const Vec2D& a, const Mat2D& m); | 
|  | static void transformDir(Vec2D& result, const Vec2D& a, const Mat2D& m); | 
|  | static void subtract(Vec2D& result, const Vec2D& a, const Vec2D& b); | 
|  | static void add(Vec2D& result, const Vec2D& a, const Vec2D& b); | 
|  | static float length(const Vec2D& a); | 
|  | static float lengthSquared(const Vec2D& a); | 
|  | static float distance(const Vec2D& a, const Vec2D& b); | 
|  | static float distanceSquared(const Vec2D& a, const Vec2D& b); | 
|  | static void copy(Vec2D& result, const Vec2D& a); | 
|  | static void normalize(Vec2D& result, const Vec2D& a); | 
|  | static float dot(const Vec2D& a, const Vec2D& b); | 
|  | static void lerp(Vec2D& o, const Vec2D& a, const Vec2D& b, float f); | 
|  | static void scale(Vec2D& o, const Vec2D& a, float scale); | 
|  | static void | 
|  | scaleAndAdd(Vec2D& o, const Vec2D& a, const Vec2D& b, float scale); | 
|  | static void negate(Vec2D& o, const Vec2D& a); | 
|  | }; | 
|  |  | 
|  | inline Vec2D operator*(const Mat2D& a, const Vec2D& b) { | 
|  | Vec2D result; | 
|  | Vec2D::transform(result, b, a); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | inline Vec2D operator-(const Vec2D& a, const Vec2D& b) { | 
|  | Vec2D result; | 
|  | Vec2D::subtract(result, a, b); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | inline Vec2D operator+(const Vec2D& a, const Vec2D& b) { | 
|  | Vec2D result; | 
|  | Vec2D::add(result, a, b); | 
|  | return result; | 
|  | } | 
|  |  | 
|  | 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 |