From 050bc95264e193f5031906e510a44df3d3783c68 Mon Sep 17 00:00:00 2001 From: Vincent Davis Jr Date: Fri, 29 Mar 2024 23:14:11 -0400 Subject: [PATCH 1/2] mat2x3: fix multiplication functions Signed-off-by: Vincent Davis Jr --- include/cglm/call/mat2x3.h | 4 ++-- include/cglm/mat2x3.h | 35 ++++++++++++++++++++++------------- include/cglm/struct/mat2x3.h | 14 +++++++------- src/mat2x3.c | 4 ++-- test/src/test_mat2x3.h | 24 ++++++++++++------------ 5 files changed, 45 insertions(+), 36 deletions(-) diff --git a/include/cglm/call/mat2x3.h b/include/cglm/call/mat2x3.h index 90ff606..59c9ee3 100644 --- a/include/cglm/call/mat2x3.h +++ b/include/cglm/call/mat2x3.h @@ -27,11 +27,11 @@ glmc_mat2x3_make(const float * __restrict src, mat2x3 dest); CGLM_EXPORT void -glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest); +glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest); CGLM_EXPORT void -glmc_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest); +glmc_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest); CGLM_EXPORT void diff --git a/include/cglm/mat2x3.h b/include/cglm/mat2x3.h index 06fec14..3d5cedc 100644 --- a/include/cglm/mat2x3.h +++ b/include/cglm/mat2x3.h @@ -14,8 +14,8 @@ CGLM_INLINE void glm_mat2x3_copy(mat2x3 mat, mat2x3 dest); CGLM_INLINE void glm_mat2x3_zero(mat2x3 mat); CGLM_INLINE void glm_mat2x3_make(const float * __restrict src, mat2x3 dest); - CGLM_INLINE void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest); - CGLM_INLINE void glm_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest); + CGLM_INLINE void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest); + CGLM_INLINE void glm_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest); CGLM_INLINE void glm_mat2x3_transpose(mat2x3 m, mat3x2 dest); CGLM_INLINE void glm_mat2x3_scale(mat2x3 m, float s); */ @@ -82,7 +82,7 @@ glm_mat2x3_make(const float * __restrict src, mat2x3 dest) { * @brief multiply m1 and m2 to dest * * @code - * glm_mat2x3_mul(mat2x3, mat3x2, mat2); + * glm_mat2x3_mul(mat2x3, mat3x2, mat3); * @endcode * * @param[in] m1 left matrix (mat2x3) @@ -91,19 +91,25 @@ glm_mat2x3_make(const float * __restrict src, mat2x3 dest) { */ CGLM_INLINE void -glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest) { - float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], +glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest) { + float a00 = m1[0][0], a01 = m1[0][1], a02 = m1[0][2], a10 = m1[1][0], a11 = m1[1][1], a12 = m1[1][2], b00 = m2[0][0], b01 = m2[0][1], b10 = m2[1][0], b11 = m2[1][1], b20 = m2[2][0], b21 = m2[2][1]; - dest[0][0] = a00 * b00 + a01 * b10 + a02 * b20; - dest[0][1] = a00 * b01 + a01 * b11 + a02 * b21; + dest[0][0] = a00 * b00 + a10 * b01; + dest[0][1] = a01 * b00 + a11 * b01; + dest[0][2] = a02 * b00 + a12 * b01; - dest[1][0] = a10 * b00 + a11 * b10 + a12 * b20; - dest[1][1] = a10 * b01 + a11 * b11 + a12 * b21; + dest[1][0] = a00 * b10 + a10 * b11; + dest[1][1] = a01 * b10 + a11 * b11; + dest[1][2] = a02 * b10 + a12 * b11; + + dest[2][0] = a00 * b20 + a10 * b21; + dest[2][1] = a01 * b20 + a11 * b21; + dest[2][2] = a02 * b20 + a12 * b21; } /*! @@ -115,11 +121,14 @@ glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest) { */ CGLM_INLINE void -glm_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest) { - float v0 = v[0], v1 = v[1], v2 = v[2]; +glm_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest) { + float v0, v1; - dest[0] = m[0][0] * v0 + m[0][1] * v1 + m[0][2] * v2; - dest[1] = m[1][0] * v0 + m[1][1] * v1 + m[1][2] * v2; + 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; } /*! diff --git a/include/cglm/struct/mat2x3.h b/include/cglm/struct/mat2x3.h index 77084a7..3798893 100644 --- a/include/cglm/struct/mat2x3.h +++ b/include/cglm/struct/mat2x3.h @@ -14,7 +14,7 @@ CGLM_INLINE mat2x3s glms_mat2x3_zero(void); CGLM_INLINE mat2x3s glms_mat2x3_make(const float * __restrict src); CGLM_INLINE mat2s glms_mat2x3_mul(mat2x3s m1, mat3x2s m2); - CGLM_INLINE vec2s glms_mat2x3_mulv(mat2x3s m, vec3s v); + CGLM_INLINE vec3s glms_mat2x3_mulv(mat2x3s m, vec2s v); CGLM_INLINE mat3x2s glms_mat2x3_transpose(mat2x3s m); CGLM_INLINE mat2x3s glms_mat2x3_scale(mat2x3s m, float s); */ @@ -73,9 +73,9 @@ glms_mat2x3_(make)(const float * __restrict src) { * @returns destination matrix (mat2s) */ CGLM_INLINE -mat2s +mat3s glms_mat2x3_(mul)(mat2x3s m1, mat3x2s m2) { - mat2s r; + mat3s r; glm_mat2x3_mul(m1.raw, m2.raw, r.raw); return r; } @@ -85,12 +85,12 @@ glms_mat2x3_(mul)(mat2x3s m1, mat3x2s m2) { * * @param[in] m matrix (left) * @param[in] v vector (right, column vector) - * @param[out] dest result vector + * @returns destination vector (vec3s) */ CGLM_INLINE -vec2s -glms_mat2x3_(mulv)(mat2x3s m, vec3s v) { - vec2s r; +vec3s +glms_mat2x3_(mulv)(mat2x3s m, vec2s v) { + vec3s r; glm_mat2x3_mulv(m.raw, v.raw, r.raw); return r; } diff --git a/src/mat2x3.c b/src/mat2x3.c index dc5fd30..3397bf2 100644 --- a/src/mat2x3.c +++ b/src/mat2x3.c @@ -28,13 +28,13 @@ glmc_mat2x3_make(const float * __restrict src, mat2x3 dest) { CGLM_EXPORT void -glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest) { +glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest) { glm_mat2x3_mul(m1, m2, dest); } CGLM_EXPORT void -glmc_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest) { +glmc_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest) { glm_mat2x3_mulv(m, v, dest); } diff --git a/test/src/test_mat2x3.h b/test/src/test_mat2x3.h index 7d615e4..8eb8144 100644 --- a/test/src/test_mat2x3.h +++ b/test/src/test_mat2x3.h @@ -83,42 +83,42 @@ TEST_IMPL(GLM_PREFIX, mat2x3_mul) { mat2x3 m1 = GLM_MAT2X3_ZERO_INIT; mat3x2 m2 = GLM_MAT3X2_ZERO_INIT; - mat2 m3 = GLM_MAT2_ZERO_INIT; - mat2 m4 = GLM_MAT2_ZERO_INIT; + mat3 m3 = GLM_MAT3_ZERO_INIT; + mat3 m4 = GLM_MAT3_ZERO_INIT; - int i, j, k; + int c, r, k; /* test random matrices */ /* random matrices */ test_rand_mat2x3(m1); test_rand_mat3x2(m2); - for (i = 0; i < 2; i++) { - for (j = 0; j < 2; j++) { - for (k = 0; k < 3; k++) { - m4[i][j] += m1[i][k] * m2[k][j]; + for (r = 0; r < 3; r++) { + for (c = 0; c < 3; c++) { + for (k = 0; k < 2; k++) { + m4[c][r] += m1[k][r] * m2[c][k]; } } } GLM(mat2x3_mul)(m1, m2, m3); - ASSERTIFY(test_assert_mat2_eq(m3, m4)) + ASSERTIFY(test_assert_mat3_eq(m3, m4)) TEST_SUCCESS } TEST_IMPL(GLM_PREFIX, mat2x3_mulv) { mat2x3 mat = A_MATRIX2X3; - vec3 v = {11.0f, 21.0f, 31.0f}; + vec2 v = {11.0f, 21.0f}; int i; - vec2 dest; + vec3 dest; float res = 0.0; GLM(mat2x3_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]; + for (i = 0; i < 3; i++) { + res = mat[0][i] * v[0] + mat[1][i] * v[1]; ASSERT(test_eq(dest[i], res)) } From c5dcb93c92c0eb9d3825414d4ff058b446a4614a Mon Sep 17 00:00:00 2001 From: Vincent Davis Jr Date: Sat, 30 Mar 2024 14:22:23 -0400 Subject: [PATCH 2/2] docs: mat2x3 account for latest mulitplication changes This also includes tables to explain how mat2x3, column vectors and row vectors are represented. Also includes how resulting matrix or vector is formed. Signed-off-by: Vincent Davis Jr --- docs/source/mat2x3.rst | 60 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/docs/source/mat2x3.rst b/docs/source/mat2x3.rst index 433c637..06780d6 100644 --- a/docs/source/mat2x3.rst +++ b/docs/source/mat2x3.rst @@ -23,6 +23,16 @@ Functions: #. :c:func:`glm_mat2x3_transpose` #. :c:func:`glm_mat2x3_scale` +Represented +~~~~~~~~~~~ + +.. csv-table:: mat2x3 + :header: "", "column 1", "column 2" + + "row 1", "m00", "m10" + "row 2", "m01", "m11" + "row 3", "m02", "m12" + Functions documentation ~~~~~~~~~~~~~~~~~~~~~~~ @@ -51,28 +61,68 @@ Functions documentation | *[in]* **src** pointer to an array of floats | *[out]* **dest** destination matrix2x3 -.. c:function:: void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest) +.. c:function:: void glm_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat3 dest) multiply m1 and m2 to dest .. code-block:: c - glm_mat2x3_mul(mat2x3, mat3x2, mat2); + glm_mat2x3_mul(mat2x3, mat3x2, mat3); Parameters: | *[in]* **m1** left matrix (mat2x3) | *[in]* **m2** right matrix (mat3x2) - | *[out]* **dest** destination matrix (mat2) + | *[out]* **dest** destination matrix (mat3) -.. c:function:: void glm_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest) + .. csv-table:: mat2x3 + :header: "", "column 1", "column 2" - multiply mat2x3 with vec3 (column vector) and store in dest vector + "row 1", "a00", "a10" + "row 2", "a01", "a11" + "row 3", "a02", "a12" + + .. csv-table:: mat3x2 + :header: "", "column 1", "column 2", "column 3" + + "row 1", "b00", "b10", "b20" + "row 2", "b01", "b11", "b21" + + .. csv-table:: mat3x3 + :header: "", "column 1", "column 2", "column 3" + + "row 1", "a00 * b00 + a10 * b01", "a00 * b10 + a10 * b11", "a00 * b20 + a10 * b21" + "row 2", "a01 * b00 + a11 * b01", "a01 * b10 + a11 * b11", "a01 * b20 + a11 * b21" + "row 3", "a02 * b00 + a12 * b01", "a02 * b10 + a12 * b11", "a02 * b20 + a12 * b21" + +.. c:function:: void glm_mat2x3_mulv(mat2x3 m, vec2 v, vec3 dest) + + multiply mat2x3 with vec2 (column vector) and store in dest column vector Parameters: | *[in]* **m** mat2x3 (left) | *[in]* **v** vec3 (right, column vector) | *[out]* **dest** destination (result, column vector) + .. csv-table:: mat2x3 + :header: "", "column 1", "column 2" + + "row 1", "m00", "m10" + "row 2", "m01", "m11" + "row 3", "m02", "m12" + + .. csv-table:: column vec2 (1x2) + :header: "", "column 1" + + "row 1", "v0" + "row 2", "v1" + + .. csv-table:: column vec3 (1x3) + :header: "", "column 1" + + "row 1", "m00 * v0 + m10 * v1" + "row 2", "m01 * v0 + m11 * v1" + "row 3", "m02 * v0 + m12 * v1" + .. c:function:: void glm_mat2x3_transpose(mat2x3 m, mat3x2 dest) transpose matrix and store in dest