From 2283c708c6a0f2938a980bae5bff6489ae7efd9b Mon Sep 17 00:00:00 2001 From: Vincent Davis Jr Date: Sat, 30 Mar 2024 21:10:10 -0400 Subject: [PATCH 1/2] mat3x2: fix multiplication functions Signed-off-by: Vincent Davis Jr --- include/cglm/call/mat3x2.h | 4 ++-- include/cglm/mat3x2.h | 37 ++++++++++++++++-------------------- include/cglm/struct/mat3x2.h | 14 +++++++------- src/mat3x2.c | 4 ++-- test/src/test_mat3x2.h | 24 +++++++++++------------ 5 files changed, 39 insertions(+), 44 deletions(-) diff --git a/include/cglm/call/mat3x2.h b/include/cglm/call/mat3x2.h index 302ae93..3c0daed 100644 --- a/include/cglm/call/mat3x2.h +++ b/include/cglm/call/mat3x2.h @@ -27,11 +27,11 @@ glmc_mat3x2_make(const float * __restrict src, mat3x2 dest); CGLM_EXPORT void -glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest); +glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest); CGLM_EXPORT void -glmc_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest); +glmc_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest); CGLM_EXPORT void diff --git a/include/cglm/mat3x2.h b/include/cglm/mat3x2.h index 0ed466f..6369131 100644 --- a/include/cglm/mat3x2.h +++ b/include/cglm/mat3x2.h @@ -14,8 +14,8 @@ CGLM_INLINE void glm_mat3x2_copy(mat3x2 mat, mat3x2 dest); CGLM_INLINE void glm_mat3x2_zero(mat3x2 mat); CGLM_INLINE void glm_mat3x2_make(const float * __restrict src, mat3x2 dest); - CGLM_INLINE void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest); - CGLM_INLINE void glm_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest); + CGLM_INLINE void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest); + CGLM_INLINE void glm_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest); CGLM_INLINE void glm_mat3x2_transpose(mat3x2 m, mat2x3 dest); CGLM_INLINE void glm_mat3x2_scale(mat3x2 m, float s); */ @@ -84,16 +84,16 @@ glm_mat3x2_make(const float * __restrict src, mat3x2 dest) { * @brief multiply m1 and m2 to dest * * @code - * glm_mat3x2_mul(mat3x2, mat2x3, mat3); + * glm_mat3x2_mul(mat3x2, mat2x3, mat2); * @endcode * * @param[in] m1 left matrix (mat3x2) * @param[in] m2 right matrix (mat2x3) - * @param[out] dest destination matrix (mat3) + * @param[out] dest destination matrix (mat2) */ CGLM_INLINE void -glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest) { +glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest) { float a00 = m1[0][0], a01 = m1[0][1], a10 = m1[1][0], a11 = m1[1][1], a20 = m1[2][0], a21 = m1[2][1], @@ -101,21 +101,15 @@ glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest) { b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2], b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2]; - dest[0][0] = a00 * b00 + a01 * b10; - dest[0][1] = a00 * b01 + a01 * b11; - dest[0][2] = a00 * b02 + a01 * b12; + dest[0][0] = a00 * b00 + a10 * b01 + a20 * b02; + dest[0][1] = a01 * b00 + a11 * b01 + a21 * b02; - dest[1][0] = a10 * b00 + a11 * b10; - dest[1][1] = a10 * b01 + a11 * b11; - dest[1][2] = a10 * b02 + a11 * b12; - - dest[2][0] = a20 * b00 + a21 * b10; - dest[2][1] = a20 * b01 + a21 * b11; - dest[2][2] = a20 * b02 + a21 * b12; + dest[1][0] = a00 * b10 + a10 * b11 + a20 * b12; + dest[1][1] = a01 * b10 + a11 * b11 + a21 * b12; } /*! - * @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) @@ -123,12 +117,13 @@ glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest) { */ CGLM_INLINE void -glm_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest) { - float v0 = v[0], v1 = v[1]; +glm_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest) { + float v0, v1, v2; - dest[0] = m[0][0] * v0 + m[0][1] * v1; - dest[1] = m[1][0] * v0 + m[1][1] * v1; - dest[2] = m[2][0] * v0 + m[2][1] * v1; + v0 = v[0], v1 = v[1], v2 = v[2]; + + dest[0] = m[0][0] * v0 + m[1][0] * v1 + m[2][0] * v2; + dest[1] = m[0][1] * v0 + m[1][1] * v1 + m[2][1] * v2; } /*! diff --git a/include/cglm/struct/mat3x2.h b/include/cglm/struct/mat3x2.h index e9d077b..a95d5e1 100644 --- a/include/cglm/struct/mat3x2.h +++ b/include/cglm/struct/mat3x2.h @@ -13,8 +13,8 @@ Functions: CGLM_INLINE mat3x2s glms_mat3x2_zero(void); CGLM_INLINE mat3x2s glms_mat3x2_make(const float * __restrict src); - CGLM_INLINE mat3s glms_mat3x2_mul(mat3x2s m1, mat2x3s m2); - CGLM_INLINE vec3s glms_mat3x2_mulv(mat3x2s m, vec2s v); + CGLM_INLINE mat2s glms_mat3x2_mul(mat3x2s m1, mat2x3s m2); + CGLM_INLINE vec2s glms_mat3x2_mulv(mat3x2s m, vec3s v); CGLM_INLINE mat2x3s glms_mat3x2_transpose(mat3x2s m); CGLM_INLINE mat3x2s glms_mat3x2_scale(mat3x2s m, float s); */ @@ -73,9 +73,9 @@ glms_mat3x2_(make)(const float * __restrict src) { * @returns destination matrix (mat3s) */ CGLM_INLINE -mat3s +mat2s glms_mat3x2_(mul)(mat3x2s m1, mat2x3s m2) { - mat3s r; + mat2s r; glm_mat3x2_mul(m1.raw, m2.raw, r.raw); return r; } @@ -88,9 +88,9 @@ glms_mat3x2_(mul)(mat3x2s m1, mat2x3s m2) { * @param[out] dest result vector */ CGLM_INLINE -vec3s -glms_mat3x2_(mulv)(mat3x2s m, vec2s v) { - vec3s r; +vec2s +glms_mat3x2_(mulv)(mat3x2s m, vec3s v) { + vec2s r; glm_mat3x2_mulv(m.raw, v.raw, r.raw); return r; } diff --git a/src/mat3x2.c b/src/mat3x2.c index 8517a9e..5ade303 100644 --- a/src/mat3x2.c +++ b/src/mat3x2.c @@ -28,13 +28,13 @@ glmc_mat3x2_make(const float * __restrict src, mat3x2 dest) { CGLM_EXPORT void -glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest) { +glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest) { glm_mat3x2_mul(m1, m2, dest); } CGLM_EXPORT void -glmc_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest) { +glmc_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest) { glm_mat3x2_mulv(m, v, dest); } diff --git a/test/src/test_mat3x2.h b/test/src/test_mat3x2.h index a825a2b..397879b 100644 --- a/test/src/test_mat3x2.h +++ b/test/src/test_mat3x2.h @@ -84,40 +84,40 @@ TEST_IMPL(GLM_PREFIX, mat3x2_mul) { mat3x2 m1 = GLM_MAT3X2_ZERO_INIT; mat2x3 m2 = GLM_MAT2X3_ZERO_INIT; - mat3 m3 = GLM_MAT3_ZERO_INIT; - mat3 m4 = GLM_MAT3_ZERO_INIT; + mat2 m3 = GLM_MAT2_ZERO_INIT; + mat2 m4 = GLM_MAT2_ZERO_INIT; - int i, j, k; + int c, r, k; test_rand_mat3x2(m1); test_rand_mat2x3(m2); - for (i = 0; i < 3; i++) { - for (j = 0; j < 3; j++) { - for (k = 0; k < 2; k++) { - m4[i][j] += m1[i][k] * m2[k][j]; + for (r = 0; r < 2; r++) { + for (c = 0; c < 2; c++) { + for (k = 0; k < 3; k++) { + m4[c][r] += m1[k][r] * m2[c][k]; } } } GLM(mat3x2_mul)(m1, m2, m3); - ASSERTIFY(test_assert_mat3_eq(m3, m4)) + ASSERTIFY(test_assert_mat2_eq(m3, m4)) TEST_SUCCESS } TEST_IMPL(GLM_PREFIX, mat3x2_mulv) { mat3x2 mat = A_MATRIX3X2; - vec2 v = {11.0f, 21.0f}; + vec3 v = {11.0f, 21.0f, 31.0f}; int i; - vec3 dest; + vec2 dest; float res = 0.0; GLM(mat3x2_mulv)(mat, v, dest); - for (i = 0; i < 3; i++) { - res = mat[i][0] * v[0] + mat[i][1] * v[1]; + for (i = 0; i < 2; i++) { + res = mat[0][i] * v[0] + mat[1][i] * v[1] + mat[2][i] * v[2]; ASSERT(test_eq(dest[i], res)) } From 088c66029d198939c7c13433bd6050d5dae0ba12 Mon Sep 17 00:00:00 2001 From: Vincent Davis Jr Date: Sun, 31 Mar 2024 00:39:27 -0400 Subject: [PATCH 2/2] docs: mat3x2 account for latest mulitplication changes This also includes tables to explain how mat3x2, column vectors, and row vectors are represented. Also includes how resulting matrix or vector is formed. Signed-off-by: Vincent Davis Jr --- docs/source/mat3x2.rst | 57 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/docs/source/mat3x2.rst b/docs/source/mat3x2.rst index 7290153..7604728 100644 --- a/docs/source/mat3x2.rst +++ b/docs/source/mat3x2.rst @@ -23,6 +23,15 @@ Functions: #. :c:func:`glm_mat3x2_transpose` #. :c:func:`glm_mat3x2_scale` +Represented +~~~~~~~~~~~ + +.. csv-table:: mat3x2 + :header: "", "column 1", "column 2", "column 3" + + "row 1", "m00", "m10", "m20" + "row 2", "m01", "m11", "m21" + Functions documentation ~~~~~~~~~~~~~~~~~~~~~~~ @@ -51,28 +60,66 @@ Functions documentation | *[in]* **src** pointer to an array of floats | *[out]* **dest** destination matrix3x2 -.. c:function:: void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest) +.. c:function:: void glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat2 dest) multiply m1 and m2 to dest .. code-block:: c - glm_mat3x2_mul(mat3x2, mat2x3, mat3); + glm_mat3x2_mul(mat3x2, mat2x3, mat2); Parameters: | *[in]* **m1** left matrix (mat3x2) | *[in]* **m2** right matrix (mat2x3) - | *[out]* **dest** destination matrix (mat3) + | *[out]* **dest** destination matrix (mat2) -.. c:function:: void glm_mat3x2_mulv(mat3x2 m, vec2 v, vec3 dest) + .. csv-table:: mat3x2 + :header: "", "column 1", "column 2", "column 3" - multiply mat3x2 with vec2 (column vector) and store in dest vector + "row 1", "a00", "a10", "a20" + "row 2", "a01", "a11", "a21" + + .. csv-table:: mat2x3 + :header: "", "column 1", "column 2" + + "row 1", "b00", "b10" + "row 2", "b01", "b11" + "row 3", "b02", "b12" + + .. csv-table:: mat2x2 + :header: "", "column 1", "column 2" + + "row 1", "a00 * b00 + a10 * b01 + a20 * b02", "a00 * b10 + a10 * b11 + a20 * b12" + "row 2", "a01 * b00 + a11 * b01 + a21 * b02", "a01 * b10 + a11 * b11 + a21 * b12" + +.. c:function:: void glm_mat3x2_mulv(mat3x2 m, vec3 v, vec2 dest) + + multiply mat3x2 with vec3 (column vector) and store in dest vector Parameters: | *[in]* **m** mat3x2 (left) | *[in]* **v** vec3 (right, column vector) | *[out]* **dest** destination (result, column vector) + .. csv-table:: mat3x2 + :header: "", "column 1", "column 2", "column 3" + + "row 1", "m00", "m10", "m20" + "row 2", "m01", "m11", "m21" + + .. csv-table:: column vec3 (1x3) + :header: "", "column 1" + + "row 1", "v0" + "row 2", "v1" + "row 3", "v2" + + .. csv-table:: column vec2 (1x2) + :header: "", "column 1" + + "row 1", "m00 * v0 + m10 * v1 + m20 * v2" + "row 2", "m01 * v0 + m11 * v1 + m21 * v2" + .. c:function:: void glm_mat3x2_transpose(mat3x2 m, mat2x3 dest) transpose matrix and store in dest