Line |
Branch |
Exec |
Source |
1 |
|
|
#include "base/vec3.h" |
2 |
|
|
|
3 |
|
|
#include <cmath> |
4 |
|
|
|
5 |
|
|
#include "base/quat.h" |
6 |
|
|
|
7 |
|
|
namespace eu |
8 |
|
|
{ |
9 |
|
|
|
10 |
|
|
//////////////////////////////////////////////////////////////////////////////// |
11 |
|
|
|
12 |
|
|
float * |
13 |
|
1 |
v3::get_data_ptr() |
14 |
|
|
{ |
15 |
|
1 |
return &x; |
16 |
|
|
} |
17 |
|
|
|
18 |
|
|
[[nodiscard]] const float * |
19 |
|
1 |
v3::get_data_ptr() const |
20 |
|
|
{ |
21 |
|
1 |
return &x; |
22 |
|
|
} |
23 |
|
|
|
24 |
|
1 |
v3::v3(float a) |
25 |
|
1 |
: x(a), y(a), z(a) |
26 |
|
|
{ |
27 |
|
1 |
} |
28 |
|
|
|
29 |
|
1 |
v3::v3(const std::tuple<float, float, float> &a) |
30 |
|
1 |
: x(std::get<0>(a)), y(std::get<1>(a)), z(std::get<2>(a)) |
31 |
|
|
{ |
32 |
|
1 |
} |
33 |
|
|
|
34 |
|
1 |
v3::v3(const float *a) |
35 |
|
1 |
: x(a[0]), y(a[1]), z(a[2]) |
36 |
|
|
{ |
37 |
|
1 |
} |
38 |
|
|
|
39 |
|
|
void |
40 |
|
3 |
v3::operator+=(const v3 &rhs) |
41 |
|
|
{ |
42 |
|
3 |
x += rhs.x; |
43 |
|
3 |
y += rhs.y; |
44 |
|
3 |
z += rhs.z; |
45 |
|
3 |
} |
46 |
|
|
|
47 |
|
|
void |
48 |
|
1 |
v3::operator-=(const v3 &rhs) |
49 |
|
|
{ |
50 |
|
1 |
x -= rhs.x; |
51 |
|
1 |
y -= rhs.y; |
52 |
|
1 |
z -= rhs.z; |
53 |
|
1 |
} |
54 |
|
|
|
55 |
|
|
v3 |
56 |
|
47 |
v3::operator-() const |
57 |
|
|
{ |
58 |
|
47 |
return {-this->x, -this->y, -this->z}; |
59 |
|
|
} |
60 |
|
|
|
61 |
|
|
v3 |
62 |
|
6 |
v3::from_to(const v3 &from, const v3 &to) |
63 |
|
|
{ |
64 |
|
6 |
return {to.x - from.x, to.y - from.y, to.z - from.z}; |
65 |
|
|
} |
66 |
|
|
|
67 |
|
|
v3 |
68 |
|
1 |
v3::from_localspace_rui(const Q& r, float right, float up, float in) |
69 |
|
|
{ |
70 |
1/2
✓ Branch 0 (2 → 3) taken 1 times.
✗ Branch 1 (2 → 12) not taken.
|
1 |
const auto vright = r.get_local_right() * right; |
71 |
1/2
✓ Branch 0 (4 → 5) taken 1 times.
✗ Branch 1 (4 → 13) not taken.
|
1 |
const auto vup = r.get_local_up() * up; |
72 |
1/2
✓ Branch 0 (6 → 7) taken 1 times.
✗ Branch 1 (6 → 14) not taken.
|
1 |
const auto vin = r.get_local_in() * in; |
73 |
|
1 |
return vright + vup + vin; |
74 |
|
|
} |
75 |
|
|
|
76 |
|
|
void |
77 |
|
58 |
v3::operator/=(float rhs) |
78 |
|
|
{ |
79 |
|
58 |
x /= rhs; |
80 |
|
58 |
y /= rhs; |
81 |
|
58 |
z /= rhs; |
82 |
|
58 |
} |
83 |
|
|
|
84 |
|
|
void |
85 |
|
56 |
v3::operator*=(float rhs) |
86 |
|
|
{ |
87 |
|
56 |
x *= rhs; |
88 |
|
56 |
y *= rhs; |
89 |
|
56 |
z *= rhs; |
90 |
|
56 |
} |
91 |
|
|
|
92 |
|
|
[[nodiscard]] float |
93 |
|
1 |
v3::get_length() const |
94 |
|
|
{ |
95 |
|
1 |
return std::sqrt(get_length_squared()); |
96 |
|
|
} |
97 |
|
|
|
98 |
|
|
bool |
99 |
|
53 |
v3::normalize() |
100 |
|
|
{ |
101 |
|
53 |
const float l2 = get_length_squared(); |
102 |
2/2
✓ Branch 0 (4 → 5) taken 2 times.
✓ Branch 1 (4 → 6) taken 51 times.
|
53 |
if (is_equal(l2, 0.0f)) |
103 |
|
|
{ |
104 |
|
2 |
*this = kk::up; |
105 |
|
2 |
return false; |
106 |
|
|
} |
107 |
|
|
else |
108 |
|
|
{ |
109 |
|
51 |
*this /= std::sqrt(l2); |
110 |
|
51 |
return true; |
111 |
|
|
} |
112 |
|
|
} |
113 |
|
|
|
114 |
|
|
[[nodiscard]] std::optional<n3> |
115 |
|
53 |
v3::get_normalized() const |
116 |
|
|
{ |
117 |
|
53 |
v3 r = *this; |
118 |
2/2
✓ Branch 0 (3 → 4) taken 2 times.
✓ Branch 1 (3 → 7) taken 51 times.
|
53 |
if (false == r.normalize()) |
119 |
|
|
{ |
120 |
|
2 |
return std::nullopt; |
121 |
|
|
} |
122 |
1/2
✓ Branch 0 (7 → 8) taken 51 times.
✗ Branch 1 (7 → 13) not taken.
|
51 |
return n3{r}; |
123 |
|
|
} |
124 |
|
|
|
125 |
|
|
//////////////////////////////////////////////////////////////////////////////// |
126 |
|
|
// Math operators |
127 |
|
|
|
128 |
|
|
v3 |
129 |
|
3 |
operator+(const v3 &lhs, const v3 &rhs) |
130 |
|
|
{ |
131 |
|
3 |
v3 r = lhs; |
132 |
|
3 |
r += rhs; |
133 |
|
3 |
return r; |
134 |
|
|
} |
135 |
|
|
|
136 |
|
|
v3 |
137 |
|
1 |
operator-(const v3 &lhs, const v3 &rhs) |
138 |
|
|
{ |
139 |
|
1 |
v3 r = lhs; |
140 |
|
1 |
r -= rhs; |
141 |
|
1 |
return r; |
142 |
|
|
} |
143 |
|
|
|
144 |
|
2 |
v3 operator*(float lhs, const v3 &rhs) |
145 |
|
|
{ |
146 |
|
2 |
v3 r = rhs; |
147 |
|
2 |
r *= lhs; |
148 |
|
2 |
return r; |
149 |
|
|
} |
150 |
|
|
|
151 |
|
54 |
v3 operator*(const v3 &lhs, float rhs) |
152 |
|
|
{ |
153 |
|
54 |
v3 r = lhs; |
154 |
|
54 |
r *= rhs; |
155 |
|
54 |
return r; |
156 |
|
|
} |
157 |
|
|
|
158 |
|
|
v3 |
159 |
|
7 |
operator/(const v3 &lhs, float rhs) |
160 |
|
|
{ |
161 |
|
7 |
v3 r = lhs; |
162 |
|
7 |
r /= rhs; |
163 |
|
7 |
return r; |
164 |
|
|
} |
165 |
|
|
|
166 |
|
|
v3 |
167 |
|
1 |
operator/(float lhs, const v3 &rhs) |
168 |
|
|
{ |
169 |
|
1 |
const v3 r{lhs / rhs.x, lhs / rhs.y, lhs / rhs.z}; |
170 |
|
1 |
return r; |
171 |
|
|
} |
172 |
|
|
|
173 |
|
|
//////////////////////////////////////////////////////////////////////////////// |
174 |
|
|
/// Functions |
175 |
|
|
|
176 |
|
1 |
v3 lerp_v3(const v3 &f, float v, const v3 &t) |
177 |
|
|
{ |
178 |
|
1 |
return v3{ |
179 |
|
1 |
lerp_float(f.x, v, t.x), |
180 |
|
1 |
lerp_float(f.y, v, t.y), |
181 |
|
1 |
lerp_float(f.z, v, t.z)}; |
182 |
|
|
} |
183 |
|
|
|
184 |
|
|
float |
185 |
|
6 |
v3::dot(const v3 &rhs) const |
186 |
|
|
{ |
187 |
|
6 |
return x * rhs.x + y * rhs.y + z * rhs.z; |
188 |
|
|
} |
189 |
|
|
|
190 |
|
|
v3 |
191 |
|
5 |
v3::cross(const v3 &u) const |
192 |
|
|
{ |
193 |
|
|
return { |
194 |
|
5 |
(y * u.z) - (z * u.y), |
195 |
|
5 |
(z * u.x) - (x * u.z), |
196 |
|
5 |
(x * u.y) - (y * u.x)}; |
197 |
|
|
} |
198 |
|
|
|
199 |
|
|
//////////////////////////////////////////////////////////////////////////////// |
200 |
|
|
/// Transformations |
201 |
|
|
|
202 |
|
|
// todo(Gustav): implement transformations |
203 |
|
|
|
204 |
|
|
//////////////////////////////////////////////////////////////////////////////// |
205 |
|
|
/// Printing |
206 |
|
|
|
207 |
|
4 |
std::string string_from(const v3 &v) { return fmt::format("({}, {}, {})", v.x, v.y, v.z); } |
208 |
|
12 |
std::string string_from(const n3 &v) { return fmt::format("({}, {}, {})", v.x, v.y, v.z); } |
209 |
|
|
|
210 |
2/4
✓ Branch 0 (2 → 3) taken 1 times.
✗ Branch 1 (2 → 10) not taken.
✓ Branch 2 (3 → 4) taken 1 times.
✗ Branch 3 (3 → 8) not taken.
|
1 |
ADD_CATCH_FORMATTER_IMPL(v3) |
211 |
2/4
✓ Branch 0 (2 → 3) taken 1 times.
✗ Branch 1 (2 → 10) not taken.
✓ Branch 2 (3 → 4) taken 1 times.
✗ Branch 3 (3 → 8) not taken.
|
1 |
ADD_CATCH_FORMATTER_IMPL(n3) |
212 |
|
|
} |
213 |
|
|
|