Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mat2x3: fix multiplication functions #403

Merged
merged 2 commits into from
Mar 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 55 additions & 5 deletions docs/source/mat2x3.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
~~~~~~~~~~~~~~~~~~~~~~~

Expand Down Expand Up @@ -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)

.. csv-table:: mat2x3
:header: "", "column 1", "column 2"

"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"

.. c:function:: void glm_mat2x3_mulv(mat2x3 m, vec3 v, vec2 dest)
"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"

multiply mat2x3 with vec3 (column vector) and store in dest vector
.. 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
Expand Down
4 changes: 2 additions & 2 deletions include/cglm/call/mat2x3.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
35 changes: 22 additions & 13 deletions include/cglm/mat2x3.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
*/
Expand Down Expand Up @@ -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)
Expand All @@ -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;
}

/*!
Expand All @@ -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;

v0 = v[0]; v1 = v[1];

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;
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;
}

/*!
Expand Down
14 changes: 7 additions & 7 deletions include/cglm/struct/mat2x3.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
*/
Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand Down
4 changes: 2 additions & 2 deletions src/mat2x3.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
24 changes: 12 additions & 12 deletions test/src/test_mat2x3.h
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}

Expand Down
Loading