4#include <boost/describe.hpp>
9template <
typename T, std::
size_t N>
20 constexpr Vec(
float scalar) {
21 for (
size_t i = 0; i < N; ++i) {
26 template <
typename... Args>
27 constexpr Vec(Args... args)
28 requires(
sizeof...(Args) > 1)
29 :
data({std::forward<Args>(args)...}) {}
31 template <std::
size_t NewN>
35 "Can only construct a vector from another with fewer dimensions");
36 for (
size_t i = 0; i < N; ++i) {
42 [[nodiscard]]
auto xyz()
const {
43 static_assert(N > 3,
"xyz swizzle requires 4 or more components ");
47 auto at(std::size_t i) -> T& {
return data.at(i); }
48 [[nodiscard]]
auto at(std::size_t i)
const {
return data.at(i); }
51 for (
auto& d :
data) {
58 for (std::size_t i = 0; i < N; i++) v.
data.at(i) =
data.at(i) * scalar;
63 for (std::size_t i = 0; i < N; i++) {
70 for (std::size_t i = 0; i < N; i++) {
76 [[nodiscard]]
constexpr auto dot(
const vec_t& other)
const {
78 for (std::size_t i = 0; i < N; i++)
84 static_assert(N == 3,
"Cross product is only defined for 3D vectors");
86 result.
data.at(0) = this->
data.at(1) * other.
data.at(2) -
88 result.
data.at(1) = this->
data.at(2) * other.
data.at(0) -
90 result.
data.at(2) = this->
data.at(0) * other.
data.at(1) -
96 static_assert(N == 3,
"Cross product is only defined for 3D vectors");
101 for (std::size_t i = 0; i < N; i++)
107 for (std::size_t i = 0; i < N; i++)
113 for (std::size_t i = 0; i < N; i++) {
120 for (std::size_t i = 0; i < N; i++)
127 for (std::size_t i = 0; i < N; i++) v.
data.at(i) = -
data.at(i);
133 for (std::size_t i = 0; i < N; i++) v.
data.at(i) =
data.at(i) / scalar;
142 return !(*
this == other);
145 [[nodiscard]]
constexpr auto length()
const {
147 for (
const auto& d :
data) sum += d * d;
148 return std::sqrt(sum);
156template <
typename T, std::
size_t N>
166 [[nodiscard]]
auto x()
const {
return data.at(0); }
168 [[nodiscard]]
auto y()
const {
return data.at(1); }
182 [[nodiscard]]
auto x()
const {
return data.at(0); }
184 [[nodiscard]]
auto y()
const {
return data.at(1); }
186 [[nodiscard]]
auto z()
const {
return data.at(2); }
187 [[nodiscard]]
auto z() ->
float& {
return data.at(2); }
197 :
Vec<float, 4>(vec.
x(), vec.
y(), vec.
z(),
w) {}
201 [[nodiscard]]
auto x()
const {
return data.at(0); }
202 [[nodiscard]]
auto y()
const {
return data.at(1); }
203 [[nodiscard]]
auto z()
const {
return data.at(2); }
204 [[nodiscard]]
auto w()
const {
return data.at(3); }
Definition geometry.hpp:8
auto operator*(float scalar, Vec< T, N > vec) -> Vec< T, N >
Definition vector.hpp:157
BOOST_DESCRIBE_STRUCT(Quaternionf,(),(data))
Definition vector.hpp:161
auto x() const
Definition vector.hpp:166
Vec2f(float x, float y)
Definition vector.hpp:163
Vec2f(const Vec< float, 2 > &other)
Definition vector.hpp:164
Vec2f()
Definition vector.hpp:162
auto y() const
Definition vector.hpp:168
auto y(float y)
Definition vector.hpp:169
auto x(float x)
Definition vector.hpp:167
Definition vector.hpp:174
auto z(float z)
Definition vector.hpp:188
Vec3f(const auto &other)
Definition vector.hpp:176
auto z() -> float &
Definition vector.hpp:187
Vec3f(float x, float y, float z)
Definition vector.hpp:178
auto y() const
Definition vector.hpp:184
Vec3f(const Vec< float, 3 > &other)
Definition vector.hpp:179
Vec3f()
Definition vector.hpp:175
auto z() const
Definition vector.hpp:186
auto x() const
Definition vector.hpp:182
auto x(float x)
Definition vector.hpp:183
Vec3f(const Vec2f &vec, float z)
Definition vector.hpp:180
auto y(float y)
Definition vector.hpp:185
Definition vector.hpp:192
auto z() const
Definition vector.hpp:203
auto x() const
Definition vector.hpp:201
Vec4f(const auto &other)
Definition vector.hpp:194
auto w() const
Definition vector.hpp:204
Vec4f(float x, float y, float z, float w)
Definition vector.hpp:195
auto y() const
Definition vector.hpp:202
Vec4f(const Vec< float, 4 > &other)
Definition vector.hpp:198
Vec4f()
Definition vector.hpp:193
Vec4f(const Vec3f &vec, float w)
Definition vector.hpp:196
constexpr auto operator*=(float scalar) const
Definition vector.hpp:50
constexpr auto operator==(const vec_t &other) const
Definition vector.hpp:137
constexpr Vec(std::array< T, N > data)
Definition vector.hpp:19
constexpr Vec(float scalar)
Definition vector.hpp:20
constexpr Vec()
Definition vector.hpp:17
constexpr Vec(Args... args)
Definition vector.hpp:27
std::array< T, N > data
Definition vector.hpp:153
constexpr auto length() const
Definition vector.hpp:145
constexpr auto operator*=(const vec_t &other)
Definition vector.hpp:62
auto operator%(const vec_t &other) const
Definition vector.hpp:95
constexpr auto operator+=(const vec_t &other)
Definition vector.hpp:100
auto xyz() const
Definition vector.hpp:42
Vec< T, N > vec_t
Definition vector.hpp:11
auto normalized() const
Definition vector.hpp:151
constexpr Vec(const Vec< T, NewN > &other)
Definition vector.hpp:32
static auto unit_z()
Definition vector.hpp:15
static auto unit_x()
Definition vector.hpp:13
constexpr auto operator-() const
Definition vector.hpp:125
static auto unit_y()
Definition vector.hpp:14
constexpr auto operator-=(const vec_t &other)
Definition vector.hpp:112
constexpr auto operator-(const vec_t &other) const
Definition vector.hpp:118
constexpr auto dot(const vec_t &other) const
Definition vector.hpp:76
auto at(std::size_t i) const
Definition vector.hpp:48
constexpr auto operator*(const vec_t &other) const
Definition vector.hpp:68
auto cross(const vec_t other) const
Definition vector.hpp:83
constexpr auto operator+(const vec_t &other) const
Definition vector.hpp:105
auto operator/(float scalar) const
Definition vector.hpp:131
constexpr auto operator*(float scalar) const
Definition vector.hpp:56
auto at(std::size_t i) -> T &
Definition vector.hpp:47
constexpr auto operator!=(const vec_t &other) const
Definition vector.hpp:141