6 #include <initializer_list>
10 template<std::
size_t C,
typename T>
13 inline constexpr
static std::size_t Size = C;
19 std::memset(c, 0,
sizeof(c));
22 Vec(
const std::array<T, C>& vals)
24 std::uninitialized_copy(vals.begin(), vals.end(), &c[0]);
31 for (uint32_t i = 0; i < C; i++)
32 r.c[i] =
static_cast<A
>(c[i]);
37 Vec(std::initializer_list<A> v)
39 MIDNIGHT_ASSERT(v.size() == C,
"Size mismatch");
40 for (uint32_t i = 0; i < C; i++)
41 c[i] =
static_cast<T
>(*(v.begin() + i));
45 auto operator+(
const Vec<C, A>& vec)
const
48 for (uint32_t i = 0; i < C; i++)
49 r.c[i] = c[i] + vec.c[i];
54 auto operator-(
const Vec<C, A>& vec)
const
57 for (uint32_t i = 0; i < C; i++)
58 r.c[i] = c[i] - vec.c[i];
63 auto operator*(
const A& sc)
const
66 for (uint32_t i = 0; i < C; i++)
72 auto operator/(
const A& sc)
const
75 for (uint32_t i = 0; i < C; i++)
83 for (uint32_t i = 0; i < C; i++)
90 for (uint32_t i = 0; i < C; i++)
97 for (uint32_t i = 0; i < C; i++)
98 c[i] =
static_cast<T
>(vec.c[i]);
101 bool operator==(
const Vec<C, T>& vec)
const
103 for (uint32_t i = 0; i < C; i++)
104 if (c[i] != vec.c[i])
110 template<std::
size_t C,
typename T>
114 for (
int i = 0; i < C; i++)
115 ret.c[i] = std::min(v1.c[i], v2.c[i]);
119 template<std::
size_t C,
typename T>
120 static Vec<C, T> max(
const Vec<C, T>& v1,
const Vec<C, T>& v2)
123 for (
int i = 0; i < C; i++)
124 ret.c[i] = std::max(v1.c[i], v2.c[i]);
128 template<std::size_t C,
typename T,
129 typename = std::enable_if_t<C >= 3>>
130 static Vec<3, T> xyz(
const Vec<C, T>& vec)
133 for (
int i = 0; i < 3; i++)
138 template<std::
size_t C,
typename T>
139 static T& x(Vec<C, T>& vec)
141 static_assert(C >= 1);
145 template<std::
size_t C,
typename T>
146 static T& y(Vec<C, T>& vec)
148 static_assert(C >= 2);
152 template<std::
size_t C,
typename T>
153 static T& z(Vec<C, T>& vec)
155 static_assert(C >= 3);
159 template<std::
size_t C,
typename T>
160 static const T& x(
const Vec<C, T>& vec)
162 static_assert(C >= 1);
166 template<std::
size_t C,
typename T>
167 static const T& y(
const Vec<C, T>& vec)
169 static_assert(C >= 2);
173 template<std::
size_t C,
typename T>
174 static const T& z(
const Vec<C, T>& vec)
176 static_assert(C >= 3);
180 template<std::
size_t C,
typename T>
181 static T& w(Vec<C, T>& vec)
183 static_assert(C >= 4);
187 template<std::
size_t C,
typename T>
188 static const T& w(
const Vec<C, T>& vec)
190 static_assert(C >= 4);
194 template<std::
size_t C,
typename T1,
typename T2>
195 static T1 inner(
const Vec<C, T1>& vec1,
const Vec<C, T2>& vec2)
198 for (uint32_t i = 0; i < C; i++)
199 t += vec1.c[i] * vec2.c[i];
203 template<std::
size_t C,
typename T>
204 static double length(
const Vec<C, T>& vec)
206 return sqrt( inner(vec, vec) );
209 template<std::
size_t C,
typename T>
210 static Vec<C, T> normalized(
const Vec<C, T>& v)
212 return v / length(v);
215 template<std::
size_t C,
typename T>
216 static Vec<C, T> reflect(
const Vec<C, T>& incident,
const Vec<C, T>& normal)
218 return incident - normal *
static_cast<T
>(2.0) * inner(incident, normal);
224 static Vec<3, T> outer(
const Vec<3, T>& vec1,
const Vec<3, T>& vec2)
227 y(vec1) * z(vec2) - z(vec1) * y(vec2),
228 z(vec1) * x(vec2) - x(vec1) * z(vec2),
229 x(vec1) * y(vec2) - y(vec1) * x(vec2)
234 using Vec2 = Vec<2, T>;
235 using Vec2f = Vec2<r32>;
236 using Vec2u = Vec2<u32>;
237 using Vec2i = Vec2<i32>;
240 using Vec3 = Vec<3, T>;
241 using Vec3f = Vec3<r32>;
242 using Vec3u = Vec3<u32>;
243 using Vec3i = Vec3<i32>;
246 using Vec4 = Vec<4, T>;
247 using Vec4f = Vec4<r32>;
Definition: Vector.hpp:12