17# pragma GCC diagnostic push
18# pragma GCC diagnostic ignored "-Wpedantic"
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>
27#include <vsg/vk/vulkan.h>
43 value_type x, y, z, w;
47 value_type r, g, b, a;
51 value_type s, t, p, q;
59 constexpr t_vec4(
const t_vec4& v) :
60 value{v.x, v.y, v.z, v.w} {}
61 constexpr t_vec4& operator=(
const t_vec4&) =
default;
63 constexpr t_vec4(value_type in_x, value_type in_y, value_type in_z, value_type in_w) :
64 value{in_x, in_y, in_z, in_w} {}
66 constexpr explicit t_vec4(
const VkClearColorValue& v) :
67 value{
static_cast<value_type
>(v.float32[0]),
static_cast<value_type
>(v.float32[1]),
static_cast<value_type
>(v.float32[2]),
static_cast<value_type
>(v.float32[3])} {}
70 constexpr explicit t_vec4(
const t_vec4<R>& v) :
71 value{
static_cast<T
>(v.x),
static_cast<T
>(v.y),
static_cast<T
>(v.z),
static_cast<T
>(v.w)} {}
74 constexpr t_vec4(
const t_vec2<R>& v, value_type in_z, value_type in_w) :
75 value{
static_cast<T
>(v.x),
static_cast<T
>(v.y), in_z, in_w} {}
78 constexpr t_vec4(
const t_vec3<R>& v, value_type in_w) :
79 value{
static_cast<T
>(v.x),
static_cast<T
>(v.y),
static_cast<T
>(v.z), in_w} {}
81 constexpr std::size_t size()
const {
return 4; }
83 value_type& operator[](std::size_t i) {
return value[i]; }
84 value_type operator[](std::size_t i)
const {
return value[i]; }
87 t_vec4& operator=(
const t_vec4<R>& rhs)
89 value[0] =
static_cast<value_type
>(rhs[0]);
90 value[1] =
static_cast<value_type
>(rhs[1]);
91 value[2] =
static_cast<value_type
>(rhs[2]);
92 value[3] =
static_cast<value_type
>(rhs[3]);
96 t_vec4& operator=(
const VkClearColorValue& v)
98 value[0] =
static_cast<value_type
>(v.float32[0]);
99 value[1] =
static_cast<value_type
>(v.float32[1]);
100 value[2] =
static_cast<value_type
>(v.float32[2]);
101 value[3] =
static_cast<value_type
>(v.float32[3]);
105 T* data() {
return value; }
106 const T* data()
const {
return value; }
108 void set(value_type in_x, value_type in_y, value_type in_z, value_type in_w)
116 inline t_vec4& operator+=(
const t_vec4& rhs)
118 value[0] += rhs.value[0];
119 value[1] += rhs.value[1];
120 value[2] += rhs.value[2];
121 value[3] += rhs.value[3];
125 inline t_vec4& operator-=(
const t_vec4& rhs)
127 value[0] -= rhs.value[0];
128 value[1] -= rhs.value[1];
129 value[2] -= rhs.value[2];
130 value[3] -= rhs.value[3];
134 inline t_vec4& operator*=(value_type rhs)
143 inline t_vec4& operator*=(
const t_vec4& rhs)
145 value[0] *= rhs.value[0];
146 value[1] *= rhs.value[1];
147 value[2] *= rhs.value[2];
148 value[3] *= rhs.value[3];
152 inline t_vec4& operator/=(value_type rhs)
154 if constexpr (std::is_floating_point_v<value_type>)
156 value_type inv =
static_cast<value_type
>(1.0) / rhs;
172 operator VkClearColorValue()
const noexcept {
return VkClearColorValue{{r, g, b, a}}; }
174 explicit operator bool()
const noexcept {
return value[0] != 0.0 || value[1] != 0.0 || value[2] != 0.0 || value[3] != 0.0; }
187 VSG_type_name(vsg::vec4);
188 VSG_type_name(vsg::dvec4);
189 VSG_type_name(vsg::ldvec4);
190 VSG_type_name(vsg::bvec4);
191 VSG_type_name(vsg::svec4);
192 VSG_type_name(vsg::ivec4);
193 VSG_type_name(vsg::ubvec4);
194 VSG_type_name(vsg::usvec4);
195 VSG_type_name(vsg::uivec4);
200 return lhs[0] == rhs[0] && lhs[1] == rhs[1] && lhs[2] == rhs[2] && lhs[3] == rhs[3];
204 constexpr bool operator!=(
const t_vec4<T>& lhs,
const t_vec4<T>& rhs)
206 return lhs[0] != rhs[0] || lhs[1] != rhs[1] || lhs[2] != rhs[2] || lhs[3] != rhs[3];
212 if (lhs[0] < rhs[0])
return true;
213 if (lhs[0] > rhs[0])
return false;
214 if (lhs[1] < rhs[1])
return true;
215 if (lhs[1] > rhs[1])
return false;
216 if (lhs[2] < rhs[2])
return true;
217 if (lhs[2] > rhs[2])
return false;
218 return lhs[3] < rhs[3];
224 return t_vec4<T>(lhs[0] - rhs[0], lhs[1] - rhs[1], lhs[2] - rhs[2], lhs[3] - rhs[3]);
230 return t_vec4<T>(-v[0], -v[1], -v[2], -v[3]);
236 return t_vec4<T>(lhs[0] + rhs[0], lhs[1] + rhs[1], lhs[2] + rhs[2], lhs[3] + rhs[3]);
242 return t_vec4<T>(lhs[0] * rhs, lhs[1] * rhs, lhs[2] * rhs, lhs[3] * rhs);
248 return t_vec4<T>(lhs[0] * rhs[0], lhs[1] * rhs[1], lhs[2] * rhs[2], lhs[3] * rhs[3]);
254 if constexpr (std::is_floating_point_v<T>)
256 T inv =
static_cast<T
>(1.0) / rhs;
257 return t_vec4<T>(lhs[0] * inv, lhs[1] * inv, lhs[2] * inv, lhs[3] * inv);
261 return t_vec4<T>(lhs[0] / rhs, lhs[1] / rhs, lhs[2] / rhs, lhs[3] / rhs);
268 return std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3]);
274 return v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3];
280 return v / length(v);
286 T one_minus_r = 1 - r;
287 return t_vec4<T>(start[0] * one_minus_r + end[0] * r,
288 start[1] * one_minus_r + end[1] * r,
289 start[2] * one_minus_r + end[2] * r,
290 start[3] * one_minus_r + end[3] * r);
295#if defined(__clang__)
296# pragma clang diagnostic pop
299# 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
t_vec4 template class that represents a 4D vector
Definition vec4.h:35