Files
visualizer/src/core/vmath64.hpp
2026-03-19 23:16:20 +01:00

307 lines
16 KiB
C++
Executable File

//
// 64 bit
//
union Vec2F64 {
struct {
double x, y;
};
struct {
double w, h;
};
double e[2];
};
union Vec3F64 {
struct {
double x, y, z;
};
struct {
double r, g, b;
};
struct {
double h, s, l;
};
struct {
Vec2F64 xy;
double floor;
};
struct {
double _x1;
Vec2F64 yz;
};
double e[3];
};
union Vec4F64 {
struct {
double x, y, z, w;
};
struct {
double r, g, b, a;
};
struct {
double h, s, l, a;
};
struct {
Vec3F64 rgb;
double _i1;
};
struct {
Vec3F64 xyz;
double _i2;
};
struct {
Vec2F64 xy;
Vec2F64 zw;
};
double e[4];
};
union Vec2I64 {
struct {
int64_t x, y;
};
int64_t e[2];
};
union Vec3I64 {
struct {
int64_t x;
int64_t y;
int64_t z;
};
struct {
int64_t r, g, b;
};
struct {
int64_t z_[2];
int64_t floor;
};
int64_t e[3];
};
union Vec4I64 {
struct {
int64_t x, y, z, w;
};
struct {
int64_t r, g, b, a;
};
int64_t e[4];
};
struct Rect2F64 {
union {
struct {
double x0;
double y0;
double x1;
double y1;
};
struct {
Vec2F64 min;
Vec2F64 max;
};
};
};
struct Rect3F64 {
Vec3F64 min;
Vec3F64 max;
};
// clang-format off
/*--#
for vec in ["Vec2F64", "Vec3F64", "Vec4F64"]:
v = vec.lower()
z = "(double)a.z," if vec == "Vec3F64" or vec == "Vec4F64" else ""
w = "(double)a.w," if vec == "Vec4F64" else ""
print(f"inline {vec} {vec}ITo{vec}({vec}I a) {{ return {{ (double)a.x, (double)a.y, {z} {w} }}; }}")
if z != "": z = ",-a.z"
if w != "": w = ",-a.w"
print(f"inline {vec} operator-({vec} a) {{ return {{ -a.x, -a.y {z} {w} }}; }}")
for op in ["*", "/", "+", "-"]:
for vec in ["Vec2F64", "Vec3F64", "Vec4F64"]:
x = f"a.x {op} b.x,"
y = f"a.y {op} b.y,"
z = f"a.z {op} b.z," if vec == "Vec3F64" or vec == "Vec4F64" else ""
w = f"a.w {op} b.w," if vec == "Vec4F64" else ""
print(f"inline {vec} operator{op}({vec} a, {vec} b) {{ return {{ {x} {y} {z} {w} }}; }}")
print(f"inline {vec} &operator{op}=({vec} &a, {vec} b) {{ a = a {op} b; return a; }}")
x = f"a.x {op} b,"
y = f"a.y {op} b,"
z = f"a.z {op} b," if vec == "Vec3F64" or vec == "Vec4F64" else ""
w = f"a.w {op} b," if vec == "Vec4F64" else ""
print(f"inline {vec} operator{op}({vec} a, double b) {{ return {{ {x} {y} {z} {w} }}; }}")
print(f"inline {vec} operator{op}(double b, {vec} a) {{ return {{ {x} {y} {z} {w} }}; }}")
print(f"inline {vec} &operator{op}=({vec} &a, double b) {{ a = a {op} b; return a; }}")
*/
inline Vec2F64 Vec2IToVec2(Vec2I64 a) { return { (double)a.x, (double)a.y, }; }
inline Vec3F64 Vec3IToVec3(Vec3I64 a) { return { (double)a.x, (double)a.y, (double)a.z, }; }
inline Vec4F64 Vec4IToVec4(Vec4I64 a) { return { (double)a.x, (double)a.y, (double)a.z, (double)a.w, }; }
inline Vec2F64 operator-(Vec2F64 a) { return { -a.x, -a.y }; }
inline Vec3F64 operator-(Vec3F64 a) { return { -a.x, -a.y ,-a.z }; }
inline Vec4F64 operator-(Vec4F64 a) { return { -a.x, -a.y ,-a.z ,-a.w }; }
inline Vec2F64 operator*(Vec2F64 a, Vec2F64 b) { return { a.x * b.x, a.y * b.y, }; }
inline Vec2F64 &operator*=(Vec2F64 &a, Vec2F64 b) { a = a * b; return a; }
inline Vec2F64 operator*(Vec2F64 a, double b) { return { a.x * b, a.y * b, }; }
inline Vec2F64 operator*(double b, Vec2F64 a) { return { a.x * b, a.y * b, }; }
inline Vec2F64 &operator*=(Vec2F64 &a, double b) { a = a * b; return a; }
inline Vec3F64 operator*(Vec3F64 a, Vec3F64 b) { return { a.x * b.x, a.y * b.y, a.z * b.z, }; }
inline Vec3F64 &operator*=(Vec3F64 &a, Vec3F64 b) { a = a * b; return a; }
inline Vec3F64 operator*(Vec3F64 a, double b) { return { a.x * b, a.y * b, a.z * b, }; }
inline Vec3F64 operator*(double b, Vec3F64 a) { return { a.x * b, a.y * b, a.z * b, }; }
inline Vec3F64 &operator*=(Vec3F64 &a, double b) { a = a * b; return a; }
inline Vec4F64 operator*(Vec4F64 a, Vec4F64 b) { return { a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w, }; }
inline Vec4F64 &operator*=(Vec4F64 &a, Vec4F64 b) { a = a * b; return a; }
inline Vec4F64 operator*(Vec4F64 a, double b) { return { a.x * b, a.y * b, a.z * b, a.w * b, }; }
inline Vec4F64 operator*(double b, Vec4F64 a) { return { a.x * b, a.y * b, a.z * b, a.w * b, }; }
inline Vec4F64 &operator*=(Vec4F64 &a, double b) { a = a * b; return a; }
inline Vec2F64 operator/(Vec2F64 a, Vec2F64 b) { return { a.x / b.x, a.y / b.y, }; }
inline Vec2F64 &operator/=(Vec2F64 &a, Vec2F64 b) { a = a / b; return a; }
inline Vec2F64 operator/(Vec2F64 a, double b) { return { a.x / b, a.y / b, }; }
inline Vec2F64 operator/(double b, Vec2F64 a) { return { b / a.x, b / a.y, }; }
inline Vec2F64 &operator/=(Vec2F64 &a, double b) { a = a / b; return a; }
inline Vec3F64 operator/(Vec3F64 a, Vec3F64 b) { return { a.x / b.x, a.y / b.y, a.z / b.z, }; }
inline Vec3F64 &operator/=(Vec3F64 &a, Vec3F64 b) { a = a / b; return a; }
inline Vec3F64 operator/(Vec3F64 a, double b) { return { a.x / b, a.y / b, a.z / b, }; }
inline Vec3F64 operator/(double b, Vec3F64 a) { return { b / a.x, b / a.y, b / a.z, }; }
inline Vec3F64 &operator/=(Vec3F64 &a, double b) { a = a / b; return a; }
inline Vec4F64 operator/(Vec4F64 a, Vec4F64 b) { return { a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w, }; }
inline Vec4F64 &operator/=(Vec4F64 &a, Vec4F64 b) { a = a / b; return a; }
inline Vec4F64 operator/(Vec4F64 a, double b) { return { a.x / b, a.y / b, a.z / b, a.w / b, }; }
inline Vec4F64 operator/(double b, Vec4F64 a) { return { b / a.x, b / a.y, b / a.z, b / a.w, }; }
inline Vec4F64 &operator/=(Vec4F64 &a, double b) { a = a / b; return a; }
inline Vec2F64 operator+(Vec2F64 a, Vec2F64 b) { return { a.x + b.x, a.y + b.y, }; }
inline Vec2F64 &operator+=(Vec2F64 &a, Vec2F64 b) { a = a + b; return a; }
inline Vec2F64 operator+(Vec2F64 a, double b) { return { a.x + b, a.y + b, }; }
inline Vec2F64 operator+(double b, Vec2F64 a) { return { a.x + b, a.y + b, }; }
inline Vec2F64 &operator+=(Vec2F64 &a, double b) { a = a + b; return a; }
inline Vec3F64 operator+(Vec3F64 a, Vec3F64 b) { return { a.x + b.x, a.y + b.y, a.z + b.z, }; }
inline Vec3F64 &operator+=(Vec3F64 &a, Vec3F64 b) { a = a + b; return a; }
inline Vec3F64 operator+(Vec3F64 a, double b) { return { a.x + b, a.y + b, a.z + b, }; }
inline Vec3F64 operator+(double b, Vec3F64 a) { return { a.x + b, a.y + b, a.z + b, }; }
inline Vec3F64 &operator+=(Vec3F64 &a, double b) { a = a + b; return a; }
inline Vec4F64 operator+(Vec4F64 a, Vec4F64 b) { return { a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w, }; }
inline Vec4F64 &operator+=(Vec4F64 &a, Vec4F64 b) { a = a + b; return a; }
inline Vec4F64 operator+(Vec4F64 a, double b) { return { a.x + b, a.y + b, a.z + b, a.w + b, }; }
inline Vec4F64 operator+(double b, Vec4F64 a) { return { a.x + b, a.y + b, a.z + b, a.w + b, }; }
inline Vec4F64 &operator+=(Vec4F64 &a, double b) { a = a + b; return a; }
inline Vec2F64 operator-(Vec2F64 a, Vec2F64 b) { return { a.x - b.x, a.y - b.y, }; }
inline Vec2F64 &operator-=(Vec2F64 &a, Vec2F64 b) { a = a - b; return a; }
inline Vec2F64 operator-(Vec2F64 a, double b) { return { a.x - b, a.y - b, }; }
inline Vec2F64 operator-(double b, Vec2F64 a) { return { b - a.x, b - a.y, }; }
inline Vec2F64 &operator-=(Vec2F64 &a, double b) { a = a - b; return a; }
inline Vec3F64 operator-(Vec3F64 a, Vec3F64 b) { return { a.x - b.x, a.y - b.y, a.z - b.z, }; }
inline Vec3F64 &operator-=(Vec3F64 &a, Vec3F64 b) { a = a - b; return a; }
inline Vec3F64 operator-(Vec3F64 a, double b) { return { a.x - b, a.y - b, a.z - b, }; }
inline Vec3F64 operator-(double b, Vec3F64 a) { return { b - a.x, b - a.y, b - a.z, }; }
inline Vec3F64 &operator-=(Vec3F64 &a, double b) { a = a - b; return a; }
inline Vec4F64 operator-(Vec4F64 a, Vec4F64 b) { return { a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w, }; }
inline Vec4F64 &operator-=(Vec4F64 &a, Vec4F64 b) { a = a - b; return a; }
inline Vec4F64 operator-(Vec4F64 a, double b) { return { a.x - b, a.y - b, a.z - b, a.w - b, }; }
inline Vec4F64 operator-(double b, Vec4F64 a) { return { b - a.x, b - a.y, b - a.z, b - a.w, }; }
inline Vec4F64 &operator-=(Vec4F64 &a, double b) { a = a - b; return a; }
/*END*/
inline Vec2I64 operator-(Vec2I64 a) { return { -a.x, -a.y }; }
inline Vec3I64 operator-(Vec3I64 a) { return { -a.x, -a.y ,-a.z }; }
inline Vec4I64 operator-(Vec4I64 a) { return { -a.x, -a.y ,-a.z ,-a.w }; }
inline Vec2I64 operator*(Vec2I64 a, Vec2I64 b) { return { a.x * b.x, a.y * b.y, }; }
inline Vec2I64 &operator*=(Vec2I64 &a, Vec2I64 b) { a = a * b; return a; }
inline Vec2I64 operator*(Vec2I64 a, int64_t b) { return { a.x * b, a.y * b, }; }
inline Vec2I64 operator*(int64_t b, Vec2I64 a) { return { a.x * b, a.y * b, }; }
inline Vec2I64 &operator*=(Vec2I64 &a, int64_t b) { a = a * b; return a; }
inline Vec3I64 operator*(Vec3I64 a, Vec3I64 b) { return { a.x * b.x, a.y * b.y, a.z * b.z, }; }
inline Vec3I64 &operator*=(Vec3I64 &a, Vec3I64 b) { a = a * b; return a; }
inline Vec3I64 operator*(Vec3I64 a, int64_t b) { return { a.x * b, a.y * b, a.z * b, }; }
inline Vec3I64 operator*(int64_t b, Vec3I64 a) { return { a.x * b, a.y * b, a.z * b, }; }
inline Vec3I64 &operator*=(Vec3I64 &a, int64_t b) { a = a * b; return a; }
inline Vec4I64 operator*(Vec4I64 a, Vec4I64 b) { return { a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w, }; }
inline Vec4I64 &operator*=(Vec4I64 &a, Vec4I64 b) { a = a * b; return a; }
inline Vec4I64 operator*(Vec4I64 a, int64_t b) { return { a.x * b, a.y * b, a.z * b, a.w * b, }; }
inline Vec4I64 operator*(int64_t b, Vec4I64 a) { return { a.x * b, a.y * b, a.z * b, a.w * b, }; }
inline Vec4I64 &operator*=(Vec4I64 &a, int64_t b) { a = a * b; return a; }
inline Vec2I64 operator/(Vec2I64 a, Vec2I64 b) { return { a.x / b.x, a.y / b.y, }; }
inline Vec2I64 &operator/=(Vec2I64 &a, Vec2I64 b) { a = a / b; return a; }
inline Vec2I64 operator/(Vec2I64 a, int64_t b) { return { a.x / b, a.y / b, }; }
inline Vec2I64 operator/(int64_t b, Vec2I64 a) { return { b / a.x, b / a.y, }; }
inline Vec2I64 &operator/=(Vec2I64 &a, int64_t b) { a = a / b; return a; }
inline Vec3I64 operator/(Vec3I64 a, Vec3I64 b) { return { a.x / b.x, a.y / b.y, a.z / b.z, }; }
inline Vec3I64 &operator/=(Vec3I64 &a, Vec3I64 b) { a = a / b; return a; }
inline Vec3I64 operator/(Vec3I64 a, int64_t b) { return { a.x / b, a.y / b, a.z / b, }; }
inline Vec3I64 operator/(int64_t b, Vec3I64 a) { return { b / a.x, b / a.y, b / a.z, }; }
inline Vec3I64 &operator/=(Vec3I64 &a, int64_t b) { a = a / b; return a; }
inline Vec4I64 operator/(Vec4I64 a, Vec4I64 b) { return { a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w, }; }
inline Vec4I64 &operator/=(Vec4I64 &a, Vec4I64 b) { a = a / b; return a; }
inline Vec4I64 operator/(Vec4I64 a, int64_t b) { return { a.x / b, a.y / b, a.z / b, a.w / b, }; }
inline Vec4I64 operator/(int64_t b, Vec4I64 a) { return { b / a.x, b / a.y, b / a.z, b / a.w, }; }
inline Vec4I64 &operator/=(Vec4I64 &a, int64_t b) { a = a / b; return a; }
inline Vec2I64 operator+(Vec2I64 a, Vec2I64 b) { return { a.x + b.x, a.y + b.y, }; }
inline Vec2I64 &operator+=(Vec2I64 &a, Vec2I64 b) { a = a + b; return a; }
inline Vec2I64 operator+(Vec2I64 a, int64_t b) { return { a.x + b, a.y + b, }; }
inline Vec2I64 operator+(int64_t b, Vec2I64 a) { return { a.x + b, a.y + b, }; }
inline Vec2I64 &operator+=(Vec2I64 &a, int64_t b) { a = a + b; return a; }
inline Vec3I64 operator+(Vec3I64 a, Vec3I64 b) { return { a.x + b.x, a.y + b.y, a.z + b.z, }; }
inline Vec3I64 &operator+=(Vec3I64 &a, Vec3I64 b) { a = a + b; return a; }
inline Vec3I64 operator+(Vec3I64 a, int64_t b) { return { a.x + b, a.y + b, a.z + b, }; }
inline Vec3I64 operator+(int64_t b, Vec3I64 a) { return { a.x + b, a.y + b, a.z + b, }; }
inline Vec3I64 &operator+=(Vec3I64 &a, int64_t b) { a = a + b; return a; }
inline Vec4I64 operator+(Vec4I64 a, Vec4I64 b) { return { a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w, }; }
inline Vec4I64 &operator+=(Vec4I64 &a, Vec4I64 b) { a = a + b; return a; }
inline Vec4I64 operator+(Vec4I64 a, int64_t b) { return { a.x + b, a.y + b, a.z + b, a.w + b, }; }
inline Vec4I64 operator+(int64_t b, Vec4I64 a) { return { a.x + b, a.y + b, a.z + b, a.w + b, }; }
inline Vec4I64 &operator+=(Vec4I64 &a, int64_t b) { a = a + b; return a; }
inline Vec2I64 operator-(Vec2I64 a, Vec2I64 b) { return { a.x - b.x, a.y - b.y, }; }
inline Vec2I64 &operator-=(Vec2I64 &a, Vec2I64 b) { a = a - b; return a; }
inline Vec2I64 operator-(Vec2I64 a, int64_t b) { return { a.x - b, a.y - b, }; }
inline Vec2I64 operator-(int64_t b, Vec2I64 a) { return { b - a.x, b - a.y, }; }
inline Vec2I64 &operator-=(Vec2I64 &a, int64_t b) { a = a - b; return a; }
inline Vec3I64 operator-(Vec3I64 a, Vec3I64 b) { return { a.x - b.x, a.y - b.y, a.z - b.z, }; }
inline Vec3I64 &operator-=(Vec3I64 &a, Vec3I64 b) { a = a - b; return a; }
inline Vec3I64 operator-(Vec3I64 a, int64_t b) { return { a.x - b, a.y - b, a.z - b, }; }
inline Vec3I64 operator-(int64_t b, Vec3I64 a) { return { b - a.x, b - a.y, b - a.z, }; }
inline Vec3I64 &operator-=(Vec3I64 &a, int64_t b) { a = a - b; return a; }
inline Vec4I64 operator-(Vec4I64 a, Vec4I64 b) { return { a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w, }; }
inline Vec4I64 &operator-=(Vec4I64 &a, Vec4I64 b) { a = a - b; return a; }
inline Vec4I64 operator-(Vec4I64 a, int64_t b) { return { a.x - b, a.y - b, a.z - b, a.w - b, }; }
inline Vec4I64 operator-(int64_t b, Vec4I64 a) { return { b - a.x, b - a.y, b - a.z, b - a.w, }; }
inline Vec4I64 &operator-=(Vec4I64 &a, int64_t b) { a = a - b; return a; }
inline Rect2F64 Rect2_Center(Vec2F64 center, Vec2F64 halfdim) { return {center.x - halfdim.x, center.y - halfdim.y, center.x + halfdim.x, center.y + halfdim.y}; }
inline Vec2F64 CalcSize(Rect2F64 r) { return { r.max.x - r.min.x, r.max.y - r.min.y }; }
inline Rect2F64 Rect2_Size(double x, double y, double w, double h) { return { x, y, x + w, y + h }; }
inline Rect2F64 Rect2_Size(Vec2F64 pos, Vec2F64 size) { return { pos.x, pos.y, pos.x + size.w, pos.y + size.h }; }
inline Rect2F64 Rect2_MinMax(Vec2F64 p0, Vec2F64 p1) { return {p0.x, p0.y, p1.x, p1.y }; }
inline Rect2F64 ShrinkByHalfSize(Rect2F64 rect, Vec2F64 half_size) { return {rect.min.x + half_size.x, rect.min.y + half_size.y, rect.max.x - half_size.x, rect.max.y - half_size.y}; }
inline Rect2F64 ExpandByHalfSize(Rect2F64 rect, Vec2F64 half_size) { return {rect.min.x - half_size.x, rect.min.y - half_size.y, rect.max.x + half_size.x, rect.max.y + half_size.y}; }
inline Rect2F64 Rect2_AdjustMinMax(Vec2F64 p0, Vec2F64 p1) {
Rect2F64 result = {
Minimum(p0.x, p1.x), Minimum(p0.y, p1.y),
Maximum(p0.x, p1.x), Maximum(p0.y, p1.y),
};
return result;
}
inline double GetXSize(Rect2F64 r) { return r.max.x - r.min.x; }
inline double GetYSize(Rect2F64 r) { return r.max.y - r.min.y; }
inline Vec2F64 GetSize(Rect2F64 r) { return r.max - r.min; }
inline double Lerp(double from, double to, double t) {return (1-t)*from + t*to;}
inline Vec2F64 Lerp(Vec2F64 from, Vec2F64 to, double t) {return (1-t)*from + t*to;}
inline Vec3F64 Lerp(Vec3F64 from, Vec3F64 to, double t) {return (1-t)*from + t*to;}
inline Vec4F64 Lerp(Vec4F64 from, Vec4F64 to, double t) {return (1-t)*from + t*to;}
inline Vec2 Vec2F64ToVec2(Vec2F64 a) {return Vec2{(float)a.x, (float)a.y};}
inline Rect2 Rect2F64ToRect2(Rect2F64 a) { return Rect2{(float)a.min.x, (float)a.min.y, (float)a.max.x, (float)a.max.y}; }