From 6e9e91be051b507e95912664825cb1a1b203d1ff Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Sat, 22 Jul 2023 12:00:23 +0300 Subject: [PATCH] add _mul for non-square matrices --- include/cglm/call/mat2x3.h | 4 ++++ include/cglm/call/mat2x4.h | 4 ++++ include/cglm/call/mat3x2.h | 4 ++++ include/cglm/call/mat3x4.h | 4 ++++ include/cglm/call/mat4x2.h | 4 ++++ include/cglm/call/mat4x3.h | 4 ++++ include/cglm/mat2x3.h | 30 +++++++++++++++++++++++++ include/cglm/mat2x4.h | 32 +++++++++++++++++++++++++++ include/cglm/mat3x2.h | 36 ++++++++++++++++++++++++++++++ include/cglm/mat3x4.h | 38 ++++++++++++++++++++++++++++++++ include/cglm/mat4x2.h | 45 ++++++++++++++++++++++++++++++++++++++ include/cglm/mat4x3.h | 45 ++++++++++++++++++++++++++++++++++++++ src/mat2x3.c | 6 +++++ src/mat2x4.c | 6 +++++ src/mat3x2.c | 6 +++++ src/mat3x4.c | 6 +++++ src/mat4x2.c | 6 +++++ src/mat4x3.c | 6 +++++ 18 files changed, 286 insertions(+) diff --git a/include/cglm/call/mat2x3.h b/include/cglm/call/mat2x3.h index c7f0946..4e106e2 100644 --- a/include/cglm/call/mat2x3.h +++ b/include/cglm/call/mat2x3.h @@ -25,6 +25,10 @@ CGLM_EXPORT void glmc_mat2x3_make(float * __restrict src, mat2x3 dest); +CGLM_EXPORT +void +glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/call/mat2x4.h b/include/cglm/call/mat2x4.h index c2b6495..ead2b9c 100644 --- a/include/cglm/call/mat2x4.h +++ b/include/cglm/call/mat2x4.h @@ -25,6 +25,10 @@ CGLM_EXPORT void glmc_mat2x4_make(float * __restrict src, mat2x4 dest); +CGLM_EXPORT +void +glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/call/mat3x2.h b/include/cglm/call/mat3x2.h index 491151b..78dcab4 100644 --- a/include/cglm/call/mat3x2.h +++ b/include/cglm/call/mat3x2.h @@ -25,6 +25,10 @@ CGLM_EXPORT void glmc_mat3x2_make(float * __restrict src, mat3x2 dest); +CGLM_EXPORT +void +glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/call/mat3x4.h b/include/cglm/call/mat3x4.h index 714d744..bb4c20b 100644 --- a/include/cglm/call/mat3x4.h +++ b/include/cglm/call/mat3x4.h @@ -25,6 +25,10 @@ CGLM_EXPORT void glmc_mat3x4_make(float * __restrict src, mat3x4 dest); +CGLM_EXPORT +void +glmc_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat3 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/call/mat4x2.h b/include/cglm/call/mat4x2.h index 3710745..05875b5 100644 --- a/include/cglm/call/mat4x2.h +++ b/include/cglm/call/mat4x2.h @@ -25,6 +25,10 @@ CGLM_EXPORT void glmc_mat4x2_make(float * __restrict src, mat4x2 dest); +CGLM_EXPORT +void +glmc_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat4 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/call/mat4x3.h b/include/cglm/call/mat4x3.h index 7790aa8..a0b1af6 100644 --- a/include/cglm/call/mat4x3.h +++ b/include/cglm/call/mat4x3.h @@ -25,6 +25,10 @@ CGLM_EXPORT void glmc_mat4x3_make(float * __restrict src, mat4x3 dest); +CGLM_EXPORT +void +glmc_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat4 dest); + #ifdef __cplusplus } #endif diff --git a/include/cglm/mat2x3.h b/include/cglm/mat2x3.h index 8ae65ea..fa507f9 100644 --- a/include/cglm/mat2x3.h +++ b/include/cglm/mat2x3.h @@ -72,4 +72,34 @@ glm_mat2x3_make(float * __restrict src, mat2x3 dest) { dest[1][2] = src[5]; } +/*! + * @brief multiply m1 and m2 to dest + * + * m1, m2 and dest matrices can be same matrix, it is possible to write this: + * + * @code + * glm_mat2x3_mul(m, m, m); + * @endcode + * + * @param[in] m1 left matrix + * @param[in] m2 right matrix + * @param[out] dest destination matrix + */ +CGLM_INLINE +void +glm_mat2x3_mul(mat2x3 m1, mat3x2 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], + + 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 + a10 * b01 + a20 * b20; + dest[0][1] = a00 * b10 + a10 * b11 + a20 * b21; + dest[1][0] = a01 * b00 + a11 * b01 + a21 * b20; + dest[1][1] = a01 * b10 + a11 * b11 + a21 * b21; +} + #endif diff --git a/include/cglm/mat2x4.h b/include/cglm/mat2x4.h index 4b6faa1..b8a1e62 100644 --- a/include/cglm/mat2x4.h +++ b/include/cglm/mat2x4.h @@ -70,4 +70,36 @@ glm_mat2x4_make(float * __restrict src, mat2x4 dest) { dest[1][3] = src[7]; } +/*! + * @brief multiply m1 and m2 to dest + * + * m1, m2 and dest matrices can be same matrix, it is possible to write this: + * + * @code + * glm_mat2x4_mul(m, m, m); + * @endcode + * + * @param[in] m1 left matrix + * @param[in] m2 right matrix + * @param[out] dest destination matrix + */ +CGLM_INLINE +void +glm_mat2x4_mul(mat2x4 m1, mat4x2 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], + a30 = m1[3][0], a31 = m1[3][1], + + b00 = m2[0][0], b01 = m2[0][1], + b10 = m2[1][0], b11 = m2[1][1], + b20 = m2[2][0], b21 = m2[2][1], + b30 = m2[3][0], b31 = m2[3][1]; + + dest[0][0] = a00 * b00 + a10 * b01 + a20 * b20 + a30 * b30; + dest[0][1] = a00 * b10 + a10 * b11 + a20 * b21 + a30 * b31; + dest[1][0] = a01 * b00 + a11 * b01 + a21 * b20 + a31 * b30; + dest[1][1] = a01 * b10 + a11 * b11 + a21 * b21 + a31 * b31; +} + #endif diff --git a/include/cglm/mat3x2.h b/include/cglm/mat3x2.h index 0b10286..1ef742d 100644 --- a/include/cglm/mat3x2.h +++ b/include/cglm/mat3x2.h @@ -74,4 +74,40 @@ glm_mat3x2_make(float * __restrict src, mat3x2 dest) { dest[2][1] = src[5]; } +/*! + * @brief multiply m1 and m2 to dest + * + * m1, m2 and dest matrices can be same matrix, it is possible to write this: + * + * @code + * glm_mat3x2_mul(m, m, m); + * @endcode + * + * @param[in] m1 left matrix + * @param[in] m2 right matrix + * @param[out] dest destination matrix + */ +CGLM_INLINE +void +glm_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 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], + + 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 + a10 * b10; + dest[0][1] = a00 * b01 + a10 * b11; + dest[0][2] = a00 * b02 + a10 * b12; + + dest[1][0] = a01 * b00 + a11 * b10; + dest[1][1] = a01 * b01 + a11 * b11; + dest[1][2] = a01 * b02 + a11 * b12; + + dest[2][0] = a20 * b00 + a21 * b10; + dest[2][1] = a20 * b01 + a21 * b11; + dest[2][2] = a20 * b02 + a21 * b12; +} + #endif diff --git a/include/cglm/mat3x4.h b/include/cglm/mat3x4.h index a22ca4c..ff963e7 100644 --- a/include/cglm/mat3x4.h +++ b/include/cglm/mat3x4.h @@ -77,4 +77,42 @@ glm_mat3x4_make(float * __restrict src, mat3x4 dest) { dest[2][3] = src[11]; } +/*! + * @brief multiply m1 and m2 to dest + * + * m1, m2 and dest matrices can be same matrix, it is possible to write this: + * + * @code + * glm_mat3x4_mul(m, m, m); + * @endcode + * + * @param[in] m1 left matrix + * @param[in] m2 right matrix + * @param[out] dest destination matrix + */ +CGLM_INLINE +void +glm_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat3 dest) { + 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], + a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2], a23 = m1[2][3], + + b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2], + b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2], + b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2], + b30 = m2[3][0], b31 = m2[3][1], b32 = m2[3][2]; + + dest[0][0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30; + dest[0][1] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31; + dest[0][2] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32; + + dest[1][0] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30; + dest[1][1] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31; + dest[1][2] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32; + + dest[2][0] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30; + dest[2][1] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31; + dest[2][2] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32; +} + #endif diff --git a/include/cglm/mat4x2.h b/include/cglm/mat4x2.h index b5074d3..5a5aca1 100644 --- a/include/cglm/mat4x2.h +++ b/include/cglm/mat4x2.h @@ -80,4 +80,49 @@ glm_mat4x2_make(float * __restrict src, mat4x2 dest) { dest[3][1] = src[7]; } +/*! + * @brief multiply m1 and m2 to dest + * + * m1, m2 and dest matrices can be same matrix, it is possible to write this: + * + * @code + * glm_mat4x2_mul(m, m, m); + * @endcode + * + * @param[in] m1 left matrix + * @param[in] m2 right matrix + * @param[out] dest destination matrix + */ +CGLM_INLINE +void +glm_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat4 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], + a30 = m1[3][0], a31 = m1[3][1], + + b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2], b03 = m2[0][3], + b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2], b13 = m2[1][3]; + + dest[0][0] = a00 * b00 + a10 * b10; + dest[0][1] = a00 * b01 + a10 * b11; + dest[0][2] = a00 * b02 + a10 * b12; + dest[0][3] = a00 * b03 + a10 * b13; + + dest[1][0] = a01 * b00 + a11 * b10; + dest[1][1] = a01 * b01 + a11 * b11; + dest[1][2] = a01 * b02 + a11 * b12; + dest[1][3] = a01 * b03 + a11 * b13; + + dest[2][0] = a20 * b00 + a21 * b10; + dest[2][1] = a20 * b01 + a21 * b11; + dest[2][2] = a20 * b02 + a21 * b12; + dest[2][3] = a20 * b03 + a21 * b13; + + dest[3][0] = a30 * b00 + a31 * b10; + dest[3][1] = a30 * b01 + a31 * b11; + dest[3][2] = a30 * b02 + a31 * b12; + dest[3][3] = a30 * b03 + a31 * b13; +} + #endif diff --git a/include/cglm/mat4x3.h b/include/cglm/mat4x3.h index b185d75..7dc0e19 100644 --- a/include/cglm/mat4x3.h +++ b/include/cglm/mat4x3.h @@ -85,4 +85,49 @@ glm_mat4x3_make(float * __restrict src, mat4x3 dest) { dest[3][2] = src[11]; } +/*! + * @brief multiply m1 and m2 to dest + * + * m1, m2 and dest matrices can be same matrix, it is possible to write this: + * + * @code + * glm_mat4x3_mul(m, m, m); + * @endcode + * + * @param[in] m1 left matrix + * @param[in] m2 right matrix + * @param[out] dest destination matrix + */ +CGLM_INLINE +void +glm_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat4 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], + a20 = m1[2][0], a21 = m1[2][1], a22 = m1[2][2], + a30 = m1[3][0], a31 = m1[3][1], a32 = m1[3][2], + + b00 = m2[0][0], b01 = m2[0][1], b02 = m2[0][2], b03 = m2[0][3], + b10 = m2[1][0], b11 = m2[1][1], b12 = m2[1][2], b13 = m2[1][3], + b20 = m2[2][0], b21 = m2[2][1], b22 = m2[2][2], b23 = m2[2][3]; + + dest[0][0] = a00 * b00 + a01 * b10 + a02 * b20; + dest[0][1] = a00 * b01 + a01 * b11 + a02 * b21; + dest[0][2] = a00 * b02 + a01 * b12 + a02 * b22; + dest[0][3] = a00 * b03 + a01 * b13 + a02 * b23; + + dest[1][0] = a10 * b00 + a11 * b10 + a12 * b20; + dest[1][1] = a10 * b01 + a11 * b11 + a12 * b21; + dest[1][2] = a10 * b02 + a11 * b12 + a12 * b22; + dest[1][3] = a10 * b03 + a11 * b13 + a12 * b23; + + dest[2][0] = a20 * b00 + a21 * b10 + a22 * b20; + dest[2][1] = a20 * b01 + a21 * b11 + a22 * b21; + dest[2][2] = a20 * b02 + a21 * b12 + a22 * b22; + dest[2][3] = a20 * b03 + a21 * b13 + a22 * b23; + + dest[3][0] = a30 * b00 + a31 * b10 + a32 * b20; + dest[3][1] = a30 * b01 + a31 * b11 + a32 * b21; + dest[3][2] = a30 * b02 + a31 * b12 + a32 * b22; + dest[3][3] = a30 * b03 + a31 * b13 + a32 * b23; +} #endif diff --git a/src/mat2x3.c b/src/mat2x3.c index ab32870..8dff83f 100644 --- a/src/mat2x3.c +++ b/src/mat2x3.c @@ -25,3 +25,9 @@ void glmc_mat2x3_make(float * __restrict src, mat2x3 dest) { glm_mat2x3_make(src, dest); } + +CGLM_EXPORT +void +glmc_mat2x3_mul(mat2x3 m1, mat3x2 m2, mat2 dest) { + glm_mat2x3_mul(m1, m2, dest); +} diff --git a/src/mat2x4.c b/src/mat2x4.c index ad3ec0d..1b93520 100644 --- a/src/mat2x4.c +++ b/src/mat2x4.c @@ -25,3 +25,9 @@ void glmc_mat2x4_make(float * __restrict src, mat2x4 dest) { glm_mat2x4_make(src, dest); } + +CGLM_EXPORT +void +glmc_mat2x4_mul(mat2x4 m1, mat4x2 m2, mat2 dest) { + glm_mat2x4_mul(m1, m2, dest); +} diff --git a/src/mat3x2.c b/src/mat3x2.c index ac59ebf..377b411 100644 --- a/src/mat3x2.c +++ b/src/mat3x2.c @@ -25,3 +25,9 @@ void glmc_mat3x2_make(float * __restrict src, mat3x2 dest) { glm_mat3x2_make(src, dest); } + +CGLM_EXPORT +void +glmc_mat3x2_mul(mat3x2 m1, mat2x3 m2, mat3 dest) { + glm_mat3x2_mul(m1, m2, dest); +} diff --git a/src/mat3x4.c b/src/mat3x4.c index 64be161..f5f5f23 100644 --- a/src/mat3x4.c +++ b/src/mat3x4.c @@ -25,3 +25,9 @@ void glmc_mat3x4_make(float * __restrict src, mat3x4 dest) { glm_mat3x4_make(src, dest); } + +CGLM_EXPORT +void +glmc_mat3x4_mul(mat3x4 m1, mat4x3 m2, mat3 dest) { + glm_mat3x4_mul(m1, m2, dest); +} diff --git a/src/mat4x2.c b/src/mat4x2.c index 622d1e2..0c0bbb7 100644 --- a/src/mat4x2.c +++ b/src/mat4x2.c @@ -25,3 +25,9 @@ void glmc_mat4x2_make(float * __restrict src, mat4x2 dest) { glm_mat4x2_make(src, dest); } + +CGLM_EXPORT +void +glmc_mat4x2_mul(mat4x2 m1, mat2x4 m2, mat4 dest) { + glm_mat4x2_mul(m1, m2, dest); +} diff --git a/src/mat4x3.c b/src/mat4x3.c index 60a14fe..4d94b07 100644 --- a/src/mat4x3.c +++ b/src/mat4x3.c @@ -25,3 +25,9 @@ void glmc_mat4x3_make(float * __restrict src, mat4x3 dest) { glm_mat4x3_make(src, dest); } + +CGLM_EXPORT +void +glmc_mat4x3_mul(mat4x3 m1, mat3x4 m2, mat4 dest) { + glm_mat4x3_mul(m1, m2, dest); +}