20 #ifndef ANTKEEPER_MATH_MATRIX_HPP
21 #define ANTKEEPER_MATH_MATRIX_HPP
28 #include <type_traits>
42 template <
class T, std::
size_t N, std::
size_t M>
70 template <
class U, std::size_t... I>
71 [[nodiscard]]
inline constexpr
matrix<U, N, M> type_cast(std::index_sequence<I...>)
const noexcept
86 return type_cast<U>(std::make_index_sequence<N>{});
90 template <std::size_t P, std::size_t O, std::size_t... I>
91 [[nodiscard]]
inline constexpr
matrix<T, P, O> size_cast(std::index_sequence<I...>)
const noexcept
99 return {((I < N) ? vector<T, O>(
columns[I]) : matrix<T, P, O>::
identity()[I]) ...};
111 template <std::
size_t P, std::
size_t O>
114 return size_cast<P, O>(std::make_index_sequence<P>{});
189 [[nodiscard]]
inline constexpr T&
element(std::size_t i) noexcept
193 [[nodiscard]]
inline constexpr
const T&
element(std::size_t i)
const noexcept
260 [[nodiscard]]
inline constexpr std::reverse_iterator<column_vector_type*>
rbegin() noexcept
264 [[nodiscard]]
inline constexpr std::reverse_iterator<const column_vector_type*>
rbegin() const noexcept
268 [[nodiscard]]
inline constexpr std::reverse_iterator<const column_vector_type*>
crbegin() const noexcept
278 [[nodiscard]]
inline constexpr std::reverse_iterator<column_vector_type*>
rend() noexcept
280 return std::reverse_iterator<column_vector_type*>(
columns);
282 [[nodiscard]]
inline constexpr std::reverse_iterator<const column_vector_type*>
rend() const noexcept
284 return std::reverse_iterator<const column_vector_type*>(
columns);
286 [[nodiscard]]
inline constexpr std::reverse_iterator<const column_vector_type*>
crend() const noexcept
288 return std::reverse_iterator<const column_vector_type*>(
columns);
300 [[nodiscard]]
inline constexpr std::size_t
size() const noexcept
319 template <std::size_t... I>
320 [[nodiscard]]
static inline constexpr
matrix one(std::index_sequence<I...>) noexcept
333 return one(std::make_index_sequence<column_count>{});
337 template <std::size_t... I>
338 [[nodiscard]]
static inline constexpr
column_vector_type identity_column(std::size_t i, std::index_sequence<I...>) noexcept
340 return {(I == i ? T{1} : T{0}) ...};
344 template <std::size_t... I>
345 [[nodiscard]]
static inline constexpr matrix
identity(std::index_sequence<I...>) noexcept
347 return {identity_column(I, std::make_index_sequence<row_count>{}) ...};
355 return identity(std::make_index_sequence<column_count>{});
362 namespace matrix_types {
411 template <std::
size_t N, std::
size_t M>
438 template <std::
size_t N, std::
size_t M>
461 using namespace matrix_types;
464 namespace types {
using namespace matrix_types; }
474 template <
class T, std::
size_t N, std::
size_t M>
485 template <
class T, std::
size_t N, std::
size_t M>
497 template <
class T, std::
size_t N>
508 template <
class T, std::
size_t N, std::
size_t M>
519 template <
class T, std::
size_t N, std::
size_t M>
530 template <
class T, std::
size_t N, std::
size_t M>
541 template <
class T, std::
size_t N, std::
size_t M>
557 template<std::
size_t I,
class T, std::
size_t N, std::
size_t M>
559 template<std::
size_t I,
class T, std::
size_t N, std::
size_t M>
561 template<std::
size_t I,
class T, std::
size_t N, std::
size_t M>
563 template<std::
size_t I,
class T, std::
size_t N, std::
size_t M>
576 template <
class T, std::
size_t N>
618 template <
class T, std::
size_t N, std::
size_t M, std::
size_t P>
629 template <
class T, std::
size_t N, std::
size_t M>
640 template <
class T, std::
size_t N, std::
size_t M>
651 template <
class T, std::
size_t N, std::
size_t M>
713 template <
class T, std::
size_t N, std::
size_t M>
724 template <
class T, std::
size_t N, std::
size_t M>
735 template <
class T, std::
size_t N, std::
size_t M>
745 template <
class T, std::
size_t N>
765 template <
class T, std::
size_t N, std::
size_t M>
769 template <
class T, std::size_t N, std::size_t M, std::size_t... I>
772 return {(a[I] + b[I]) ...};
775 template <
class T, std::
size_t N, std::
size_t M>
778 return add(a, b, std::make_index_sequence<N>{});
782 template <
class T, std::size_t N, std::size_t M, std::size_t... I>
783 inline constexpr matrix<T, N, M>
add(
const matrix<T, N, M>& a, T b, std::index_sequence<I...>) noexcept
785 return {(a[I] + b) ...};
788 template <
class T, std::
size_t N, std::
size_t M>
791 return add(a, b, std::make_index_sequence<N>{});
796 constexpr T
determinant(
const matrix<T, 2, 2>& m) noexcept
808 m[0][0] *
m[1][1] *
m[2][2] +
809 m[0][1] *
m[1][2] *
m[2][0] +
810 m[0][2] *
m[1][0] *
m[2][1] -
811 m[0][0] *
m[1][2] *
m[2][1] -
812 m[0][1] *
m[1][0] *
m[2][2] -
813 m[0][2] *
m[1][1] *
m[2][0];
818 constexpr T
determinant(
const matrix<T, 4, 4>& m) noexcept
821 m[0][3] *
m[1][2] *
m[2][1] *
m[3][0] -
m[0][2] *
m[1][3] *
m[2][1] *
m[3][0] -
822 m[0][3] *
m[1][1] *
m[2][2] *
m[3][0] +
m[0][1] *
m[1][3] *
m[2][2] *
m[3][0] +
823 m[0][2] *
m[1][1] *
m[2][3] *
m[3][0] -
m[0][1] *
m[1][2] *
m[2][3] *
m[3][0] -
824 m[0][3] *
m[1][2] *
m[2][0] *
m[3][1] +
m[0][2] *
m[1][3] *
m[2][0] *
m[3][1] +
825 m[0][3] *
m[1][0] *
m[2][2] *
m[3][1] -
m[0][0] *
m[1][3] *
m[2][2] *
m[3][1] -
826 m[0][2] *
m[1][0] *
m[2][3] *
m[3][1] +
m[0][0] *
m[1][2] *
m[2][3] *
m[3][1] +
827 m[0][3] *
m[1][1] *
m[2][0] *
m[3][2] -
m[0][1] *
m[1][3] *
m[2][0] *
m[3][2] -
828 m[0][3] *
m[1][0] *
m[2][1] *
m[3][2] +
m[0][0] *
m[1][3] *
m[2][1] *
m[3][2] +
829 m[0][1] *
m[1][0] *
m[2][3] *
m[3][2] -
m[0][0] *
m[1][1] *
m[2][3] *
m[3][2] -
830 m[0][2] *
m[1][1] *
m[2][0] *
m[3][3] +
m[0][1] *
m[1][2] *
m[2][0] *
m[3][3] +
831 m[0][2] *
m[1][0] *
m[2][1] *
m[3][3] -
m[0][0] *
m[1][2] *
m[2][1] *
m[3][3] -
832 m[0][1] *
m[1][0] *
m[2][2] *
m[3][3] +
m[0][0] *
m[1][1] *
m[2][2] *
m[3][3];
836 template <
class T, std::size_t N, std::size_t M, std::size_t... I>
837 inline constexpr matrix<T, N, M>
componentwise_mul(
const matrix<T, N, M>& a,
const matrix<T, N, M>& b, std::index_sequence<I...>) noexcept
839 return {(
a[I] *
b[I]) ...};
842 template <
class T, std::
size_t N, std::
size_t M>
849 template <
class T, std::size_t N, std::size_t M, std::size_t... I>
850 inline constexpr matrix<T, N, M>
div(
const matrix<T, N, M>& a,
const matrix<T, N, M>& b, std::index_sequence<I...>) noexcept
852 return {(a[I] / b[I]) ...};
855 template <
class T, std::
size_t N, std::
size_t M>
858 return div(a, b, std::make_index_sequence<N>{});
862 template <
class T, std::size_t N, std::size_t M, std::size_t... I>
863 inline constexpr matrix<T, N, M>
div(
const matrix<T, N, M>& a, T b, std::index_sequence<I...>) noexcept
865 return {(a[I] / b) ...};
868 template <
class T, std::
size_t N, std::
size_t M>
871 return div(a, b, std::make_index_sequence<N>{});
875 template <
class T, std::size_t N, std::size_t M, std::size_t... I>
876 inline constexpr matrix<T, N, M>
div(T a,
const matrix<T, N, M>& b, std::index_sequence<I...>) noexcept
878 return {(a / b[I]) ...};
881 template <
class T, std::
size_t N, std::
size_t M>
884 return div(a, b, std::make_index_sequence<N>{});
887 template<std::
size_t I,
class T, std::
size_t N, std::
size_t M>
890 static_assert(I < N);
894 template<std::
size_t I,
class T, std::
size_t N, std::
size_t M>
897 static_assert(I < N);
898 return std::move(m.columns[I]);
901 template<std::
size_t I,
class T, std::
size_t N, std::
size_t M>
904 static_assert(I < N);
908 template<std::
size_t I,
class T, std::
size_t N, std::
size_t M>
911 static_assert(I < N);
912 return std::move(m.columns[I]);
917 constexpr matrix<T, 2, 2>
inverse(
const matrix<T, 2, 2>& m) noexcept
932 constexpr mat3<T>
inverse(
const mat3<T>& m) noexcept
938 (
m[1][1] *
m[2][2] -
m[1][2] *
m[2][1]) * inv_det,
939 (m[0][2] * m[2][1] - m[0][1] * m[2][2]) * inv_det,
940 (
m[0][1] *
m[1][2] -
m[0][2] *
m[1][1]) * inv_det,
942 (m[1][2] * m[2][0] - m[1][0] * m[2][2]) * inv_det,
943 (
m[0][0] *
m[2][2] -
m[0][2] *
m[2][0]) * inv_det,
944 (m[0][2] * m[1][0] - m[0][0] * m[1][2]) * inv_det,
946 (
m[1][0] *
m[2][1] -
m[1][1] *
m[2][0]) * inv_det,
947 (m[0][1] * m[2][0] - m[0][0] * m[2][1]) * inv_det,
948 (
m[0][0] *
m[1][1] -
m[0][1] *
m[1][0]) * inv_det
954 constexpr matrix<T, 4, 4>
inverse(
const matrix<T, 4, 4>& m) noexcept
960 (
m[1][2] *
m[2][3] *
m[3][1] -
m[1][3] *
m[2][2] *
m[3][1] +
m[1][3] *
m[2][1] *
m[3][2] -
m[1][1] *
m[2][3] *
m[3][2] -
m[1][2] *
m[2][1] *
m[3][3] +
m[1][1] *
m[2][2] *
m[3][3]) * inv_det,
961 (m[0][3] * m[2][2] * m[3][1] - m[0][2] * m[2][3] * m[3][1] - m[0][3] * m[2][1] * m[3][2] + m[0][1] * m[2][3] * m[3][2] + m[0][2] * m[2][1] * m[3][3] - m[0][1] * m[2][2] * m[3][3]) * inv_det,
962 (
m[0][2] *
m[1][3] *
m[3][1] -
m[0][3] *
m[1][2] *
m[3][1] +
m[0][3] *
m[1][1] *
m[3][2] -
m[0][1] *
m[1][3] *
m[3][2] -
m[0][2] *
m[1][1] *
m[3][3] +
m[0][1] *
m[1][2] *
m[3][3]) * inv_det,
963 (m[0][3] * m[1][2] * m[2][1] - m[0][2] * m[1][3] * m[2][1] - m[0][3] * m[1][1] * m[2][2] + m[0][1] * m[1][3] * m[2][2] + m[0][2] * m[1][1] * m[2][3] - m[0][1] * m[1][2] * m[2][3]) * inv_det,
965 (
m[1][3] *
m[2][2] *
m[3][0] -
m[1][2] *
m[2][3] *
m[3][0] -
m[1][3] *
m[2][0] *
m[3][2] +
m[1][0] *
m[2][3] *
m[3][2] +
m[1][2] *
m[2][0] *
m[3][3] -
m[1][0] *
m[2][2] *
m[3][3]) * inv_det,
966 (m[0][2] * m[2][3] * m[3][0] - m[0][3] * m[2][2] * m[3][0] + m[0][3] * m[2][0] * m[3][2] - m[0][0] * m[2][3] * m[3][2] - m[0][2] * m[2][0] * m[3][3] + m[0][0] * m[2][2] * m[3][3]) * inv_det,
967 (
m[0][3] *
m[1][2] *
m[3][0] -
m[0][2] *
m[1][3] *
m[3][0] -
m[0][3] *
m[1][0] *
m[3][2] +
m[0][0] *
m[1][3] *
m[3][2] +
m[0][2] *
m[1][0] *
m[3][3] -
m[0][0] *
m[1][2] *
m[3][3]) * inv_det,
968 (m[0][2] * m[1][3] * m[2][0] - m[0][3] * m[1][2] * m[2][0] + m[0][3] * m[1][0] * m[2][2] - m[0][0] * m[1][3] * m[2][2] - m[0][2] * m[1][0] * m[2][3] + m[0][0] * m[1][2] * m[2][3]) * inv_det,
970 (
m[1][1] *
m[2][3] *
m[3][0] -
m[1][3] *
m[2][1] *
m[3][0] +
m[1][3] *
m[2][0] *
m[3][1] -
m[1][0] *
m[2][3] *
m[3][1] -
m[1][1] *
m[2][0] *
m[3][3] +
m[1][0] *
m[2][1] *
m[3][3]) * inv_det,
971 (m[0][3] * m[2][1] * m[3][0] - m[0][1] * m[2][3] * m[3][0] - m[0][3] * m[2][0] * m[3][1] + m[0][0] * m[2][3] * m[3][1] + m[0][1] * m[2][0] * m[3][3] - m[0][0] * m[2][1] * m[3][3]) * inv_det,
972 (
m[0][1] *
m[1][3] *
m[3][0] -
m[0][3] *
m[1][1] *
m[3][0] +
m[0][3] *
m[1][0] *
m[3][1] -
m[0][0] *
m[1][3] *
m[3][1] -
m[0][1] *
m[1][0] *
m[3][3] +
m[0][0] *
m[1][1] *
m[3][3]) * inv_det,
973 (m[0][3] * m[1][1] * m[2][0] - m[0][1] * m[1][3] * m[2][0] - m[0][3] * m[1][0] * m[2][1] + m[0][0] * m[1][3] * m[2][1] + m[0][1] * m[1][0] * m[2][3] - m[0][0] * m[1][1] * m[2][3]) * inv_det,
975 (
m[1][2] *
m[2][1] *
m[3][0] -
m[1][1] *
m[2][2] *
m[3][0] -
m[1][2] *
m[2][0] *
m[3][1] +
m[1][0] *
m[2][2] *
m[3][1] +
m[1][1] *
m[2][0] *
m[3][2] -
m[1][0] *
m[2][1] *
m[3][2]) * inv_det,
976 (m[0][1] * m[2][2] * m[3][0] - m[0][2] * m[2][1] * m[3][0] + m[0][2] * m[2][0] * m[3][1] - m[0][0] * m[2][2] * m[3][1] - m[0][1] * m[2][0] * m[3][2] + m[0][0] * m[2][1] * m[3][2]) * inv_det,
977 (
m[0][2] *
m[1][1] *
m[3][0] -
m[0][1] *
m[1][2] *
m[3][0] -
m[0][2] *
m[1][0] *
m[3][1] +
m[0][0] *
m[1][2] *
m[3][1] +
m[0][1] *
m[1][0] *
m[3][2] -
m[0][0] *
m[1][1] *
m[3][2]) * inv_det,
978 (m[0][1] * m[1][2] * m[2][0] - m[0][2] * m[1][1] * m[2][0] + m[0][2] * m[1][0] * m[2][1] - m[0][0] * m[1][2] * m[2][1] - m[0][1] * m[1][0] * m[2][2] + m[0][0] * m[1][1] * m[2][2]) * inv_det
987 const auto u =
cross(r, f);
992 { r.x(), u.x(), -f.x(), T{0}},
993 { r.y(), u.y(), -f.y(), T{0}},
994 { r.z(), u.z(), -f.z(), T{0}},
995 {-t.x(), -t.y(), t.z(), T{1}}
1004 const auto u =
cross(r, f);
1010 { r.x(), u.x(), -f.x(), T{0}},
1011 { r.y(), u.y(), -f.y(), T{0}},
1012 { r.z(), u.z(), -f.z(), T{0}},
1018 { r.x(), r.y(), r.z(), T{0}},
1019 { u.x(), u.y(), u.z(), T{0}},
1020 {-f.x(), -f.y(), -f.z(), T{0}},
1026 template <
class T, std::
size_t N, std::
size_t M, std::
size_t P>
1031 for (std::size_t i = 0; i < P; ++i)
1033 for (std::size_t j = 0; j < M; ++j)
1035 for (std::size_t k = 0; k < N; ++k)
1037 c[i][j] += a[k][j] * b[i][k];
1046 template <
class T, std::size_t N, std::size_t M, std::size_t... I>
1047 inline constexpr matrix<T, N, M>
mul(
const matrix<T, N, M>& a, T b, std::index_sequence<I...>) noexcept
1049 return {(a[I] * b) ...};
1052 template <
class T, std::
size_t N, std::
size_t M>
1055 return mul(a, b, std::make_index_sequence<N>{});
1059 template <
class T, std::size_t N, std::size_t M, std::size_t... I>
1062 return ((a[I] * b[I]) + ...);
1065 template <
class T, std::
size_t N, std::
size_t M>
1068 return mul(a, b, std::make_index_sequence<N>{});
1072 template <
class T, std::size_t N, std::size_t M, std::size_t... I>
1075 return {
dot(a, b[I]) ...};
1078 template <
class T, std::
size_t N, std::
size_t M>
1081 return mul(a, b, std::make_index_sequence<N>{});
1087 const T c = std::cos(
angle);
1088 const T s = std::sin(
angle);
1092 rotation[0][0] = axis[0] * temp[0] + c;
1093 rotation[0][1] = axis[1] * temp[0] + axis[2] * s;
1094 rotation[0][2] = axis[2] * temp[0] - axis[1] * s;
1095 rotation[1][0] = axis[0] * temp[1] - axis[2] * s;
1096 rotation[1][1] = axis[1] * temp[1] + c;
1097 rotation[1][2] = axis[2] * temp[1] + axis[0] * s;
1098 rotation[2][0] = axis[0] * temp[2] + axis[1] * s;
1099 rotation[2][1] = axis[1] * temp[2] - axis[0] * s;
1100 rotation[2][2] = axis[2] * temp[2] + c;
1108 const T c = std::cos(
angle);
1109 const T s = std::sin(
angle);
1122 const T c = std::cos(
angle);
1123 const T s = std::sin(
angle);
1136 const T c = std::cos(
angle);
1137 const T s = std::sin(
angle);
1152 {v[0], T{0}, T{0}, T{0}},
1153 {T{0}, v[1], T{0}, T{0}},
1154 {T{0}, T{0}, v[2], T{0}},
1155 {T{0}, T{0}, T{0}, T{1}}
1160 template <
class T, std::size_t N, std::size_t M, std::size_t... I>
1161 inline constexpr matrix<T, N, M>
sub(
const matrix<T, N, M>& a,
const matrix<T, N, M>& b, std::index_sequence<I...>) noexcept
1163 return {(a[I] - b[I]) ...};
1166 template <
class T, std::
size_t N, std::
size_t M>
1169 return sub(a, b, std::make_index_sequence<N>{});
1173 template <
class T, std::size_t N, std::size_t M, std::size_t... I>
1174 inline constexpr matrix<T, N, M>
sub(
const matrix<T, N, M>& a, T b, std::index_sequence<I...>) noexcept
1176 return {(a[I] - b) ...};
1179 template <
class T, std::
size_t N, std::
size_t M>
1182 return sub(a, b, std::make_index_sequence<N>{});
1186 template <
class T, std::size_t N, std::size_t M, std::size_t... I>
1187 inline constexpr matrix<T, N, M>
sub(T a,
const matrix<T, N, M>& b, std::index_sequence<I...>) noexcept
1189 return {(a - b[I]) ...};
1192 template <
class T, std::
size_t N, std::
size_t M>
1195 return sub(a, b, std::make_index_sequence<N>{});
1199 template <
class T, std::size_t N, std::size_t... I>
1200 inline constexpr T
trace(
const matrix<T, N, N>& m, std::index_sequence<I...>) noexcept
1202 return ((m[I][I]) + ...);
1205 template <
class T, std::
size_t N>
1208 return trace(m, std::make_index_sequence<N>{});
1216 {T{1}, T{0}, T{0}, T{0}},
1217 {T{0}, T{1}, T{0}, T{0}},
1218 {T{0}, T{0}, T{1}, T{0}},
1219 {v[0], v[1], v[2], T{1}}
1224 template <
class T, std::size_t N, std::size_t M, std::size_t... I>
1227 return {m[I][i] ...};
1231 template <
class T, std::size_t N, std::size_t M, std::size_t... I>
1232 inline constexpr matrix<T, M, N>
transpose(
const matrix<T, N, M>& m, std::index_sequence<I...>) noexcept
1234 return {transpose_column(m, I, std::make_index_sequence<N>{}) ...};
1237 template <
class T, std::
size_t N, std::
size_t M>
1240 return transpose(m, std::make_index_sequence<M>{});
1243 namespace operators {
1246 template <
class T, std::
size_t N, std::
size_t M>
1254 template <
class T, std::
size_t N, std::
size_t M>
1259 template <
class T, std::
size_t N, std::
size_t M>
1267 template <
class T, std::
size_t N, std::
size_t M>
1274 template <
class T, std::
size_t N, std::
size_t M>
1281 template <
class T, std::
size_t N, std::
size_t M>
1288 template <
class T, std::
size_t N, std::
size_t M, std::
size_t P>
1296 template <
class T, std::
size_t N, std::
size_t M>
1301 template <
class T, std::
size_t N, std::
size_t M>
1309 template <
class T, std::
size_t N, std::
size_t M>
1316 template <
class T, std::
size_t N, std::
size_t M>
1323 template <
class T, std::
size_t N, std::
size_t M>
1330 template <
class T, std::
size_t N, std::
size_t M>
1337 template <
class T, std::
size_t N, std::
size_t M>
1352 template <
class T, std::
size_t N, std::
size_t M>
1357 template <
class T, std::
size_t N, std::
size_t M>
1373 template <
class T, std::
size_t N, std::
size_t M>
1378 template <
class T, std::
size_t N, std::
size_t M>
1394 template <
class T, std::
size_t N>
1399 template <
class T, std::
size_t N, std::
size_t M>
1415 template <
class T, std::
size_t N, std::
size_t M>
1420 template <
class T, std::
size_t N, std::
size_t M>
1443 template<
class T, std::
size_t N, std::
size_t M>
1444 struct tuple_size<
math::matrix<T, N, M>>
1458 template<std::
size_t I,
class T, std::
size_t N, std::
size_t M>
1459 struct tuple_element<I,
math::matrix<T, N, M>>
1472 template <
class T, std::
size_t N, std::
size_t M>
1473 struct formatter<
math::matrix<T, N, M>>: formatter<math::vector<T, M>>
1477 auto&& out = fc.out();
1478 format_to(out,
"{{");
1480 for (std::size_t i = 0; i < N; ++i)
1482 formatter<math::vector<T, M>>
::format(t[i], fc);
1485 format_to(out,
", ");
1489 return format_to(out,
"}}");
1495 static_assert(std::is_standard_layout_v<math::fmat3>);
1496 static_assert(std::is_trivial_v<math::fmat3>);
T identity(ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2)
Returns the percent identity between two proteins.
format
Image and vertex formats.
dmat< 3, 3 > dmat3x3
n by m matrix of double-precision floating-point numbers.
dmat< 4, 4 > dmat4x4
n by m matrix of double-precision floating-point numbers.
fmat< 3, 3 > fmat3x3
n by m matrix of single-precision floating-point numbers.
dmat< 2, 2 > dmat2x2
n by m matrix of double-precision floating-point numbers.
fmat< 2, 2 > fmat2x2
n by m matrix of single-precision floating-point numbers.
fmat< 4, 4 > fmat4x4
n by m matrix of single-precision floating-point numbers.
constexpr matrix< T, N, M > & operator/=(matrix< T, N, M > &a, T b) noexcept
Divides the first value by the second value and stores the result in the first value.
constexpr matrix< T, N, M > operator/(T a, const matrix< T, N, M > &b) noexcept
Divides a scalar by a matrix.
constexpr matrix< T, N, M > & operator-=(matrix< T, N, M > &a, T b) noexcept
Subtracts the first value by the second value and stores the result in the first value.
constexpr matrix< T, N, M > & operator*=(matrix< T, N, M > &a, T b) noexcept
Multiplies two values and stores the result in the first value.
constexpr matrix< T, N, M > operator+(T a, const matrix< T, N, M > &b) noexcept
constexpr matrix< T, N, M > operator-(T a, const matrix< T, N, M > &b) noexcept
Subtracts a matrix from a scalar.
constexpr matrix< T, N, M > & operator+=(matrix< T, N, M > &a, T b) noexcept
Adds two values and stores the result in the first value.
constexpr matrix< T, N, M >::row_vector_type operator*(const typename matrix< T, N, M >::column_vector_type &a, const matrix< T, N, M > &b) noexcept
Calculates the product of a column vector and a matrix.
Mathematical functions and data types.
constexpr mat4< T > look_at_rh(const vec3< T > &position, const vec3< T > &target, const vec3< T > &up)
Constructs a right-handed viewing transformation matrix.
constexpr mat4< T > translate(const vec3< T > &v)
Constructs a translation matrix.
constexpr matrix< T, P, M > mul(const matrix< T, N, M > &a, const matrix< T, P, N > &b) noexcept
Multiplies two matrices.
T angle(const vector< T, N > &from, const vector< T, N > &to)
Calculates the angle between two direction vectors.
constexpr T trace(const matrix< T, N, N > &m) noexcept
Calculates the trace of a square matrix.
quaternion< T > normalize(const quaternion< T > &q)
Normalizes a quaternion.
constexpr matrix< T, N, M > div(const matrix< T, N, M > &a, const matrix< T, N, M > &b) noexcept
Divides a matrix by a matrix.
constexpr std::tuple< mat4< T >, mat4< T > > look_at_rh_inv(const vec3< T > &position, const vec3< T > &target, const vec3< T > &up)
Constructs a right-handed viewing transformation matrix and its inverse.
constexpr matrix< T, N, M > add(const matrix< T, N, M > &a, const matrix< T, N, M > &b) noexcept
Adds two matrices.
quaternion< T > rotation(const vec3< T > &from, const vec3< T > &to, T tolerance=T{1e-6})
Constructs a quaternion representing the minimum rotation from one direction to another direction.
constexpr mat4< T > scale(const vec3< T > &v)
Constructs a scale matrix.
mat3< T > rotate_y(T angle)
Produces a matrix which rotates Cartesian coordinates about the y-axis by a given angle.
constexpr T determinant(const matrix< T, N, N > &m) noexcept
Calculates the determinant of a square matrix.
mat3< T > rotate_z(T angle)
Produces a matrix which rotates Cartesian coordinates about the z-axis by a given angle.
constexpr matrix< T, N, M > sub(const matrix< T, N, M > &a, const matrix< T, N, M > &b) noexcept
Subtracts a matrix from another matrix.
mat3< T > rotate_x(T angle)
Produces a matrix which rotates Cartesian coordinates about the x-axis by a given angle.
constexpr matrix< T, N, M >::column_vector_type & get(matrix< T, N, M > &m) noexcept
Extracts the Ith column from a matrix.
constexpr vector< T, 3 > cross(const vector< T, 3 > &x, const vector< T, 3 > &y) noexcept
Calculates the cross product of two vectors.
constexpr matrix< T, M, N > transpose(const matrix< T, N, M > &m) noexcept
Calculates the transpose of a matrix.
mat3< T > rotate(T angle, const vector< T, 3 > &axis)
Constructs a rotation matrix.
constexpr matrix< T, N, M > componentwise_mul(const matrix< T, N, M > &a, const matrix< T, N, M > &b) noexcept
Performs a component-wise multiplication of two matrices.
constexpr T dot(const quaternion< T > &a, const quaternion< T > &b) noexcept
Calculates the dot product of two quaternions.
constexpr matrix< T, N, N > inverse(const matrix< T, N, N > &m) noexcept
Calculates the inverse of a square matrix.
@ target
Vertex morph target (vec3)
@ position
Vertex position (vec3)
n by m column-major matrix.
static constexpr matrix identity() noexcept
Returns an identity matrix, with ones on the main diagonal and zeros elsewhere.
constexpr column_vector_type * begin() noexcept
Returns an iterator to the first column vector.
constexpr std::reverse_iterator< const column_vector_type * > crend() const noexcept
Returns a reverse iterator to the column vector following the last column vector of the reversed matr...
vector< element_type, column_count > row_vector_type
Matrix row vector data type.
constexpr const column_vector_type * begin() const noexcept
Returns an iterator to the first column vector.
constexpr const element_type * data() const noexcept
Returns a pointer to the first element.
constexpr const column_vector_type & back() const noexcept
Returns a reference to the last column vector.
static constexpr std::size_t row_count
Number of rows.
constexpr const column_vector_type * cbegin() const noexcept
Returns an iterator to the first column vector.
constexpr const column_vector_type * end() const noexcept
Returns an iterator to the column vector following the last column vector.
static constexpr std::size_t column_count
Number of columns.
constexpr T & element(std::size_t i) noexcept
Returns a reference to the element at a given column-major index.
static constexpr std::size_t element_count
Number of elements.
constexpr element_type * data() noexcept
Returns a pointer to the first element.
constexpr std::reverse_iterator< const column_vector_type * > crbegin() const noexcept
Returns a reverse iterator to the first column vector of the reversed matrix.
constexpr const column_vector_type & front() const noexcept
Returns a reference to the first column vector.
constexpr const T & element(std::size_t i) const noexcept
Returns a reference to the element at a given column-major index.
constexpr const column_vector_type * cend() const noexcept
Returns an iterator to the column vector following the last column vector.
column_vector_type columns[column_count]
Array of matrix column vectors.
constexpr std::reverse_iterator< const column_vector_type * > rend() const noexcept
Returns a reverse iterator to the column vector following the last column vector of the reversed matr...
constexpr column_vector_type & operator[](std::size_t i) noexcept
Returns a reference to the column vector at a given index.
static constexpr matrix zero() noexcept
Returns a zero matrix, where every element is equal to zero.
constexpr column_vector_type * end() noexcept
Returns an iterator to the column vector following the last column vector.
constexpr const column_vector_type & column(std::size_t i) const noexcept
Returns a reference to the column vector at a given index.
constexpr std::reverse_iterator< const column_vector_type * > rbegin() const noexcept
Returns a reverse iterator to the first column vector of the reversed matrix.
constexpr std::reverse_iterator< column_vector_type * > rend() noexcept
Returns a reverse iterator to the column vector following the last column vector of the reversed matr...
static constexpr matrix one() noexcept
Returns a matrix of ones, where every element is equal to one.
vector< element_type, row_count > column_vector_type
Matrix column vector data type.
T element_type
Element type.
constexpr column_vector_type & front() noexcept
Returns a reference to the first column vector.
constexpr const column_vector_type & operator[](std::size_t i) const noexcept
Returns a reference to the column vector at a given index.
constexpr column_vector_type & column(std::size_t i) noexcept
Returns a reference to the column vector at a given index.
constexpr std::reverse_iterator< column_vector_type * > rbegin() noexcept
Returns a reverse iterator to the first column vector of the reversed matrix.
constexpr std::size_t size() const noexcept
Returns the number of elements in the matrix.
constexpr column_vector_type & back() noexcept
Returns a reference to the last column vector.
static constexpr vector one() noexcept
Returns a vector of ones, where every element is equal to one.