11 template<
typename T,
size_t C,
size_t R,
typename F>
14 for (
size_t c = 0; c < C; ++c)
16 for (
size_t r = 0; r < R; ++r)
18 m[c][r] = func(r, c, m[c][r]);
24 template<
typename T,
size_t C,
size_t R>
28 for (
size_t c = 0; c < C; ++c)
30 for (
size_t r = 0; r < R; ++r)
32 result[r][c] = m[c][r];
38 template<
typename T,
size_t N>
42 for (
size_t i = 0; i < N; ++i)
44 result[i][i] = T{ 1 };
52 static_assert(M::ROWS == M::COLUMNS &&
"Identity matrix must be square");
56 template<
typename T,
size_t C1,
size_t R1,
size_t C2,
size_t R2>
59 static_assert(R2 > R1 &&
"Error NEM: Matrix upscaling is only allowed for R2 > R1");
60 static_assert(C2 > C1 &&
"Error NEM: Matrix upscaling is only allowed for C2 > C1");
63 for (
size_t c = 0; c < C1; ++c)
65 for (
size_t r = 0; r < R1; ++r)
67 result[c][r] = m[c][r];
73 template<
typename T,
size_t N>
77 for (
size_t c = 0; c < N; ++c)
79 for (
size_t r = 0; r < N; ++r)
81 result[c][r] = m[c][r];
90 return m[0][0] * m[1][1] - m[1][0] * m[0][1];
93 template<std::
floating_po
int T>
100 template<std::
floating_po
int T>
103 return nem::mat<T, 3, 3>( {{ 1, 0, 0 } , { 0, a.
cos, -a.
sin }, { 0, a.
sin, a.
cos }} );
106 template<std::
floating_po
int T>
109 return nem::mat<T, 3, 3>( {{ a.
cos, 0, a.
sin } , { 0, 1, 0 }, { -a.
sin, 0, a.
cos }} );
112 template<std::
floating_po
int T>
115 return nem::mat<T, 3, 3>( {{ a.
cos, -a.
sin, 0 } , { a.
sin, a.
cos, 0 }, { 0, 0, 1 }} );
118 template<std::
floating_po
int T>
126 template<std::
floating_po
int T>
129 return nem::mat<T, 3, 3>({{1, 0, value[0]}, {0, 1, value[1]}, {0, 0, 1}});
132 template<std::
floating_po
int T>
135 return nem::mat<T, 4, 4>({{1, 0, 0, value[0]}, {0, 1, 0, value[1]}, {0, 0, 1, value[2]}, {0, 0, 0, 1}});
138 template<std::
floating_po
int T,
size_t N>
142 for (
size_t i = 0; i < N; ++i)
144 result[i][i] = value[i];
149 template <std::
floating_po
int T>
constexpr nem::mat< T, 3, 3 > rotate_y(nem::sincos< T > a)
constexpr T determinant(const nem::mat< T, 2, 2 > &m)
nem::quat_t< T > normalize(nem::quat_t< T > q)
constexpr nem::mat< T, R, C > transpose(const nem::mat< T, C, R > &m)
constexpr nem::mat< T, 4, 4 > translate_3D(const nem::vec< T, 3 > &value)
constexpr nem::mat< T, C2, R2 > upscale(const nem::mat< T, C1, R1 > &m)
constexpr nem::mat< T, N, N > scale(const nem::vec< T, N > &value)
constexpr nem::mat< T, 4, 4 > transform(const nem::vec< T, 3 > &translation, const nem::quat_t< T > &rotation, const nem::vec< T, 3 > scaler)
constexpr nem::mat< T, N, N > identity()
constexpr nem::sincos< T > get_sincos(T radians)
constexpr T radians(T radians) noexcept
Converts radians to radians (passes the argument unchanged). Used to make units explicit.
constexpr nem::mat< T, 3, 3 > rotate_z(nem::sincos< T > a)
constexpr nem::mat< T, 2, 2 > rotate(T radians)
constexpr nem::mat< T, 3, 3 > rotate_x(nem::sincos< T > a)
constexpr nem::mat< T, 3, 3 > norm_quaterion_to_rotation_matrix(const nem::quat_t< T > &q)
constexpr nem::mat< T, C, R > transform_items(nem::mat< T, C, R > m, F &&func)
constexpr nem::mat< T, 3, 3 > translate_2D(const nem::vec< T, 2 > &value)
constexpr nem::mat< T, N+1, N+1 > homogenous(const nem::mat< T, N, N > &m)