30 template<
int N,
typename T>
class vecN
38 for (
auto i :
xrange(
N)) e[i] = T(0);
51 for (
auto i :
xrange(
N)) e[i] = T(
x[i]);
57 static_assert(
N2 >
N,
"wrong vector length in constructor");
58 for (
auto i :
xrange(
N)) e[i] =
x[i];
65 static_assert(
N == 2,
"wrong #constructor arguments");
72 static_assert(
N == 3,
"wrong #constructor arguments");
76 constexpr
vecN(T
x, T y, T z, T w)
79 static_assert(
N == 4,
"wrong #constructor arguments");
86 static_assert((1 +
N2) ==
N,
"wrong vector length in constructor");
88 for (
auto i :
xrange(
N2)) e[i + 1] = y[i];
95 static_assert((
N1 + 1) ==
N,
"wrong vector length in constructor");
101 template<
int N1,
int N2>
104 static_assert((
N1 +
N2) ==
N,
"wrong vector length in constructor");
124 template<
size_t I> [[nodiscard]] constexpr T
get() const noexcept {
return (*
this)[I]; }
125 template<
size_t I> [[nodiscard]] constexpr T&
get() noexcept {
return (*
this)[I]; }
152 [[nodiscard]]
inline float rsqrt(
float x)
154 return 1.0f / sqrtf(
x);
156 [[nodiscard]]
inline double rsqrt(
double x)
158 return 1.0 /
sqrt(
x);
162 template<
typename T> [[nodiscard]] constexpr T
radians(T d)
166 template<
typename T> [[nodiscard]] constexpr T
degrees(T r)
175 template<
int N,
typename T>
182 template<
int N,
typename T>
186 for (
auto i :
xrange(
N)) r[i] =
x[i] + y[i];
191 template<
int N,
typename T>
195 for (
auto i :
xrange(
N)) r[i] =
x[i] - y[i];
200 template<
int N,
typename T>
204 for (
auto i :
xrange(
N)) r[i] =
x * y[i];
209 template<
int N,
typename T>
213 for (
auto i :
xrange(
N)) r[i] =
x[i] * y;
218 template<
int N,
typename T>
222 for (
auto i :
xrange(
N)) r[i] =
x[i] * y[i];
227 template<
int N,
typename T>
231 for (
auto i :
xrange(
N)) r[i] = T(1) /
x[i];
236 template<
int N,
typename T>
243 template<
int N,
typename T>
246 return x * (T(1) / y);
250 template<
int N,
typename T>
257 template<
int N,
typename T>
266 template<
int N,
typename T>
275 template<
int N,
typename T>
284 template<
int N,
typename T>
287 return min(maxVal,
max(minVal,
x));
291 template<
int N,
typename T>
298 template<
int N,
typename T>
302 for (
auto i :
xrange(
N)) result +=
x[i];
305 template<
int N,
typename T>
312 template<
int N,
typename T>
317 template<
int N,
typename T>
324 template<
int N,
typename T>
331 template<
int N,
typename T>
338 template<
int N,
typename T>
349 x[2] * y[0] -
x[0] * y[2],
350 x[0] * y[1] -
x[1] * y[0]);
354 template<
int N,
typename T>
360 for (
auto i :
xrange(
N)) r[i] = lrintf(
x[i]);
366 template<
int N,
typename T>
370 for (
auto i :
xrange(
N)) r[i] = int(
x[i]);
375 template<
int N,
typename T>
393 #if defined(__clang__)
394 #pragma clang diagnostic push
395 #pragma clang diagnostic ignored "-Wmismatched-tags"
397 template<
int N,
typename T>
class tuple_size<
gl::vecN<N, T>>
398 :
public std::integral_constant<size_t, N> {};
399 #if defined(__clang__)
400 #pragma clang diagnostic pop
402 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 vecN & operator*=(T x)
constexpr vecN & operator*=(const vecN &x)
constexpr T get() const noexcept
constexpr vecN & operator+=(const vecN &x)
constexpr vecN(T x, T y, T z, T w)
constexpr T & operator[](unsigned i)
constexpr vecN(const vecN< N1, T > &x, const vecN< N2, T > &y)
constexpr vecN(const vecN< N1, T > &x, T y)
constexpr vecN(const vecN< N2, T > &x)
constexpr vecN(T x, const vecN< N2, T > &y)
constexpr vecN(const vecN< N, T2 > &x)
constexpr T & get() noexcept
constexpr bool operator==(const vecN &) const =default
constexpr vecN(T x, T y, T z)
constexpr double sqrt(double x)
constexpr vecN< N, T > min(const vecN< N, T > &x, const vecN< N, T > &y)
constexpr T min_component(const vecN< N, T > &x)
constexpr T dot(const vecN< N, T > &x, const vecN< N, T > &y)
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, int > round(const vecN< N, T > &x)
T length(const vecN< N, T > &x)
constexpr vecN< N, T > max(const vecN< N, T > &x, const vecN< N, T > &y)
constexpr vecN< N, int > trunc(const vecN< N, T > &x)
vecN< N, T > normalize(const vecN< N, T > &x)
constexpr T length2(const vecN< N, T > &x)
constexpr vecN< 3, T > cross(const vecN< 3, T > &x, const vecN< 3, T > &y)
constexpr vecN< N, T > recip(const vecN< N, T > &x)
constexpr vecN< N, T > clamp(const vecN< N, T > &x, const vecN< N, T > &minVal, const vecN< N, T > &maxVal)
constexpr T sum(const vecN< N, T > &x)
constexpr vecN< N, T > operator/(T x, const vecN< N, T > &y)
constexpr vecN< N, T > sum_broadcast(const vecN< N, T > &x)
constexpr matMxN< M, N, T > operator*(T x, const matMxN< M, N, T > &A)
constexpr matMxN< M, N, T > operator+(const matMxN< M, N, T > &A, const matMxN< M, N, T > &B)
constexpr vecN< N, T > dot_broadcast(const vecN< N, T > &x, const vecN< N, T > &y)
constexpr KeyMatrixPosition x
Keyboard bindings.
constexpr auto xrange(T e)