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/core/type_name.h>
30 #include <type_traits>
63 constexpr
t_vec2(value_type in_x, value_type in_y) :
68 value{
static_cast<T
>(v.x),
static_cast<T
>(v.y)} {}
70 constexpr std::size_t size()
const {
return 2; }
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]);
83 T* data() {
return value; }
84 const T* data()
const {
return value; }
86 void set(value_type in_x, value_type in_y)
94 value[0] += rhs.value[0];
95 value[1] += rhs.value[1];
101 value[0] -= rhs.value[0];
102 value[1] -= rhs.value[1];
106 inline t_vec2& operator*=(value_type rhs)
115 value[0] *= rhs.value[0];
116 value[1] *= rhs.value[1];
120 inline t_vec2& operator/=(value_type rhs)
122 if constexpr (std::is_floating_point_v<value_type>)
124 value_type inv =
static_cast<value_type
>(1.0) / rhs;
136 explicit operator bool()
const noexcept {
return value[0] != 0.0 || value[1] != 0.0; }
160 return lhs[0] == rhs[0] && lhs[1] == rhs[1];
164 constexpr
bool operator!=(
const t_vec2<T>& lhs,
const t_vec2<T>& rhs)
166 return lhs[0] != rhs[0] || lhs[1] != rhs[1];
170 constexpr
bool operator<(
const t_vec2<T>& lhs,
const t_vec2<T>& rhs)
172 if (lhs[0] < rhs[0])
return true;
173 if (lhs[0] > rhs[0])
return false;
174 return lhs[1] < rhs[1];
178 constexpr t_vec2<T> operator-(
const t_vec2<T>& lhs,
const t_vec2<T>& rhs)
180 return t_vec2<T>(lhs[0] - rhs[0], lhs[1] - rhs[1]);
184 constexpr t_vec2<T> operator-(
const t_vec2<T>& v)
186 return t_vec2<T>(-v[0], -v[1]);
190 constexpr t_vec2<T> operator+(
const t_vec2<T>& lhs,
const t_vec2<T>& rhs)
192 return t_vec2<T>(lhs[0] + rhs[0], lhs[1] + rhs[1]);
196 constexpr t_vec2<T> operator*(
const t_vec2<T>& lhs, T rhs)
198 return t_vec2<T>(lhs[0] * rhs, lhs[1] * rhs);
202 constexpr t_vec2<T> operator*(
const t_vec2<T>& lhs,
const t_vec2<T>& rhs)
204 return t_vec2<T>(lhs[0] * rhs[0], lhs[1] * rhs[1]);
208 constexpr t_vec2<T> operator/(
const t_vec2<T>& lhs, T rhs)
210 if constexpr (std::is_floating_point_v<T>)
212 T inv =
static_cast<T
>(1.0) / rhs;
213 return t_vec2<T>(lhs[0] * inv, lhs[1] * inv);
217 return t_vec2<T>(lhs[0] / rhs, lhs[1] / rhs);
222 constexpr T length(
const t_vec2<T>& v)
224 return std::sqrt(v[0] * v[0] + v[1] * v[1]);
228 constexpr T length2(
const t_vec2<T>& v)
230 return v[0] * v[0] + v[1] * v[1];
234 constexpr t_vec2<T> normalize(
const t_vec2<T>& v)
236 return v / length(v);
240 constexpr T dot(
const t_vec2<T>& lhs,
const t_vec2<T>& rhs)
242 return lhs[0] * rhs[0] + lhs[1] * rhs[1];
248 constexpr T cross(
const t_vec2<T>& lhs,
const t_vec2<T>& rhs)
250 return (lhs[0] * rhs[1] - rhs[0] * lhs[1]);
254 constexpr t_vec2<T> mix(
const t_vec2<T>& start,
const t_vec2<T>& end, T r)
256 T one_minus_r = 1 - r;
257 return t_vec2<T>(start[0] * one_minus_r + end[0] * r,
258 start[1] * one_minus_r + end[1] * r);
263 #if defined(__clang__)
264 # pragma clang diagnostic pop
266 #if defined(__GNUC__)
267 # pragma GCC diagnostic pop
t_vec2 template class that represents a 2D vector
Definition: vec2.h:38