Merge pull request #405 from EasyIP2023/bugfix/mat2x4-mutli

mat2x4: fix multiplication functions
This commit is contained in:
Recep Aslantas
2024-03-31 13:40:45 +03:00
committed by GitHub
7 changed files with 123 additions and 50 deletions

View File

@@ -23,6 +23,17 @@ Functions:
#. :c:func:`glm_mat2x4_transpose` #. :c:func:`glm_mat2x4_transpose`
#. :c:func:`glm_mat2x4_scale` #. :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 Functions documentation
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
@@ -51,28 +62,72 @@ Functions documentation
| *[in]* **src** pointer to an array of floats | *[in]* **src** pointer to an array of floats
| *[out]* **dest** destination matrix2x4 | *[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 multiply m1 and m2 to dest
.. code-block:: c .. code-block:: c
glm_mat2x4_mul(mat2x4, mat4x2, mat2); glm_mat2x4_mul(mat2x4, mat4x2, mat4);
Parameters: Parameters:
| *[in]* **m1** left matrix (mat2x4) | *[in]* **m1** left matrix (mat2x4)
| *[in]* **m2** right matrix (mat4x2) | *[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: Parameters:
| *[in]* **m** mat2x4 (left) | *[in]* **m** mat2x4 (left)
| *[in]* **v** vec4 (right, column vector) | *[in]* **v** vec2 (right, column vector)
| *[out]* **dest** destination (result, 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) .. c:function:: void glm_mat2x4_transpose(mat2x4 m, mat4x2 dest)
transpose matrix and store in dest transpose matrix and store in dest

View File

@@ -27,11 +27,11 @@ glmc_mat2x4_make(const float * __restrict src, mat2x4 dest);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest); glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest);
CGLM_EXPORT CGLM_EXPORT
void void
glmc_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest); glmc_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest);
CGLM_EXPORT CGLM_EXPORT
void void

View File

@@ -14,8 +14,8 @@
CGLM_INLINE void glm_mat2x4_copy(mat2x4 mat, mat2x4 dest); CGLM_INLINE void glm_mat2x4_copy(mat2x4 mat, mat2x4 dest);
CGLM_INLINE void glm_mat2x4_zero(mat2x4 mat); 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_make(const float * __restrict src, mat2x4 dest);
CGLM_INLINE void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest); CGLM_INLINE void glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat4 dest);
CGLM_INLINE void glm_mat2x4_mulv(mat2x4 m, vec4 v, vec2 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_transpose(mat2x4 m, mat4x2 dest);
CGLM_INLINE void glm_mat2x4_scale(mat2x4 m, float s); 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 * @brief multiply m1 and m2 to dest
* *
* @code * @code
* glm_mat2x4_mul(mat2x4, mat4x2, mat2); * glm_mat2x4_mul(mat2x4, mat4x2, mat4);
* @endcode * @endcode
* *
* @param[in] m1 left matrix (mat2x4) * @param[in] m1 left matrix (mat2x4)
* @param[in] m2 right matrix (mat4x2) * @param[in] m2 right matrix (mat4x2)
* @param[out] dest destination matrix (mat2) * @param[out] dest destination matrix (mat4)
*/ */
CGLM_INLINE CGLM_INLINE
void 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], 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], 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], b20 = m2[2][0], b21 = m2[2][1],
b30 = m2[3][0], b31 = m2[3][1]; b30 = m2[3][0], b31 = m2[3][1];
dest[0][0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30; dest[0][0] = a00 * b00 + a10 * b01;
dest[0][1] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31; 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][0] = a00 * b10 + a10 * b11;
dest[1][1] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31; 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] m matrix (left)
* @param[in] v vector (right, column vector) * @param[in] v vector (right, column vector)
@@ -114,11 +128,15 @@ glm_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest) {
*/ */
CGLM_INLINE CGLM_INLINE
void void
glm_mat2x4_mulv(mat2x4 m, vec4 v, vec2 dest) { glm_mat2x4_mulv(mat2x4 m, vec2 v, vec4 dest) {
float v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3]; float v0, v1;
dest[0] = m[0][0] * v0 + m[0][1] * v1 + m[0][2] * v2 + m[0][3] * v3; v0 = v[0], v1 = v[1];
dest[1] = m[1][0] * v0 + m[1][1] * v1 + m[1][2] * v2 + m[1][3] * v3;
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;
} }
/*! /*!

View File

@@ -14,7 +14,7 @@
CGLM_INLINE mat2x4s glms_mat2x4_zero(void); CGLM_INLINE mat2x4s glms_mat2x4_zero(void);
CGLM_INLINE mat2x4s glms_mat2x4_make(const float * __restrict src); CGLM_INLINE mat2x4s glms_mat2x4_make(const float * __restrict src);
CGLM_INLINE mat2s glms_mat2x4_mul(mat2x4s m1, mat4x2s m2); 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 mat4x2s glms_mat2x4_transpose(mat2x4s m);
CGLM_INLINE mat2x4s glms_mat2x4_scale(mat2x4s m, float s); 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) * @returns destination matrix (mat2s)
*/ */
CGLM_INLINE CGLM_INLINE
mat2s mat4s
glms_mat2x4_(mul)(mat2x4s m1, mat4x2s m2) { glms_mat2x4_(mul)(mat2x4s m1, mat4x2s m2) {
mat2s r; mat4s r;
glm_mat2x4_mul(m1.raw, m2.raw, r.raw); glm_mat2x4_mul(m1.raw, m2.raw, r.raw);
return r; 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] m matrix (left)
* @param[in] v vector (right, column vector) * @param[in] v vector (right, column vector)
* @param[out] dest result vector * @param[out] dest result vector
*/ */
CGLM_INLINE CGLM_INLINE
vec2s vec4s
glms_mat2x4_(mulv)(mat2x4s m, vec4s v) { glms_mat2x4_(mulv)(mat2x4s m, vec2s v) {
vec2s r; vec4s r;
glm_mat2x4_mulv(m.raw, v.raw, r.raw); glm_mat2x4_mulv(m.raw, v.raw, r.raw);
return r; return r;
} }

View File

@@ -28,13 +28,13 @@ glmc_mat2x4_make(const float * __restrict src, mat2x4 dest) {
CGLM_EXPORT CGLM_EXPORT
void 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); glm_mat2x4_mul(m1, m2, dest);
} }
CGLM_EXPORT CGLM_EXPORT
void 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); glm_mat2x4_mulv(m, v, dest);
} }

View File

@@ -86,42 +86,42 @@ TEST_IMPL(GLM_PREFIX, mat2x4_mul) {
mat2x4 m1 = GLM_MAT2X4_ZERO_INIT; mat2x4 m1 = GLM_MAT2X4_ZERO_INIT;
mat4x2 m2 = GLM_MAT4X2_ZERO_INIT; mat4x2 m2 = GLM_MAT4X2_ZERO_INIT;
mat2 m3 = GLM_MAT2_ZERO_INIT; mat4 m3 = GLM_MAT4_ZERO_INIT;
mat2 m4 = GLM_MAT2_ZERO_INIT; mat4 m4 = GLM_MAT4_ZERO_INIT;
int i, j, k; int c, r, k;
/* test random matrices */ /* test random matrices */
/* random matrices */ /* random matrices */
test_rand_mat2x4(m1); test_rand_mat2x4(m1);
test_rand_mat4x2(m2); test_rand_mat4x2(m2);
for (i = 0; i < 2; i++) { for (r = 0; r < 4; r++) {
for (j = 0; j < 2; j++) { for (c = 0; c < 4; c++) {
for (k = 0; k < 4; k++) { for (k = 0; k < 2; k++) {
m4[i][j] += m1[i][k] * m2[k][j]; m4[c][r] += m1[k][r] * m2[c][k];
} }
} }
} }
GLM(mat2x4_mul)(m1, m2, m3); GLM(mat2x4_mul)(m1, m2, m3);
ASSERTIFY(test_assert_mat2_eq(m3, m4)) ASSERTIFY(test_assert_mat4_eq(m3, m4))
TEST_SUCCESS TEST_SUCCESS
} }
TEST_IMPL(GLM_PREFIX, mat2x4_mulv) { TEST_IMPL(GLM_PREFIX, mat2x4_mulv) {
mat2x4 mat = A_MATRIX2X4; mat2x4 mat = A_MATRIX2X4;
vec4 v = {11.0f, 21.0f, 31.0f, 41.0f}; vec2 v = {11.0f, 21.0f};
int i; int i;
vec2 dest; vec4 dest;
float res = 0.0; float res = 0.0;
GLM(mat2x4_mulv)(mat, v, dest); GLM(mat2x4_mulv)(mat, v, dest);
for (i = 0; i < 2; i++) { for (i = 0; i < 4; i++) {
res = mat[i][0] * v[0] + mat[i][1] * v[1] + mat[i][2] * v[2] + mat[i][3] * v[3]; res = mat[0][i] * v[0] + mat[1][i] * v[1];
ASSERT(test_eq(dest[i], res)) ASSERT(test_eq(dest[i], res))
} }

View File

@@ -1494,13 +1494,13 @@ TEST_LIST {
TEST_ENTRY(glm_mat2x4_transpose) TEST_ENTRY(glm_mat2x4_transpose)
TEST_ENTRY(glm_mat2x4_scale) TEST_ENTRY(glm_mat2x4_scale)
TEST_ENTRY(glm_mat2x4_copy) TEST_ENTRY(glmc_mat2x4_copy)
TEST_ENTRY(glm_mat2x4_zero) TEST_ENTRY(glmc_mat2x4_zero)
TEST_ENTRY(glm_mat2x4_make) TEST_ENTRY(glmc_mat2x4_make)
TEST_ENTRY(glm_mat2x4_mul) TEST_ENTRY(glmc_mat2x4_mul)
TEST_ENTRY(glm_mat2x4_mulv) TEST_ENTRY(glmc_mat2x4_mulv)
TEST_ENTRY(glm_mat2x4_transpose) TEST_ENTRY(glmc_mat2x4_transpose)
TEST_ENTRY(glm_mat2x4_scale) TEST_ENTRY(glmc_mat2x4_scale)
/* camera (incl [LR]H cross [NZ]O) */ /* camera (incl [LR]H cross [NZ]O) */
TEST_ENTRY(glm_perspective_lh_zo) TEST_ENTRY(glm_perspective_lh_zo)