diff --git a/docs/source/mat4.rst b/docs/source/mat4.rst index 33251b9..31817a4 100644 --- a/docs/source/mat4.rst +++ b/docs/source/mat4.rst @@ -47,6 +47,7 @@ Functions: #. :c:func:`glm_mat4_swap_col` #. :c:func:`glm_mat4_swap_row` #. :c:func:`glm_mat4_rmc` +#. :c:func:`glm_mat4_make` Functions documentation ~~~~~~~~~~~~~~~~~~~~~~~ @@ -302,3 +303,13 @@ Functions documentation Returns: scalar value e.g. Matrix1x1 + +.. c:function:: void glm_mat4_make(float * __restrict src, mat4 dest) + + Create mat4 matrix from pointer + + | NOTE: **@src** must contain 16 elements. + + Parameters: + | *[in]* **src** pointer to an array of floats + | *[out]* **dest** destination matrix4x4 diff --git a/include/cglm/call/mat4.h b/include/cglm/call/mat4.h index 1c71da1..f85ef2d 100644 --- a/include/cglm/call/mat4.h +++ b/include/cglm/call/mat4.h @@ -121,6 +121,10 @@ CGLM_EXPORT float glmc_mat4_rmc(vec4 r, mat4 m, vec4 c); +CGLM_EXPORT +void +glmc_mat4_make(float * __restrict src, mat4 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/mat4.h b/include/cglm/mat4.h index 932878d..32ecdf2 100644 --- a/include/cglm/mat4.h +++ b/include/cglm/mat4.h @@ -43,6 +43,7 @@ CGLM_INLINE void glm_mat4_swap_col(mat4 mat, int col1, int col2); CGLM_INLINE void glm_mat4_swap_row(mat4 mat, int row1, int row2); CGLM_INLINE float glm_mat4_rmc(vec4 r, mat4 m, vec4 c); + CGLM_INLINE void glm_mat4_make(float * restrict src, mat4 dest); */ #ifndef cglm_mat_h @@ -781,4 +782,24 @@ glm_mat4_rmc(vec4 r, mat4 m, vec4 c) { return glm_vec4_dot(r, tmp); } +/*! + * @brief Create mat4 matrix from pointer + * + * @param[in] src pointer to an array of floats + * @param[out] dest matrix + */ +CGLM_INLINE +void +glm_mat4_make(float * __restrict src, mat4 dest) { + dest[0][0] = src[0]; dest[1][0] = src[4]; + dest[0][1] = src[1]; dest[1][1] = src[5]; + dest[0][2] = src[2]; dest[1][2] = src[6]; + dest[0][3] = src[3]; dest[1][3] = src[7]; + + dest[2][0] = src[8]; dest[3][0] = src[12]; + dest[2][1] = src[9]; dest[3][1] = src[13]; + dest[2][2] = src[10]; dest[3][2] = src[14]; + dest[2][3] = src[11]; dest[3][3] = src[15]; +} + #endif /* cglm_mat_h */ diff --git a/include/cglm/struct/mat4.h b/include/cglm/struct/mat4.h index 6517f5c..222ab5d 100644 --- a/include/cglm/struct/mat4.h +++ b/include/cglm/struct/mat4.h @@ -459,4 +459,17 @@ glms_mat4_(rmc)(vec4s r, mat4s m, vec4s c) { return glm_mat4_rmc(r.raw, m.raw, c.raw); } +/*! + * @brief Create mat4 matrix from pointer + * + * @param[in] src pointer to an array of floats + * @param[out] dest matrix + */ +CGLM_INLINE +mat4s +glms_mat4_(make)(float * __restrict src, mat4s dest) { + glm_mat4_make(src, dest.raw); + return dest; +} + #endif /* cglms_mat4s_h */ diff --git a/src/mat4.c b/src/mat4.c index a9f39c6..44c6c58 100644 --- a/src/mat4.c +++ b/src/mat4.c @@ -163,3 +163,9 @@ float glmc_mat4_rmc(vec4 r, mat4 m, vec4 c) { return glm_mat4_rmc(r, m, c); } + +CGLM_EXPORT +void +glmc_mat4_make(float * __restrict src, mat4 dest) { + glm_mat4_make(src, dest); +} diff --git a/test/src/test_mat4.h b/test/src/test_mat4.h index d42e457..19cfc51 100644 --- a/test/src/test_mat4.h +++ b/test/src/test_mat4.h @@ -9,6 +9,7 @@ #define A_MATRIX {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}} #define A_MATRIX3 {{1,2,3},{5,6,7},{9,10,11}} +#define MAT4_ARRAY {1, 5, 2, 7, 12, 1, 4, 6, 0, 8, 1, 0, 6, 5, 0, 1} TEST_IMPL(GLM_PREFIX, mat4_ucopy) { mat4 m1 = A_MATRIX; @@ -484,5 +485,22 @@ TEST_IMPL(GLM_PREFIX, mat4_rmc) { TEST_SUCCESS } +TEST_IMPL(GLM_PREFIX, mat4_make) { + mat4 dest; + unsigned int i, j; + float src[16] = MAT4_ARRAY; + + GLM(mat4_make)(src, dest); + + for (i = 0, j = 0; i < sizeof(src) / sizeof(float); i+=4, j++) { + ASSERT(test_eq(dest[j][0], src[i])) + ASSERT(test_eq(dest[j][1], src[i+1])) + ASSERT(test_eq(dest[j][2], src[i+2])) + ASSERT(test_eq(dest[j][3], src[i+3])) + } + + TEST_SUCCESS +} + #undef A_MATRIX #undef A_MATRIX3 diff --git a/test/tests.h b/test/tests.h index 035ac33..97e1af8 100644 --- a/test/tests.h +++ b/test/tests.h @@ -124,6 +124,7 @@ TEST_DECLARE(glm_mat4_inv_precise) TEST_DECLARE(glm_mat4_swap_col) TEST_DECLARE(glm_mat4_swap_row) TEST_DECLARE(glm_mat4_rmc) +TEST_DECLARE(glm_mat4_make) TEST_DECLARE(glmc_mat4_ucopy) TEST_DECLARE(glmc_mat4_copy) @@ -150,6 +151,7 @@ TEST_DECLARE(glmc_mat4_inv_fast) TEST_DECLARE(glmc_mat4_swap_col) TEST_DECLARE(glmc_mat4_swap_row) TEST_DECLARE(glmc_mat4_rmc) +TEST_DECLARE(glmc_mat4_make) /* mat3 */ TEST_DECLARE(glm_mat3_copy) @@ -965,6 +967,7 @@ TEST_LIST { TEST_ENTRY(glm_mat4_swap_col) TEST_ENTRY(glm_mat4_swap_row) TEST_ENTRY(glm_mat4_rmc) + TEST_ENTRY(glm_mat4_make) TEST_ENTRY(glmc_mat4_ucopy) TEST_ENTRY(glmc_mat4_copy) @@ -991,6 +994,7 @@ TEST_LIST { TEST_ENTRY(glmc_mat4_swap_col) TEST_ENTRY(glmc_mat4_swap_row) TEST_ENTRY(glmc_mat4_rmc) + TEST_ENTRY(glmc_mat4_make) /* mat3 */ TEST_ENTRY(glm_mat3_copy)