From b133c2e3e34076378a4e642e733d32b248f7679f Mon Sep 17 00:00:00 2001 From: Recep Aslantas Date: Fri, 31 Jul 2020 15:11:00 +0300 Subject: [PATCH] 2d: add rotate2d and its friends --- include/cglm/affine2d.h | 81 ++++++++++++++++++++++++++++++++++++ include/cglm/call/affine2d.h | 12 ++++++ src/affine2d.c | 18 ++++++++ 3 files changed, 111 insertions(+) diff --git a/include/cglm/affine2d.h b/include/cglm/affine2d.h index b5fca39..c332dd8 100644 --- a/include/cglm/affine2d.h +++ b/include/cglm/affine2d.h @@ -172,4 +172,85 @@ glm_scale2d_uni(mat3 m, float s) { m[1][2] = m[1][2] * s; } +/*! + * @brief creates NEW rotation matrix by angle and axis + * + * axis will be normalized so you don't need to normalize it + * + * @param[out] m affine transfrom + * @param[in] angle angle (radians) + */ +CGLM_INLINE +void +glm_rotate2d_make(mat3 m, float angle) { + float c, s; + + s = sinf(angle); + c = cosf(angle); + + m[0][0] = m[0][0] * c + m[1][0] * s; + m[0][1] = m[0][1] * c + m[1][1] * s; + m[0][2] = m[0][2] * c + m[1][2] * s; + + m[1][0] = m[0][0] * -s + m[1][0] * c; + m[1][1] = m[0][1] * -s + m[1][1] * c; + m[1][2] = m[0][2] * -s + m[1][2] * c; + + m[2][0] = 0.0f; + m[2][1] = 0.0f; + m[2][2] = 1.0f; +} + +/*! + * @brief rotate existing 2d transform matrix around given axis by angle + * + * @param[in, out] m affine transfrom + * @param[in] angle angle (radians) + */ +CGLM_INLINE +void +glm_rotate2d(mat3 m, float angle) { + float c, s; + + s = sinf(angle); + c = cosf(angle); + + m[0][0] = m[0][0] * c + m[1][0] * s; + m[0][1] = m[0][1] * c + m[1][1] * s; + m[0][2] = m[0][2] * c + m[1][2] * s; + + m[1][0] = m[0][0] * -s + m[1][0] * c; + m[1][1] = m[0][1] * -s + m[1][1] * c; + m[1][2] = m[0][2] * -s + m[1][2] * c; +} + +/*! + * @brief rotate existing 2d transform matrix around given axis by angle + * and store result in dest + * + * @param[in] m affine transfrom + * @param[in] angle angle (radians) + * @param[out] dest destination + */ +CGLM_INLINE +void +glm_rotate2d_to(mat3 m, float angle, mat3 dest) { + float c, s; + + s = sinf(angle); + c = cosf(angle); + + dest[0][0] = m[0][0] * c + m[1][0] * s; + dest[0][1] = m[0][1] * c + m[1][1] * s; + dest[0][2] = m[0][2] * c + m[1][2] * s; + + dest[1][0] = m[0][0] * -s + m[1][0] * c; + dest[1][1] = m[0][1] * -s + m[1][1] * c; + dest[1][2] = m[0][2] * -s + m[1][2] * c; + + dest[2][0] = m[0][0]; + dest[2][1] = m[0][1]; + dest[2][2] = m[0][2]; +} + #endif /* cglm_affine2d_h */ diff --git a/include/cglm/call/affine2d.h b/include/cglm/call/affine2d.h index dcc8b29..e1b9462 100644 --- a/include/cglm/call/affine2d.h +++ b/include/cglm/call/affine2d.h @@ -49,6 +49,18 @@ CGLM_EXPORT void glmc_scale2d_uni(mat3 m, float s); +CGLM_EXPORT +void +glmc_rotate2d_make(mat3 m, float angle); + +CGLM_EXPORT +void +glmc_rotate2d(mat3 m, float angle); + +CGLM_EXPORT +void +glmc_rotate2d_to(mat3 m, float angle, mat3 dest); + #ifdef __cplusplus } #endif diff --git a/src/affine2d.c b/src/affine2d.c index 7bd65cf..6e5913e 100644 --- a/src/affine2d.c +++ b/src/affine2d.c @@ -61,3 +61,21 @@ void glmc_scale2d_uni(mat3 m, float s) { glm_scale2d_uni(m, s); } + +CGLM_EXPORT +void +glmc_rotate2d_make(mat3 m, float angle) { + glm_rotate2d_make(m, angle); +} + +CGLM_EXPORT +void +glmc_rotate2d(mat3 m, float angle) { + glm_rotate2d(m, angle); +} + +CGLM_EXPORT +void +glmc_rotate2d_to(mat3 m, float angle, mat3 dest) { + glm_rotate2d_to(m, angle, dest); +}