blob: b31590e63eee2abb42f5c7d24fd74d8a04bddd9e [file] [log] [blame]
#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