-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhlam_math.h
129 lines (92 loc) · 4.27 KB
/
hlam_math.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#ifndef HLAM_MATH_H
#define HLAM_MATH_H
#include <raylib.h>
#include <cmath>
namespace hlam {
// Don't add anything, just define those here so everything (incl. operators)
// is contained in our namespace
struct Vec2 : public ::Vector2 {};
struct Vec3 : public ::Vector3 {};
struct Rect : public ::Rectangle {};
struct Triangle2 {
Vec2 p1;
Vec2 p2;
Vec2 p3;
};
struct Circle {
Vec2 center;
float radius;
};
inline bool operator==(Vec2 a, Vec2 b) { return (a.x == b.x) && (a.y == b.y); }
inline bool operator!=(Vec2 a, Vec2 b) { return !operator==(a, b); }
inline Vec2 operator+(Vec2 a) { return a; }
inline Vec2 operator-(Vec2 a) { return {-a.x, -a.y}; }
inline constexpr Vec2 operator+(Vec2 a, Vec2 b) { return {a.x + b.x, a.y + b.y}; }
inline Vec2 operator-(Vec2 a, Vec2 b) { return {a.x - b.x, a.y - b.y}; }
inline constexpr Vec2 operator*(Vec2 a, float scalar) { return {a.x * scalar, a.y * scalar}; }
inline Vec2 operator*(float scalar, Vec2 a) { return operator*(a, scalar); }
inline constexpr Vec2 operator/(Vec2 a, float scalar) { return operator*(a, 1.0f / scalar); }
/* Hadamard Product */
inline Vec2 operator*(Vec2 a, Vec2 b) { return {a.x * b.x, a.y * b.y}; }
inline Vec2 operator/(Vec2 a, Vec2 b) { return {a.x / b.x, a.y / b.y}; }
inline Vec2 &operator+=(Vec2 &a, Vec2 b) { return (a = a + b); }
inline Vec2 &operator-=(Vec2 &a, Vec2 b) { return (a = a - b); }
inline Vec2 &operator*=(Vec2 &a, float scalar) { return (a = a * scalar); }
inline Vec2 &operator/=(Vec2 &a, float scalar) { return (a = a / scalar); }
inline bool operator==(Vec3 a, Vec3 b) { return (a.x == b.x) && (a.y == b.y) && (a.z == b.z); }
inline bool operator!=(Vec3 a, Vec3 b) { return !operator==(a, b); }
inline Vec3 operator+(Vec3 a) { return a; }
inline Vec3 operator-(Vec3 a) { return {-a.x, -a.y, -a.z}; }
inline Vec3 operator+(Vec3 a, Vec3 b) { return {a.x + b.x, a.y + b.y, a.z + b.z}; }
inline Vec3 operator-(Vec3 a, Vec3 b) { return {a.x - b.x, a.y - b.y, a.z - b.z}; }
inline Vec3 operator*(Vec3 a, float scalar) { return {a.x * scalar, a.y * scalar, a.z * scalar}; }
inline Vec3 operator*(float scalar, Vec3 a) { return operator*(a, scalar); }
inline Vec3 operator/(Vec3 a, float scalar) { return operator*(a, 1.0f / scalar); }
/* Hadamard Product */
inline Vec3 operator*(Vec3 a, Vec3 b) { return {a.x * b.x, a.y * b.y, a.z * b.z}; }
inline Vec3 operator/(Vec3 a, Vec3 b) { return {a.x / b.x, a.y / b.y, a.z / b.z}; }
inline Vec3 &operator+=(Vec3 &a, Vec3 b) { return (a = a + b); }
inline Vec3 &operator-=(Vec3 &a, Vec3 b) { return (a = a - b); }
inline Vec3 &operator*=(Vec3 &a, float scalar) { return (a = a * scalar); }
inline Vec3 &operator/=(Vec3 &a, float scalar) { return (a = a / scalar); }
inline float vec_dot(const Vec2 &v0, const Vec2 &v1) { return v0.x * v1.x + v0.y * v1.y; }
inline float vec_dot(const Vec3 &v0, const Vec3 &v1) { return v0.x * v1.x + v0.y * v1.y + v0.z * v1.z; }
inline float vec_cross(const Vec2 &v0, const Vec2 &v1) { return v0.x * v1.y - v1.x * v0.y; }
inline Vec3 vec_cross(const Vec3 &v0, const Vec3 &v1) {
return {
v0.y * v1.z - v0.z * v1.y,
v0.z * v1.x - v0.x * v1.z,
v0.x * v1.y - v0.y * v1.x,
};
}
inline float vec_length(const Vec2 &v) { return std::sqrt(v.x * v.x + v.y * v.y); }
inline float vec_length(const Vec3 &v) { return std::sqrt(v.x * v.x + v.y * v.y + v.z * v.z); }
inline float vec_length_sqr(const Vec2 &v) { return v.x * v.x + v.y * v.y; }
inline float vec_length_sqr(const Vec3 &v) { return v.x * v.x + v.y * v.y + v.z * v.z; }
inline Vec2 vec_norm(const Vec2 &v) {
Vec2 result{};
auto length = vec_length(v);
if (length > 0) {
auto ilength = 1.0f / length;
result.x = v.x * ilength;
result.y = v.y * ilength;
}
return result;
}
inline float vec_dist(const Vec2 &v1, const Vec2 &v2) {
return sqrt((v1.x - v2.x) * (v1.x - v2.x) + (v1.y - v2.y) * (v1.y - v2.y));
}
inline float vec_dist_sqr(const Vec2 &v1, const Vec2 &v2) {
return ((v1.x - v2.x) * (v1.x - v2.x) + (v1.y - v2.y) * (v1.y - v2.y));
}
inline float vec_dist_sqr(const Vec3 &v1, const Vec3 &v2) {
auto dx = v2.x - v1.x;
auto dy = v2.y - v1.y;
auto dz = v2.z - v1.z;
return dx * dx + dy * dy + dz * dz;
}
} // namespace hlam
#endif /* HLAM_MATH_H */
#ifdef HLAM_MATH_IMPLEMENTATION
namespace hlam {} // namespace hlam
#endif /* HLAM_MATH_IMPLEMENTATION */