1 #ifndef _RIVE_VEC2D_HPP_
2 #define _RIVE_VEC2D_HPP_
4 #include "rive/rive_types.hpp"
12 constexpr Vec2D() : x(0), y(0) {}
13 constexpr Vec2D(float x, float y) : x(x), y(y) {}
14 constexpr Vec2D(const Vec2D&) = default;
16 float lengthSquared() const { return x * x + y * y; }
18 Vec2D normalized() const;
20 // Normalize this Vec, and return its previous length
21 float normalizeLength() {
22 const float len = this->length();
28 Vec2D operator-() const { return {-x, -y}; }
30 void operator*=(float s) {
35 void operator/=(float s) {
40 friend inline Vec2D operator-(const Vec2D& a, const Vec2D& b) {
41 return {a.x - b.x, a.y - b.y};
44 static inline Vec2D lerp(Vec2D a, Vec2D b, float f);
46 static Vec2D transformDir(const Vec2D& a, const Mat2D& m);
48 static float dot(Vec2D a, Vec2D b) { return a.x * b.x + a.y * b.y; }
49 static Vec2D scaleAndAdd(Vec2D a, Vec2D b, float scale) {
55 static float distance(const Vec2D& a, const Vec2D& b) { return (a - b).length(); }
56 static float distanceSquared(const Vec2D& a, const Vec2D& b) {
57 return (a - b).lengthSquared();
60 Vec2D& operator+=(Vec2D v) {
65 Vec2D& operator-=(Vec2D v) {
72 inline Vec2D operator*(const Vec2D& v, float s) { return {v.x * s, v.y * s}; }
73 inline Vec2D operator*(float s, const Vec2D& v) { return {v.x * s, v.y * s}; }
74 inline Vec2D operator/(const Vec2D& v, float s) { return {v.x / s, v.y / s}; }
76 inline Vec2D operator+(const Vec2D& a, const Vec2D& b) { return {a.x + b.x, a.y + b.y}; }
78 inline bool operator==(const Vec2D& a, const Vec2D& b) { return a.x == b.x && a.y == b.y; }
79 inline bool operator!=(const Vec2D& a, const Vec2D& b) { return a.x != b.x || a.y != b.y; }
81 Vec2D Vec2D::lerp(Vec2D a, Vec2D b, float t) {
82 return a + (b - a) * t;