mirror of
https://github.com/JoeyDeVries/LearnOpenGL.git
synced 2026-01-02 04:37:54 +08:00
Update GLM to latest version (0.9.9.3). This includes GLM's change of matrices no longer default initializing to the identity matrix. This commit thus also includes the update of all of LearnOpenGL's code to reflect this: all matrices are now constructor-initialized to the identity matrix where relevant.
This commit is contained in:
84
includes/glm/gtx/matrix_factorisation.inl
Normal file
84
includes/glm/gtx/matrix_factorisation.inl
Normal file
@@ -0,0 +1,84 @@
|
||||
/// @ref gtx_matrix_factorisation
|
||||
|
||||
namespace glm
|
||||
{
|
||||
template <length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<C, R, T, Q> flipud(mat<C, R, T, Q> const& in)
|
||||
{
|
||||
mat<R, C, T, Q> tin = transpose(in);
|
||||
tin = fliplr(tin);
|
||||
mat<C, R, T, Q> out = transpose(tin);
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
template <length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER mat<C, R, T, Q> fliplr(mat<C, R, T, Q> const& in)
|
||||
{
|
||||
mat<C, R, T, Q> out;
|
||||
for (length_t i = 0; i < C; i++)
|
||||
{
|
||||
out[i] = in[(C - i) - 1];
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
template <length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER void qr_decompose(mat<C, R, T, Q> const& in, mat<(C < R ? C : R), R, T, Q>& q, mat<C, (C < R ? C : R), T, Q>& r)
|
||||
{
|
||||
// Uses modified Gram-Schmidt method
|
||||
// Source: https://en.wikipedia.org/wiki/Gram<61>Schmidt_process
|
||||
// And https://en.wikipedia.org/wiki/QR_decomposition
|
||||
|
||||
//For all the linearly independs columns of the input...
|
||||
// (there can be no more linearly independents columns than there are rows.)
|
||||
for (length_t i = 0; i < (C < R ? C : R); i++)
|
||||
{
|
||||
//Copy in Q the input's i-th column.
|
||||
q[i] = in[i];
|
||||
|
||||
//j = [0,i[
|
||||
// Make that column orthogonal to all the previous ones by substracting to it the non-orthogonal projection of all the previous columns.
|
||||
// Also: Fill the zero elements of R
|
||||
for (length_t j = 0; j < i; j++)
|
||||
{
|
||||
q[i] -= dot(q[i], q[j])*q[j];
|
||||
r[j][i] = 0;
|
||||
}
|
||||
|
||||
//Now, Q i-th column is orthogonal to all the previous columns. Normalize it.
|
||||
q[i] = normalize(q[i]);
|
||||
|
||||
//j = [i,C[
|
||||
//Finally, compute the corresponding coefficients of R by computing the projection of the resulting column on the other columns of the input.
|
||||
for (length_t j = i; j < C; j++)
|
||||
{
|
||||
r[j][i] = dot(in[j], q[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template <length_t C, length_t R, typename T, qualifier Q>
|
||||
GLM_FUNC_QUALIFIER void rq_decompose(mat<C, R, T, Q> const& in, mat<(C < R ? C : R), R, T, Q>& r, mat<C, (C < R ? C : R), T, Q>& q)
|
||||
{
|
||||
// From https://en.wikipedia.org/wiki/QR_decomposition:
|
||||
// The RQ decomposition transforms a matrix A into the product of an upper triangular matrix R (also known as right-triangular) and an orthogonal matrix Q. The only difference from QR decomposition is the order of these matrices.
|
||||
// QR decomposition is Gram<61>Schmidt orthogonalization of columns of A, started from the first column.
|
||||
// RQ decomposition is Gram<61>Schmidt orthogonalization of rows of A, started from the last row.
|
||||
|
||||
mat<R, C, T, Q> tin = transpose(in);
|
||||
tin = fliplr(tin);
|
||||
|
||||
mat<R, (C < R ? C : R), T, Q> tr;
|
||||
mat<(C < R ? C : R), C, T, Q> tq;
|
||||
qr_decompose(tin, tq, tr);
|
||||
|
||||
tr = fliplr(tr);
|
||||
r = transpose(tr);
|
||||
r = fliplr(r);
|
||||
|
||||
tq = fliplr(tq);
|
||||
q = transpose(tq);
|
||||
}
|
||||
} //namespace glm
|
||||
Reference in New Issue
Block a user