28 #ifndef BERSERK_TMATMXN_H
29 #define BERSERK_TMATMXN_H
55 template<
typename T, u
int32 M, u
int32 N>
65 for (
auto &r : rows) {
66 for (
uint32 j = 0; j <
N; j++) {
79 static_assert(
M >= 2 &&
N >= 2,
"Cannot apply to this type");
88 T m_10,
T m_11,
T m_12,
90 static_assert(
M >= 3 &&
N >= 3,
"Cannot apply to this type");
106 T m_10,
T m_11,
T m_12,
T m_13,
107 T m_20,
T m_21,
T m_22,
T m_23,
108 T m_30,
T m_31,
T m_32,
T m_33) noexcept :
TMatMxN() {
109 static_assert(
M >= 3 &&
N >= 3,
"Cannot apply to this type");
133 for (
uint32 i = 0; i <
M *
N; i++) {
134 values[i] = other.values[i];
139 for (
uint32 i = 0; i <
M *
N; i++) {
140 values[i] = other.values[i];
144 template<u
int32 M1, u
int32 N1>
146 static_assert(M1 <=
M,
"Matrix too large");
147 static_assert(N1 <=
N,
"Matrix too large");
149 for (
uint32 i = 0; i < M1; i++) {
150 for (
uint32 j = 0; j < N1; j++) {
155 for (
uint32 i = M1; i <
M; i++) {
161 for (
uint32 i = 0; i <
M *
N; i++) {
168 for (
uint32 i = 0; i <
M *
N; i++) {
190 for (
uint32 i = 0; i <
M; i++) {
191 for (
uint32 j = 0; j <
K; j++) {
194 for (
uint32 f = 0; f <
N; f++) {
206 for (
uint32 i = 0; i <
M *
N; i++) {
213 for (
uint32 i = 0; i <
M *
N; i++) {
220 for (
uint32 i = 0; i <
M *
N; i++) {
227 for (
uint32 i = 0; i <
M *
N; i++) {
258 for (
uint32 i = 0; i <
M *
N; i++) {
264 template<u
int32 M1, u
int32 N1>
266 if (i + M1 >
M)
return {};
267 if (j + N1 >
N)
return {};
271 for (
uint32 si = 0; si < M1; si++) {
272 const T *row = &
values[(si + i) *
N + j];
273 for (
uint32 sj = 0; sj < N1; sj++) {
274 result.
values[si * N1 + sj] = *row;
282 template<u
int32 M1, u
int32 N1>
284 if (i + M1 >
M)
return;
285 if (j + N1 >
N)
return;
287 for (
uint32 si = 0; si < M1; si++) {
288 const T *row = &
values[(si + i) *
N + j];
289 for (
uint32 sj = 0; sj < N1; sj++) {
290 result.
values[si * N1 + sj] = *row;
299 for (
uint32 i = 0; i <
M; i++) {
300 for (
uint32 j = 0; j < columnIndex; j++) {
301 result.values[i * result.GetDimN() + j] =
values[i *
N + j];
304 for (
uint32 j = columnIndex; j < result.GetDimN(); j++) {
305 result.values[i * result.GetDimN() + j] =
values[i *
N + j + 1];
315 for (
uint32 i = 0; i <
M; i++) {
316 for (
uint32 j = 0; j <
N; j++) {
328 for (
uint32 i = 0; i <
M; i++) {
339 for (
uint32 i = 0; i <
N; i++) {
349 for (
uint32 i = 0; i <
M; i++) {
350 for (
uint32 j = 0; j <
N; j++) {
392 template<
typename T, u
int32 DM, u
int32 DN>
409 template<
typename T, u
int32 DN>
414 m.Submatrix(sub, 1, 0);
416 for (
uint32 i = 0; i < DN; i++) {
417 result += (i % 2 ? -1 : 1) * m.
values[i] * sub.ExcludeColumn(i).Det();
424 template<
typename T, u
int32 DM, u
int32 DN>
#define BRK_NS_END
Definition: Config.hpp:48
std::uint32_t uint32
Definition: Typedefs.hpp:44
static void Copy(void *destination, const void *source, size_t sizeInBytes)
Definition: Memory.hpp:58
Generic matrix of M x N size for space of type T.
Definition: TMatMxN.hpp:56
TVecN< T, M > GetColumn(uint32 index) const
Definition: TMatMxN.hpp:324
T * operator[](uint32 i)
Definition: TMatMxN.hpp:364
TMatMxN< T, M, K > operator*(const TMatMxN< T, N, K > &other) const
Definition: TMatMxN.hpp:187
TMatMxN() noexcept
Definition: TMatMxN.hpp:58
TMatMxN operator+(T value) const
Definition: TMatMxN.hpp:245
TMatMxN & operator/=(T other)
Definition: TMatMxN.hpp:212
constexpr static uint32 GetSize()
Definition: TMatMxN.hpp:371
TVecN< T, N > GetRow(uint32 index) const
Definition: TMatMxN.hpp:335
constexpr static uint32 GetDimN()
Definition: TMatMxN.hpp:374
TMatMxN(T m_00, T m_01, T m_02, T m_03, T m_10, T m_11, T m_12, T m_13, T m_20, T m_21, T m_22, T m_23, T m_30, T m_31, T m_32, T m_33) noexcept
Definition: TMatMxN.hpp:105
TMatMxN(const std::array< TVecN< T, N >, M > &rows) noexcept
Definition: TMatMxN.hpp:62
TVecN< T, M > operator*(const TVecN< T, N > &v) const
Definition: TMatMxN.hpp:346
TMatMxN< T, N, M > Transpose() const
Definition: TMatMxN.hpp:312
TMatMxN & operator+=(const TMatMxN &other)
Definition: TMatMxN.hpp:160
TMatMxN< T, M1, N1 > SubMatrix(uint32 i, uint32 j) const
Definition: TMatMxN.hpp:265
TMatMxN(TMatMxN &&other) noexcept
Definition: TMatMxN.hpp:138
T * GetData()
Definition: TMatMxN.hpp:367
TMatMxN(const T *vs, size_t count)
Definition: TMatMxN.hpp:72
TMatMxN operator/(T value) const
Definition: TMatMxN.hpp:239
TMatMxN & operator-=(T other)
Definition: TMatMxN.hpp:226
constexpr static uint32 GetDimM()
Definition: TMatMxN.hpp:373
void Zero()
Definition: TMatMxN.hpp:358
constexpr static uint32 GetStride()
Definition: TMatMxN.hpp:370
TMatMxN & operator=(const TMatMxN &other)
Definition: TMatMxN.hpp:257
TMatMxN(T m_00, T m_01, T m_02, T m_10, T m_11, T m_12, T m_20, T m_21, T m_22) noexcept
Definition: TMatMxN.hpp:87
TMatMxN operator-(const TMatMxN &other) const
Definition: TMatMxN.hpp:180
TMatMxN(const TMatMxN< T, M1, N1 > &other)
Definition: TMatMxN.hpp:145
T values[M *N]
Definition: TMatMxN.hpp:377
void SubMatrix(TMatMxN< T, M1, N1 > &result, uint32 i, uint32 j) const
Definition: TMatMxN.hpp:283
TMatMxN operator-(T value) const
Definition: TMatMxN.hpp:251
TMatMxN & operator*=(T other)
Definition: TMatMxN.hpp:205
const T * GetData() const
Definition: TMatMxN.hpp:368
TMatMxN(const TMatMxN &other) noexcept
Definition: TMatMxN.hpp:132
TMatMxN< T, M, N - 1 > ExcludeColumn(uint32 columnIndex) const
Definition: TMatMxN.hpp:296
TMatMxN operator*(T value) const
Definition: TMatMxN.hpp:233
TMatMxN operator+(const TMatMxN &other) const
Definition: TMatMxN.hpp:174
TMatMxN & operator-=(const TMatMxN &other)
Definition: TMatMxN.hpp:167
TMatMxN(T m_00, T m_01, T m_10, T m_11) noexcept
Definition: TMatMxN.hpp:77
TMatMxN & operator+=(T other)
Definition: TMatMxN.hpp:219
const T * operator[](uint32 i) const
Definition: TMatMxN.hpp:365
Generic vector class for an N dimensional space base on type T.
Definition: TVecN.hpp:55
T values[N]
Definition: TVecN.hpp:595
Definition: GLDevice.cpp:46
T operator()(const TMatMxN< T, 1, 1 > &m) const
Definition: TMatMxN.hpp:397
T operator()(const TMatMxN< T, 2, 2 > &m) const
Definition: TMatMxN.hpp:404
T operator()(const TMatMxN< T, DN, DN > &m) const
Definition: TMatMxN.hpp:411
Matrix det evaluation helper.
Definition: TMatMxN.hpp:425
T operator()(const TMatMxN< T, DM, DN > &m) const
Definition: TMatMxN.hpp:426