From 46864ba2f7aca5a0d2c130736415ebe4f3bd66f8 Mon Sep 17 00:00:00 2001 From: Vincent Davis Jr Date: Sat, 30 Mar 2024 17:44:28 -0400 Subject: [PATCH 1/2] mat2x4: fix multiplication functions Signed-off-by: Vincent Davis Jr --- include/cglm/call/mat2x4.h | 4 ++-- include/cglm/mat2x4.h | 46 +++++++++++++++++++++++++----------- include/cglm/struct/mat2x4.h | 14 +++++------ src/mat2x4.c | 4 ++-- test/src/test_mat2x4.h | 24 +++++++++---------- test/tests.h | 14 +++++------ 6 files changed, 62 insertions(+), 44 deletions(-) diff --git a/include/cglm/call/mat2x4.h b/include/cglm/call/mat2x4.h index b11fd0e..84e805b 100644 --- a/include/cglm/call/mat2x4.h +++ b/include/cglm/call/mat2x4.h @@ -27,11 +27,11 @@ glmc_mat2x4_make(const float * __restrict src, mat2x4 dest); CGLM_EXPORT void -glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest); +glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest); CGLM_EXPORT void -glmc_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest); +glmc_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest); CGLM_EXPORT void diff --git a/include/cglm/mat2x4.h b/include/cglm/mat2x4.h index 9b1bd48..2fdda24 100644 --- a/include/cglm/mat2x4.h +++ b/include/cglm/mat2x4.h @@ -14,8 +14,8 @@ CGLM_INLINE void glm_mat2x4_copy(mat2x4 mat, mat2x4 dest); CGLM_INLINE void glm_mat2x4_zero(mat2x4 mat); CGLM_INLINE void glm_mat2x4_make(const float * __restrict src, mat2x4 dest); - CGLM_INLINE void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest); - CGLM_INLINE void glm_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest); + CGLM_INLINE void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest); + CGLM_INLINE void glm_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest); CGLM_INLINE void glm_mat2x4_transpose(mat2x4 m, mat4x2 dest); CGLM_INLINE void glm_mat2x4_scale(mat2x4 m, float s); */ @@ -80,16 +80,16 @@ glm_mat2x4_make(const float * __restrict src, mat2x4 dest) { * @brief multiply m1 and m2 to dest * * @code - * glm_mat2x4_mul(mat2x4, mat4x2, mat2); + * glm_mat2x4_mul(mat2x4, mat4x2, mat4); * @endcode * * @param[in] m1 left matrix (mat2x4) * @param[in] m2 right matrix (mat4x2) - * @param[out] dest destination matrix (mat2) + * @param[out] dest destination matrix (mat4) */ CGLM_INLINE void -glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest) { +glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest) { float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a03 = m1[0][3], a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], a13 = m1[1][3], @@ -98,15 +98,29 @@ glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest) { b20 = m2[2][0], b21 = m2[2][1], b30 = m2[3][0], b31 = m2[3][1]; - dest[0][0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30; - dest[0][1] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31; + dest[0][0] = a00 * b00 + a10 * b01; + dest[0][1] = a01 * b00 + a11 * b01; + dest[0][2] = a02 * b00 + a12 * b01; + dest[0][3] = a03 * b00 + a13 * b01; - dest[1][0] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30; - dest[1][1] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31; + dest[1][0] = a00 * b10 + a10 * b11; + dest[1][1] = a01 * b10 + a11 * b11; + dest[1][2] = a02 * b10 + a12 * b11; + dest[1][3] = a03 * b10 + a13 * b11; + + dest[2][0] = a00 * b20 + a10 * b21; + dest[2][1] = a01 * b20 + a11 * b21; + dest[2][2] = a02 * b20 + a12 * b21; + dest[2][3] = a03 * b20 + a13 * b21; + + dest[3][0] = a00 * b30 + a10 * b31; + dest[3][1] = a01 * b30 + a11 * b31; + dest[3][2] = a02 * b30 + a12 * b31; + dest[3][3] = a03 * b30 + a13 * b31; } /*! - * @brief multiply matrix with column vector and store in dest vector + * @brief multiply matrix with column vector and store in dest column vector * * @param[in] m matrix (left) * @param[in] v vector (right, column vector) @@ -114,11 +128,15 @@ glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest) { */ CGLM_INLINE void -glm_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest) { - float v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3]; +glm_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest) { + float v0, v1; - dest[0] = m[0][0] * v0 + m[0][1] * v1 + m[0][2] * v2 + m[0][3] * v3; - dest[1] = m[1][0] * v0 + m[1][1] * v1 + m[1][2] * v2 + m[1][3] * v3; + v0 = v[0], v1 = v[1]; + + dest[0] = m[0][0] * v0 + m[1][0] * v1; + dest[1] = m[0][1] * v0 + m[1][1] * v1; + dest[2] = m[0][2] * v0 + m[1][2] * v1; + dest[3] = m[0][3] * v0 + m[1][3] * v1; } /*! diff --git a/include/cglm/struct/mat2x4.h b/include/cglm/struct/mat2x4.h index fbb63e0..afeedc1 100644 --- a/include/cglm/struct/mat2x4.h +++ b/include/cglm/struct/mat2x4.h @@ -14,7 +14,7 @@ CGLM_INLINE mat2x4s glms_mat2x4_zero(void); CGLM_INLINE mat2x4s glms_mat2x4_make(const float * __restrict src); CGLM_INLINE mat2s glms_mat2x4_mul(mat2x4s m1, mat4x2s m2); - CGLM_INLINE vec2s glms_mat2x4_mulv(mat2x4s m, vec4s v); + CGLM_INLINE vec4s glms_mat2x4_mulv(mat2x4s m, vec2s v); CGLM_INLINE mat4x2s glms_mat2x4_transpose(mat2x4s m); CGLM_INLINE mat2x4s glms_mat2x4_scale(mat2x4s m, float s); */ @@ -73,24 +73,24 @@ glms_mat2x4_(make)(const float * __restrict src) { * @returns destination matrix (mat2s) */ CGLM_INLINE -mat2s +mat4s glms_mat2x4_(mul)(mat2x4s m1, mat4x2s m2) { - mat2s r; + mat4s r; glm_mat2x4_mul(m1.raw, m2.raw, r.raw); return r; } /*! - * @brief multiply matrix with column vector and store in dest vector + * @brief multiply matrix with column vector and store in dest column vector * * @param[in] m matrix (left) * @param[in] v vector (right, column vector) * @param[out] dest result vector */ CGLM_INLINE -vec2s -glms_mat2x4_(mulv)(mat2x4s m, vec4s v) { - vec2s r; +vec4s +glms_mat2x4_(mulv)(mat2x4s m, vec2s v) { + vec4s r; glm_mat2x4_mulv(m.raw, v.raw, r.raw); return r; } diff --git a/src/mat2x4.c b/src/mat2x4.c index 73db032..a221ed3 100644 --- a/src/mat2x4.c +++ b/src/mat2x4.c @@ -28,13 +28,13 @@ glmc_mat2x4_make(const float * __restrict src, mat2x4 dest) { CGLM_EXPORT void -glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest) { +glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest) { glm_mat2x4_mul(m1, m2, dest); } CGLM_EXPORT void -glmc_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest) { +glmc_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest) { glm_mat2x4_mulv(m, v, dest); } diff --git a/test/src/test_mat2x4.h b/test/src/test_mat2x4.h index ea594d1..17ee35f 100644 --- a/test/src/test_mat2x4.h +++ b/test/src/test_mat2x4.h @@ -86,42 +86,42 @@ TEST_IMPL(GLM_PREFIX, mat2x4_mul) { mat2x4 m1 = GLM_MAT2X4_ZERO_INIT; mat4x2 m2 = GLM_MAT4X2_ZERO_INIT; - mat2 m3 = GLM_MAT2_ZERO_INIT; - mat2 m4 = GLM_MAT2_ZERO_INIT; + mat4 m3 = GLM_MAT4_ZERO_INIT; + mat4 m4 = GLM_MAT4_ZERO_INIT; - int i, j, k; + int c, r, k; /* test random matrices */ /* random matrices */ test_rand_mat2x4(m1); test_rand_mat4x2(m2); - for (i = 0; i < 2; i++) { - for (j = 0; j < 2; j++) { - for (k = 0; k < 4; k++) { - m4[i][j] += m1[i][k] * m2[k][j]; + for (r = 0; r < 4; r++) { + for (c = 0; c < 4; c++) { + for (k = 0; k < 2; k++) { + m4[c][r] += m1[k][r] * m2[c][k]; } } } GLM(mat2x4_mul)(m1, m2, m3); - ASSERTIFY(test_assert_mat2_eq(m3, m4)) + ASSERTIFY(test_assert_mat4_eq(m3, m4)) TEST_SUCCESS } TEST_IMPL(GLM_PREFIX, mat2x4_mulv) { mat2x4 mat = A_MATRIX2X4; - vec4 v = {11.0f, 21.0f, 31.0f, 41.0f}; + vec2 v = {11.0f, 21.0f}; int i; - vec2 dest; + vec4 dest; float res = 0.0; GLM(mat2x4_mulv)(mat, v, dest); - for (i = 0; i < 2; i++) { - res = mat[i][0] * v[0] + mat[i][1] * v[1] + mat[i][2] * v[2] + mat[i][3] * v[3]; + for (i = 0; i < 4; i++) { + res = mat[0][i] * v[0] + mat[1][i] * v[1]; ASSERT(test_eq(dest[i], res)) } diff --git a/test/tests.h b/test/tests.h index d85a155..bcb2fda 100644 --- a/test/tests.h +++ b/test/tests.h @@ -1494,13 +1494,13 @@ TEST_LIST { TEST_ENTRY(glm_mat2x4_transpose) TEST_ENTRY(glm_mat2x4_scale) - TEST_ENTRY(glm_mat2x4_copy) - TEST_ENTRY(glm_mat2x4_zero) - TEST_ENTRY(glm_mat2x4_make) - TEST_ENTRY(glm_mat2x4_mul) - TEST_ENTRY(glm_mat2x4_mulv) - TEST_ENTRY(glm_mat2x4_transpose) - TEST_ENTRY(glm_mat2x4_scale) + TEST_ENTRY(glmc_mat2x4_copy) + TEST_ENTRY(glmc_mat2x4_zero) + TEST_ENTRY(glmc_mat2x4_make) + TEST_ENTRY(glmc_mat2x4_mul) + TEST_ENTRY(glmc_mat2x4_mulv) + TEST_ENTRY(glmc_mat2x4_transpose) + TEST_ENTRY(glmc_mat2x4_scale) /* camera (incl [LR]H cross [NZ]O) */ TEST_ENTRY(glm_perspective_lh_zo) From 54dfbc5a286af0bf8296111e22b378daa40176fe Mon Sep 17 00:00:00 2001 From: Vincent Davis Jr Date: Sat, 30 Mar 2024 18:29:03 -0400 Subject: [PATCH 2/2] docs: mat2x4 account for latest mulitplication changes This also includes tables to explain how mat2x4, column vectors, and row vectors are represented. Also includes how resulting matrix or vector is formed. Signed-off-by: Vincent Davis Jr --- docs/source/mat2x4.rst | 67 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/docs/source/mat2x4.rst b/docs/source/mat2x4.rst index 9a0445f..0acc643 100644 --- a/docs/source/mat2x4.rst +++ b/docs/source/mat2x4.rst @@ -23,6 +23,17 @@ Functions: #. :c:func:`glm_mat2x4_transpose` #. :c:func:`glm_mat2x4_scale` +Represented +~~~~~~~~~~~ + +.. csv-table:: mat2x4 + :header: "", "column 1", "column 2" + + "row 1", "m00", "m10" + "row 2", "m01", "m11" + "row 3", "m02", "m12" + "row 4", "m03", "m13" + Functions documentation ~~~~~~~~~~~~~~~~~~~~~~~ @@ -51,28 +62,72 @@ Functions documentation | *[in]* **src** pointer to an array of floats | *[out]* **dest** destination matrix2x4 -.. c:function:: void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest) +.. c:function:: void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest) multiply m1 and m2 to dest .. code-block:: c - glm_mat2x4_mul(mat2x4, mat4x2, mat2); + glm_mat2x4_mul(mat2x4, mat4x2, mat4); Parameters: | *[in]* **m1** left matrix (mat2x4) | *[in]* **m2** right matrix (mat4x2) - | *[out]* **dest** destination matrix (mat2) + | *[out]* **dest** destination matrix (mat4) -.. c:function:: void glm_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest) + .. csv-table:: mat2x4 + :header: "", "column 1", "column 2" - multiply mat2x4 with vec4 (column vector) and store in dest vector + "row 1", "a00", "a10" + "row 2", "a01", "a11" + "row 3", "a02", "a12" + "row 4", "a03", "a13" + + .. csv-table:: mat4x2 + :header: "", "column 1", "column 2", "column 3", "column 4" + + "row 1", "b00", "b10", "b20", "b30" + "row 2", "b01", "b11", "b21", "b31" + + .. csv-table:: mat4x4 + :header: "", "column 1", "column 2", "column 3", "column 4" + + "row 1", "a00 * b00 + a10 * b01", "a00 * b10 + a10 * b11", "a00 * b20 + a10 * b21", "a00 * b30 + a10 * b31" + "row 2", "a01 * b00 + a11 * b01", "a01 * b10 + a11 * b11", "a01 * b20 + a11 * b21", "a01 * b30 + a11 * b31" + "row 3", "a02 * b00 + a12 * b01", "a02 * b10 + a12 * b11", "a02 * b20 + a12 * b21", "a02 * b30 + a12 * b31" + "row 4", "a03 * b00 + a13 * b01", "a03 * b10 + a13 * b11", "a03 * b20 + a13 * b21", "a03 * b30 + a13 * b31" + +.. c:function:: void glm_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest) + + multiply mat2x4 with vec2 (column vector) and store in dest column vector Parameters: | *[in]* **m** mat2x4 (left) - | *[in]* **v** vec4 (right, column vector) + | *[in]* **v** vec2 (right, column vector) | *[out]* **dest** destination (result, column vector) + .. csv-table:: mat2x4 + :header: "", "column 1", "column 2" + + "row 1", "m00", "m10" + "row 2", "m01", "m11" + "row 3", "m02", "m12" + "row 4", "m03", "m13" + + .. csv-table:: column vec2 (1x2) + :header: "", "column 1" + + "row 1", "v0" + "row 2", "v1" + + .. csv-table:: column vec4 (1x4) + :header: "", "column 1" + + "row 1", "m00 * v0 + m10 * v1" + "row 2", "m01 * v0 + m11 * v1" + "row 3", "m02 * v0 + m12 * v1" + "row 4", "m03 * v0 + m13 * v1" + .. c:function:: void glm_mat2x4_transpose(mat2x4 m, mat4x2 dest) transpose matrix and store in dest