79 lines
934 B
C++
79 lines
934 B
C++
|
#pragma once
|
||
|
|
||
|
#include <array>
|
||
|
|
||
|
namespace lt::math {
|
||
|
|
||
|
template<typename T = float>
|
||
|
struct vec4_impl
|
||
|
{
|
||
|
vec4_impl(): x(), y(), z(), w()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
explicit vec4_impl(T scalar): x(scalar), y(scalar), z(scalar), w(scalar)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
vec4_impl(T x, T y, T z, T w): x(x), y(y), z(z), w(w)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
[[nodiscard]] auto operator-(const vec4_impl<T> &other) const -> vec4_impl
|
||
|
{
|
||
|
return {
|
||
|
x - other.x,
|
||
|
y - other.y,
|
||
|
z - other.z,
|
||
|
w - other.w,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
[[nodiscard]] auto operator[](size_t idx) -> T &
|
||
|
{
|
||
|
return values[idx];
|
||
|
}
|
||
|
|
||
|
[[nodiscard]] auto operator[](size_t idx) const -> const T &
|
||
|
{
|
||
|
return values[idx];
|
||
|
}
|
||
|
|
||
|
// NOLINTNEXTLINE
|
||
|
union
|
||
|
{
|
||
|
struct
|
||
|
{
|
||
|
T x;
|
||
|
|
||
|
T y;
|
||
|
|
||
|
T z;
|
||
|
|
||
|
T w;
|
||
|
};
|
||
|
struct
|
||
|
{
|
||
|
T r;
|
||
|
|
||
|
T g;
|
||
|
|
||
|
T b;
|
||
|
|
||
|
T a;
|
||
|
};
|
||
|
struct
|
||
|
{
|
||
|
std::array<T, 4> values;
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
|
||
|
using vec4 = vec4_impl<float>;
|
||
|
|
||
|
using ivec4 = vec4_impl<int32_t>;
|
||
|
|
||
|
using uvec4 = vec4_impl<uint32_t>;
|
||
|
|
||
|
} // namespace lt::math
|