diff --git a/glm/gtx/matrix_decompose.hpp b/glm/gtx/matrix_decompose.hpp index acd7a7f0..8ab38e6b 100644 --- a/glm/gtx/matrix_decompose.hpp +++ b/glm/gtx/matrix_decompose.hpp @@ -40,6 +40,12 @@ namespace glm mat<4, 4, T, Q> const& modelMatrix, vec<3, T, Q> & scale, qua & orientation, vec<3, T, Q> & translation, vec<3, T, Q> & skew, vec<4, T, Q> & perspective); + // Recomposes a model matrix from a previously-decomposed matrix + template + GLM_FUNC_DECL mat<4, 4, T, Q> recompose( + vec<3, T, Q> const& scale, qua const& orientation, vec<3, T, Q> const& translation, + vec<3, T, Q> const& skew, vec<4, T, Q> const& perspective); + /// @} }//namespace glm diff --git a/glm/gtx/matrix_decompose.inl b/glm/gtx/matrix_decompose.inl index aa4386af..ee42351d 100644 --- a/glm/gtx/matrix_decompose.inl +++ b/glm/gtx/matrix_decompose.inl @@ -2,6 +2,7 @@ #include "../gtc/constants.hpp" #include "../gtc/epsilon.hpp" +#include "../gtx/transform.hpp" namespace glm{ namespace detail @@ -189,4 +190,45 @@ namespace detail return true; } + + // Recomposes a model matrix from a previously-decomposed matrix + // http://www.opensource.apple.com/source/WebCore/WebCore-514/platform/graphics/transforms/TransformationMatrix.cpp + // https://stackoverflow.com/a/75573092/1047040 + template + GLM_FUNC_DECL mat<4, 4, T, Q> recompose( + vec<3, T, Q> const& scale, qua const& orientation, vec<3, T, Q> const& translation, + vec<3, T, Q> const& skew, vec<4, T, Q> const& perspective) + { + glm::mat4 m = glm::mat4(1.f); + + m[0][3] = perspective.x; + m[1][3] = perspective.y; + m[2][3] = perspective.z; + m[3][3] = perspective.w; + + m *= glm::translate(translation); + m *= glm::mat4_cast(orientation); + + if (skew.x) { + glm::mat4 tmp { 1.f }; + tmp[2][1] = skew.x; + m *= tmp; + } + + if (skew.y) { + glm::mat4 tmp { 1.f }; + tmp[2][0] = skew.y; + m *= tmp; + } + + if (skew.z) { + glm::mat4 tmp { 1.f }; + tmp[1][0] = skew.z; + m *= tmp; + } + + m *= glm::scale(scale); + + return m; + } }//namespace glm diff --git a/test/gtx/gtx_matrix_decompose.cpp b/test/gtx/gtx_matrix_decompose.cpp index 5a1884e5..1f088d64 100644 --- a/test/gtx/gtx_matrix_decompose.cpp +++ b/test/gtx/gtx_matrix_decompose.cpp @@ -15,5 +15,7 @@ int main() glm::decompose(Matrix, Scale, Orientation, Translation, Skew, Perspective); + glm::mat4 Out = glm::recompose(Scale, Orientation, Translation, Skew, Perspective); + return Error; }