From 2283c708c6a0f2938a980bae5bff6489ae7efd9b Mon Sep 17 00:00:00 2001 From: Vincent Davis Jr Date: Sat, 30 Mar 2024 21:10:10 -0400 Subject: [PATCH] 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)) }