32template<
int N,
typename T>
class vecN
40 for (
auto i :
xrange(N)) e[i] = T(0);
44 constexpr explicit vecN(T x)
46 for (
auto i :
xrange(N)) e[i] = x;
53 for (
auto i :
xrange(N)) e[i] = T(x[i]);
59 static_assert(N2 > N,
"wrong vector length in constructor");
60 for (
auto i :
xrange(N)) e[i] = x[i];
67 static_assert(N == 2,
"wrong #constructor arguments");
71 constexpr vecN(T x, T y, T z)
74 static_assert(N == 3,
"wrong #constructor arguments");
78 constexpr vecN(T x, T y, T z, T w)
81 static_assert(N == 4,
"wrong #constructor arguments");
88 static_assert((1 + N2) == N,
"wrong vector length in constructor");
90 for (
auto i :
xrange(N2)) e[i + 1] = y[i];
97 static_assert((N1 + 1) == N,
"wrong vector length in constructor");
98 for (
auto i :
xrange(N1)) e[i] = x[i];
103 template<
int N1,
int N2>
106 static_assert((N1 + N2) == N,
"wrong vector length in constructor");
107 for (
auto i :
xrange(N1)) e[i ] = x[i];
108 for (
auto i :
xrange(N2)) e[i + N1] = y[i];
126 template<
size_t I> [[nodiscard]]
constexpr T
get() const noexcept {
return (*
this)[I]; }
127 template<
size_t I> [[nodiscard]]
constexpr T&
get() noexcept {
return (*
this)[I]; }
140 for (
auto i :
xrange(N))
if (x[i] != y[i])
return false;
161[[nodiscard]]
inline float rsqrt(
float x)
163 return 1.0f / sqrtf(x);
165[[nodiscard]]
inline double rsqrt(
double x)
167 return 1.0 /
sqrt(x);
171template<
typename T> [[nodiscard]]
constexpr T
radians(T d)
175template<
typename T> [[nodiscard]]
constexpr T
degrees(T r)
184template<
int N,
typename T>
191template<
int N,
typename T>
195 for (
auto i :
xrange(N)) r[i] = x[i] + y[i];
200template<
int N,
typename T>
204 for (
auto i :
xrange(N)) r[i] = x[i] - y[i];
209template<
int N,
typename T>
213 for (
auto i :
xrange(N)) r[i] = x * y[i];
218template<
int N,
typename T>
222 for (
auto i :
xrange(N)) r[i] = x[i] * y;
227template<
int N,
typename T>
231 for (
auto i :
xrange(N)) r[i] = x[i] * y[i];
236template<
int N,
typename T>
240 for (
auto i :
xrange(N)) r[i] = T(1) / x[i];
245template<
int N,
typename T>
252template<
int N,
typename T>
255 return x * (T(1) / y);
259template<
int N,
typename T>
266template<
int N,
typename T>
275template<
int N,
typename T>
284template<
int N,
typename T>
293template<
int N,
typename T>
296 return min(maxVal,
max(minVal, x));
300template<
int N,
typename T>
307template<
int N,
typename T>
311 for (
auto i :
xrange(N)) result += x[i];
314template<
int N,
typename T>
321template<
int N,
typename T>
326template<
int N,
typename T>
333template<
int N,
typename T>
340template<
int N,
typename T>
347template<
int N,
typename T>
358 x[2] * y[0] - x[0] * y[2],
359 x[0] * y[1] - x[1] * y[0]);
363template<
int N,
typename T>
369 for (
auto i :
xrange(N)) r[i] = narrow_cast<int>(lrintf(narrow_cast<float>(x[i])));
375template<
int N,
typename T>
379 for (
auto i :
xrange(N)) r[i] = int(x[i]);
384template<
int N,
typename T>
388 for (
auto i :
xrange(N)) {
402#if defined(__clang__)
403#pragma clang diagnostic push
404#pragma clang diagnostic ignored "-Wmismatched-tags"
406 template<
int N,
typename T>
class tuple_size<
gl::vecN<N, T>>
407 :
public std::integral_constant<size_t, N> {};
408#if defined(__clang__)
409#pragma clang diagnostic pop
411 template<
size_t I,
int N,
typename T>
class tuple_element<I,
gl::vecN<N, T>> {
constexpr T operator[](unsigned i) const
constexpr vecN & operator*=(const vecN &x)
constexpr T get() const noexcept
constexpr vecN & operator*=(T x)
constexpr vecN(T x, T y, T z, T w)
friend constexpr bool operator==(const vecN &x, const vecN &y)
constexpr vecN(const vecN< N1, T > &x, const vecN< N2, T > &y)
constexpr T & get() noexcept
constexpr vecN(const vecN< N1, T > &x, T y)
constexpr vecN(const vecN< N2, T > &x)
constexpr T & operator[](unsigned i)
constexpr vecN(T x, const vecN< N2, T > &y)
constexpr vecN(const vecN< N, T2 > &x)
constexpr vecN & operator-=(const vecN &x)
constexpr vecN & operator+=(const vecN &x)
constexpr vecN(T x, T y, T z)
constexpr double sqrt(double x)
constexpr vecN< N, T > recip(const vecN< N, T > &x)
constexpr vecN< 3, T > cross(const vecN< 3, T > &x, const vecN< 3, T > &y)
constexpr T min_component(const vecN< N, T > &x)
constexpr T dot(const vecN< N, T > &x, const vecN< N, T > &y)
constexpr vecN< N, int > trunc(const vecN< N, T > &x)
constexpr matMxN< M, N, T > operator*(T x, const matMxN< M, N, T > &A)
T length(const vecN< N, T > &x)
constexpr vecN< N, T > operator/(T x, const vecN< N, T > &y)
vecN< N, int > round(const vecN< N, T > &x)
constexpr T length2(const vecN< N, T > &x)
constexpr vecN< N, T > min(const vecN< N, T > &x, const vecN< N, T > &y)
constexpr vecN< N, T > dot_broadcast(const vecN< N, T > &x, const vecN< N, T > &y)
constexpr vecN< N, T > sum_broadcast(const vecN< N, T > &x)
constexpr T sum(const vecN< N, T > &x)
std::ostream & operator<<(std::ostream &os, const matMxN< M, N, T > &A)
constexpr matMxN< M, N, T > operator-(const matMxN< M, N, T > &A, const matMxN< M, N, T > &B)
vecN< N, T > normalize(const vecN< N, T > &x)
constexpr vecN< N, T > max(const vecN< N, T > &x, const vecN< N, T > &y)
constexpr vecN< N, T > clamp(const vecN< N, T > &x, const vecN< N, T > &minVal, const vecN< N, T > &maxVal)
constexpr matMxN< M, N, T > operator+(const matMxN< M, N, T > &A, const matMxN< M, N, T > &B)
constexpr auto xrange(T e)