17 # pragma GCC diagnostic push
18 # pragma GCC diagnostic ignored "-Wpedantic"
20 #if defined(__clang__)
21 # pragma clang diagnostic push
22 # pragma clang diagnostic ignored "-Wgnu-anonymous-struct"
23 # pragma clang diagnostic ignored "-Wnested-anon-types"
26 #include <vsg/maths/vec2.h>
57 value{v.x, v.y, v.z} {}
59 constexpr
t_vec3(value_type in_x, value_type in_y, value_type in_z) :
60 value{in_x, in_y, in_z} {}
64 value{v.x, v.y, in_z} {}
68 value{
static_cast<T
>(v.x),
static_cast<T
>(v.y),
static_cast<T
>(v.z)} {}
70 constexpr std::size_t size()
const {
return 3; }
72 value_type& operator[](std::size_t i) {
return value[i]; }
73 value_type operator[](std::size_t i)
const {
return value[i]; }
78 value[0] =
static_cast<value_type
>(rhs[0]);
79 value[1] =
static_cast<value_type
>(rhs[1]);
80 value[2] =
static_cast<value_type
>(rhs[2]);
84 T* data() {
return value; }
85 const T* data()
const {
return value; }
87 void set(value_type in_x, value_type in_y, value_type in_z)
96 value[0] += rhs.value[0];
97 value[1] += rhs.value[1];
98 value[2] += rhs.value[2];
104 value[0] -= rhs.value[0];
105 value[1] -= rhs.value[1];
106 value[2] -= rhs.value[2];
110 inline t_vec3& operator*=(value_type rhs)
120 value[0] *= rhs.value[0];
121 value[1] *= rhs.value[1];
122 value[2] *= rhs.value[2];
126 inline t_vec3& operator/=(value_type rhs)
128 if constexpr (std::is_floating_point_v<value_type>)
130 value_type inv =
static_cast<value_type
>(1.0) / rhs;
144 explicit operator bool()
const noexcept {
return value[0] != 0.0 || value[1] != 0.0 || value[2] != 0.0; }
168 return lhs[0] == rhs[0] && lhs[1] == rhs[1] && lhs[2] == rhs[2];
172 constexpr
bool operator!=(
const t_vec3<T>& lhs,
const t_vec3<T>& rhs)
174 return lhs[0] != rhs[0] || lhs[1] != rhs[1] || lhs[2] != rhs[2];
178 constexpr
bool operator<(
const t_vec3<T>& lhs,
const t_vec3<T>& rhs)
180 if (lhs[0] < rhs[0])
return true;
181 if (lhs[0] > rhs[0])
return false;
182 if (lhs[1] < rhs[1])
return true;
183 if (lhs[1] > rhs[1])
return false;
184 return lhs[2] < rhs[2];
188 constexpr t_vec3<T> operator-(
const t_vec3<T>& lhs,
const t_vec3<T>& rhs)
190 return t_vec3<T>(lhs[0] - rhs[0], lhs[1] - rhs[1], lhs[2] - rhs[2]);
194 constexpr t_vec3<T> operator-(
const t_vec3<T>& v)
196 return t_vec3<T>(-v[0], -v[1], -v[2]);
200 constexpr t_vec3<T> operator+(
const t_vec3<T>& lhs,
const t_vec3<T>& rhs)
202 return t_vec3<T>(lhs[0] + rhs[0], lhs[1] + rhs[1], lhs[2] + rhs[2]);
206 constexpr t_vec3<T> operator*(
const t_vec3<T>& lhs, T rhs)
208 return t_vec3<T>(lhs[0] * rhs, lhs[1] * rhs, lhs[2] * rhs);
212 constexpr t_vec3<T> operator*(
const t_vec3<T>& lhs,
const t_vec3<T>& rhs)
214 return t_vec3<T>(lhs[0] * rhs[0], lhs[1] * rhs[1], lhs[2] * rhs[2]);
218 constexpr t_vec3<T> operator/(
const t_vec3<T>& lhs, T rhs)
220 if constexpr (std::is_floating_point_v<T>)
222 T inv =
static_cast<T
>(1.0) / rhs;
223 return t_vec3<T>(lhs[0] * inv, lhs[1] * inv, lhs[2] * inv);
227 return t_vec3<T>(lhs[0] / rhs, lhs[1] / rhs, lhs[2] / rhs);
232 constexpr T length(
const t_vec3<T>& v)
234 return std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
238 constexpr T length2(
const t_vec3<T>& v)
240 return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
244 constexpr t_vec3<T> normalize(
const t_vec3<T>& v)
246 return v / length(v);
250 constexpr T dot(
const t_vec3<T>& lhs,
const t_vec3<T>& rhs)
252 return lhs[0] * rhs[0] + lhs[1] * rhs[1] + lhs[2] * rhs[2];
256 constexpr t_vec3<T> cross(
const t_vec3<T>& lhs,
const t_vec3<T>& rhs)
258 return t_vec3<T>(lhs[1] * rhs[2] - rhs[1] * lhs[2],
259 lhs[2] * rhs[0] - rhs[2] * lhs[0],
260 lhs[0] * rhs[1] - rhs[0] * lhs[1]);
264 constexpr t_vec3<T> mix(
const t_vec3<T>& start,
const t_vec3<T>& end, T r)
266 T one_minus_r = 1 - r;
267 return t_vec3<T>(start[0] * one_minus_r + end[0] * r,
268 start[1] * one_minus_r + end[1] * r,
269 start[2] * one_minus_r + end[2] * r);
273 constexpr t_vec3<T> orthogonal(
const t_vec3<T>& v)
276 auto abs_x = fabs(v.x);
277 auto abs_y = fabs(v.y);
278 auto abs_z = fabs(v.z);
281 if (abs_x < abs_z)
return {0.0, v.z, -v.y};
283 else if (abs_y < abs_z)
285 return {-v.z, 0.0, v.x};
287 return {v.y, -v.x, 0.0};
292 #if defined(__clang__)
293 # pragma clang diagnostic pop
295 #if defined(__GNUC__)
296 # pragma GCC diagnostic pop
t_vec2 template class that represents a 2D vector
Definition: vec2.h:38
t_vec3 template class that represents a 3D vector
Definition: vec3.h:34