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/vec3.h>
42 value_type x, y, z, w;
46 value_type r, g, b, a;
50 value_type s, t, p, q;
58 value{v.x, v.y, v.z, v.w} {}
61 constexpr
t_vec4(value_type in_x, value_type in_y, value_type in_z, value_type in_w) :
62 value{in_x, in_y, in_z, in_w} {}
66 value{
static_cast<T
>(v.x),
static_cast<T
>(v.y),
static_cast<T
>(v.z),
static_cast<T
>(v.w)} {}
69 constexpr
t_vec4(
const t_vec2<R>& v, value_type in_z, value_type in_w) :
70 value{
static_cast<T
>(v.x),
static_cast<T
>(v.y), in_z, in_w} {}
74 value{
static_cast<T
>(v.x),
static_cast<T
>(v.y),
static_cast<T
>(v.z), in_w} {}
76 constexpr std::size_t size()
const {
return 4; }
78 value_type& operator[](std::size_t i) {
return value[i]; }
79 value_type operator[](std::size_t i)
const {
return value[i]; }
84 value[0] =
static_cast<value_type
>(rhs[0]);
85 value[1] =
static_cast<value_type
>(rhs[1]);
86 value[2] =
static_cast<value_type
>(rhs[2]);
87 value[3] =
static_cast<value_type
>(rhs[3]);
91 T* data() {
return value; }
92 const T* data()
const {
return value; }
94 void set(value_type in_x, value_type in_y, value_type in_z, value_type in_w)
104 value[0] += rhs.value[0];
105 value[1] += rhs.value[1];
106 value[2] += rhs.value[2];
107 value[3] += rhs.value[3];
113 value[0] -= rhs.value[0];
114 value[1] -= rhs.value[1];
115 value[2] -= rhs.value[2];
116 value[3] -= rhs.value[3];
120 inline t_vec4& operator*=(value_type rhs)
131 value[0] *= rhs.value[0];
132 value[1] *= rhs.value[1];
133 value[2] *= rhs.value[2];
134 value[3] *= rhs.value[3];
138 inline t_vec4& operator/=(value_type rhs)
140 if constexpr (std::is_floating_point_v<value_type>)
142 value_type inv =
static_cast<value_type
>(1.0) / rhs;
180 return lhs[0] == rhs[0] && lhs[1] == rhs[1] && lhs[2] == rhs[2] && lhs[3] == rhs[3];
184 constexpr
bool operator!=(
const t_vec4<T>& lhs,
const t_vec4<T>& rhs)
186 return lhs[0] != rhs[0] || lhs[1] != rhs[1] || lhs[2] != rhs[2] || lhs[3] != rhs[3];
190 constexpr
bool operator<(
const t_vec4<T>& lhs,
const t_vec4<T>& rhs)
192 if (lhs[0] < rhs[0])
return true;
193 if (lhs[0] > rhs[0])
return false;
194 if (lhs[1] < rhs[1])
return true;
195 if (lhs[1] > rhs[1])
return false;
196 if (lhs[2] < rhs[2])
return true;
197 if (lhs[2] > rhs[2])
return false;
198 return lhs[3] < rhs[3];
202 constexpr t_vec4<T> operator-(
const t_vec4<T>& lhs,
const t_vec4<T>& rhs)
204 return t_vec4<T>(lhs[0] - rhs[0], lhs[1] - rhs[1], lhs[2] - rhs[2], lhs[3] - rhs[3]);
208 constexpr t_vec4<T> operator-(
const t_vec4<T>& v)
210 return t_vec4<T>(-v[0], -v[1], -v[2], -v[3]);
214 constexpr t_vec4<T> operator+(
const t_vec4<T>& lhs,
const t_vec4<T>& rhs)
216 return t_vec4<T>(lhs[0] + rhs[0], lhs[1] + rhs[1], lhs[2] + rhs[2], lhs[3] + rhs[3]);
220 constexpr t_vec4<T> operator*(
const t_vec4<T>& lhs, T rhs)
222 return t_vec4<T>(lhs[0] * rhs, lhs[1] * rhs, lhs[2] * rhs, lhs[3] * rhs);
226 constexpr t_vec4<T> operator*(
const t_vec4<T>& lhs,
const t_vec4<T>& rhs)
228 return t_vec4<T>(lhs[0] * rhs[0], lhs[1] * rhs[1], lhs[2] * rhs[2], lhs[3] * rhs[3]);
232 constexpr t_vec4<T> operator/(
const t_vec4<T>& lhs, T rhs)
234 if constexpr (std::is_floating_point_v<T>)
236 T inv =
static_cast<T
>(1.0) / rhs;
237 return t_vec4<T>(lhs[0] * inv, lhs[1] * inv, lhs[2] * inv, lhs[3] * inv);
241 return t_vec4<T>(lhs[0] / rhs, lhs[1] / rhs, lhs[2] / rhs, lhs[3] / rhs);
246 constexpr T length(
const t_vec4<T>& v)
248 return std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3]);
252 constexpr T length2(
const t_vec4<T>& v)
254 return v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3];
258 constexpr t_vec4<T> normalize(
const t_vec4<T>& v)
260 return v / length(v);
264 constexpr t_vec4<T> mix(
const t_vec4<T>& start,
const t_vec4<T>& end, T r)
266 T one_minus_r = 1 - r;
267 return t_vec4<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,
270 start[3] * one_minus_r + end[3] * r);
275 #if defined(__clang__)
276 # pragma clang diagnostic pop
278 #if defined(__GNUC__)
279 # pragma GCC diagnostic pop
t_vec2 template class that a represents a 2D vector
Definition: vec2.h:36
t_vec3 template class that a represents a 3D vector
Definition: vec3.h:34
t_vec4 template class that a represents a 4D vector
Definition: vec4.h:34