diff --git a/include/cglm/affine2d.h b/include/cglm/affine2d.h index 19e76b3..b5fca39 100644 --- a/include/cglm/affine2d.h +++ b/include/cglm/affine2d.h @@ -27,7 +27,7 @@ * and stores result in same matrix * * @param[in, out] m affine transfrom - * @param[in] v translate vector [x, y, z] + * @param[in] v translate vector [x, y] */ CGLM_INLINE void @@ -44,7 +44,7 @@ glm_translate2d(mat3 m, vec2 v) { * source matrix will remain same * * @param[in] m affine transfrom - * @param[in] v translate vector [x, y, z] + * @param[in] v translate vector [x, y] * @param[out] dest translated matrix */ CGLM_INLINE @@ -86,7 +86,7 @@ glm_translate2d_y(mat3 m, float y) { * @brief creates NEW translate 2d transform matrix by v vector * * @param[out] m affine transfrom - * @param[in] v translate vector [x, y, z] + * @param[in] v translate vector [x, y] */ CGLM_INLINE void @@ -96,5 +96,80 @@ glm_translate2d_make(mat3 m, vec2 v) { m[2][1] = v[1]; } +/*! + * @brief scale existing 2d transform matrix by v vector + * and store result in dest + * + * @param[in] m affine transfrom + * @param[in] v scale vector [x, y] + * @param[out] dest scaled matrix + */ +CGLM_INLINE +void +glm_scale2d_to(mat3 m, vec2 v, mat3 dest) { + dest[0][0] = m[0][0] * v[0]; + dest[0][1] = m[0][1] * v[0]; + dest[0][2] = m[0][2] * v[0]; + + dest[1][0] = m[1][0] * v[1]; + dest[1][1] = m[1][1] * v[1]; + dest[1][2] = m[1][2] * v[1]; + + dest[2][0] = m[2][0]; + dest[2][1] = m[2][1]; + dest[2][2] = m[2][2]; +} + +/*! + * @brief creates NEW 2d scale matrix by v vector + * + * @param[out] m affine transfrom + * @param[in] v scale vector [x, y] + */ +CGLM_INLINE +void +glm_scale2d_make(mat3 m, vec2 v) { + glm_mat3_identity(m); + m[0][0] = v[0]; + m[1][1] = v[1]; +} + +/*! + * @brief scales existing 2d transform matrix by v vector + * and stores result in same matrix + * + * @param[in, out] m affine transfrom + * @param[in] v scale vector [x, y] + */ +CGLM_INLINE +void +glm_scale2d(mat3 m, vec2 v) { + m[0][0] = m[0][0] * v[0]; + m[0][1] = m[0][1] * v[0]; + m[0][2] = m[0][2] * v[0]; + + m[1][0] = m[1][0] * v[1]; + m[1][1] = m[1][1] * v[1]; + m[1][2] = m[1][2] * v[1]; +} + +/*! + * @brief applies uniform scale to existing 2d transform matrix v = [s, s] + * and stores result in same matrix + * + * @param[in, out] m affine transfrom + * @param[in] s scale factor + */ +CGLM_INLINE +void +glm_scale2d_uni(mat3 m, float s) { + m[0][0] = m[0][0] * s; + m[0][1] = m[0][1] * s; + m[0][2] = m[0][2] * s; + + m[1][0] = m[1][0] * s; + m[1][1] = m[1][1] * s; + m[1][2] = m[1][2] * s; +} #endif /* cglm_affine2d_h */ diff --git a/include/cglm/call/affine2d.h b/include/cglm/call/affine2d.h index cbc644e..dcc8b29 100644 --- a/include/cglm/call/affine2d.h +++ b/include/cglm/call/affine2d.h @@ -33,6 +33,22 @@ CGLM_EXPORT void glmc_translate2d_y(mat3 m, float to); +CGLM_EXPORT +void +glmc_scale2d_to(mat3 m, vec2 v, mat3 dest); + +CGLM_EXPORT +void +glmc_scale2d_make(mat3 m, vec2 v); + +CGLM_EXPORT +void +glmc_scale2d(mat3 m, vec2 v); + +CGLM_EXPORT +void +glmc_scale2d_uni(mat3 m, float s); + #ifdef __cplusplus } #endif diff --git a/src/affine2d.c b/src/affine2d.c index bb24ea3..7bd65cf 100644 --- a/src/affine2d.c +++ b/src/affine2d.c @@ -37,3 +37,27 @@ void glmc_translate2d_y(mat3 m, float to) { glm_translate2d_y(m, to); } + +CGLM_EXPORT +void +glmc_scale2d_to(mat3 m, vec2 v, mat3 dest) { + glm_scale2d_to(m, v, dest); +} + +CGLM_EXPORT +void +glmc_scale2d_make(mat3 m, vec2 v) { + glm_scale2d_make(m, v); +} + +CGLM_EXPORT +void +glmc_scale2d(mat3 m, vec2 v) { + glm_scale2d(m, v); +} + +CGLM_EXPORT +void +glmc_scale2d_uni(mat3 m, float s) { + glm_scale2d_uni(m, s); +} diff --git a/test/src/test_affine2d.h b/test/src/test_affine2d.h index cae1d90..bdb7cbf 100644 --- a/test/src/test_affine2d.h +++ b/test/src/test_affine2d.h @@ -35,7 +35,7 @@ TEST_IMPL(GLM_PREFIX, translate2d_to) { vec3 v1 = {2.0f, 3.0f, 1.0f}, v2; glm_mat3_identity(m1); - GLM(translate2d_to)(m1, (vec3){13.0f, 11.0f}, m2); + GLM(translate2d_to)(m1, (vec2){13.0f, 11.0f}, m2); glm_mat3_mulv(m2, v1, v2); ASSERT(test_eq(v2[0], 15.0f)) @@ -43,7 +43,7 @@ TEST_IMPL(GLM_PREFIX, translate2d_to) { ASSERT(test_eq(v2[2], 1.0f)) glm_mat3_identity(m1); - GLM(translate2d_to)(m1, (vec3){1.0f, -1.0f}, m2); + GLM(translate2d_to)(m1, (vec2){1.0f, -1.0f}, m2); glm_mat3_mulv(m2, v2, v2); ASSERT(test_eq(v2[0], 16.0f)) @@ -99,3 +99,116 @@ TEST_IMPL(GLM_PREFIX, translate2d_y) { TEST_SUCCESS } + +TEST_IMPL(GLM_PREFIX, translate2d_make) { + mat3 m1; + vec3 v1 = {2.0f, 3.0f, 1.0f}, v2; + + glm_mat3_identity(m1); + GLM(translate2d_make)(m1, (vec2){13.0f, 11.0f}); + glm_mat3_mulv(m1, v1, v2); + + ASSERT(test_eq(v2[0], 15.0f)) + ASSERT(test_eq(v2[1], 14.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + + glm_mat3_identity(m1); + GLM(translate2d_make)(m1, (vec2){-1.0f, -5.0f}); + glm_mat3_mulv(m1, v2, v2); + + ASSERT(test_eq(v2[0], 14.0f)) + ASSERT(test_eq(v2[1], 9.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, scale2d_to) { + mat3 m1, m2; + vec3 v1 = {2.0f, 3.0f, 1.0f}, v2; + + glm_mat3_identity(m1); + GLM(scale2d_to)(m1, (vec2){13.0f, 11.0f}, m2); + glm_mat3_mulv(m2, v1, v2); + + ASSERT(test_eq(v2[0], 26.0f)) + ASSERT(test_eq(v2[1], 33.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + + glm_mat3_identity(m1); + GLM(scale2d_to)(m1, (vec2){-1.0f, -5.0f}, m2); + glm_mat3_mulv(m2, v2, v2); + + ASSERT(test_eq(v2[0], -26.0f)) + ASSERT(test_eq(v2[1], -165.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, scale2d_make) { + mat3 m1; + vec3 v1 = {2.0f, 3.0f, 1.0f}, v2; + + GLM(scale2d_make)(m1, (vec2){13.0f, 11.0f}); + glm_mat3_mulv(m1, v1, v2); + + ASSERT(test_eq(v2[0], 26.0f)) + ASSERT(test_eq(v2[1], 33.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + + GLM(scale2d_make)(m1, (vec3){-1.0f, -5.0f}); + glm_mat3_mulv(m1, v2, v2); + + ASSERT(test_eq(v2[0], -26.0f)) + ASSERT(test_eq(v2[1], -165.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, scale2d) { + mat3 m1; + vec3 v1 = {2.0f, 3.0f, 1.0f}, v2; + + glm_mat3_identity(m1); + GLM(scale2d)(m1, (vec2){13.0f, 11.0f}); + glm_mat3_mulv(m1, v1, v2); + + ASSERT(test_eq(v2[0], 26.0f)) + ASSERT(test_eq(v2[1], 33.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + + glm_mat3_identity(m1); + GLM(scale2d)(m1, (vec2){-1.0f, -5.0f}); + glm_mat3_mulv(m1, v2, v2); + + ASSERT(test_eq(v2[0], -26.0f)) + ASSERT(test_eq(v2[1], -165.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + + TEST_SUCCESS +} + +TEST_IMPL(GLM_PREFIX, scale2d_uni) { + mat3 m1; + vec3 v1 = {2.0f, 3.0f, 1.0f}, v2; + + glm_mat3_identity(m1); + GLM(scale2d_uni)(m1, 13.0f); + glm_mat3_mulv(m1, v1, v2); + + ASSERT(test_eq(v2[0], 26.0f)) + ASSERT(test_eq(v2[1], 39.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + + glm_mat3_identity(m1); + GLM(scale2d_uni)(m1, -5.0f); + glm_mat3_mulv(m1, v2, v2); + + ASSERT(test_eq(v2[0], -130.0f)) + ASSERT(test_eq(v2[1], -195.0f)) + ASSERT(test_eq(v2[2], 1.0f)) + + TEST_SUCCESS +} diff --git a/test/tests.h b/test/tests.h index de34f4f..f9a6462 100644 --- a/test/tests.h +++ b/test/tests.h @@ -75,11 +75,21 @@ TEST_DECLARE(glm_translate2d) TEST_DECLARE(glm_translate2d_to) TEST_DECLARE(glm_translate2d_x) TEST_DECLARE(glm_translate2d_y) +TEST_DECLARE(glm_translate2d_make) +TEST_DECLARE(glm_scale2d_to) +TEST_DECLARE(glm_scale2d_make) +TEST_DECLARE(glm_scale2d) +TEST_DECLARE(glm_scale2d_uni) TEST_DECLARE(glmc_translate2d) TEST_DECLARE(glmc_translate2d_to) TEST_DECLARE(glmc_translate2d_x) TEST_DECLARE(glmc_translate2d_y) +TEST_DECLARE(glmc_translate2d_make) +TEST_DECLARE(glmc_scale2d_to) +TEST_DECLARE(glmc_scale2d_make) +TEST_DECLARE(glmc_scale2d) +TEST_DECLARE(glmc_scale2d_uni) /* mat4 */ TEST_DECLARE(glm_mat4_ucopy) @@ -781,11 +791,21 @@ TEST_LIST { TEST_ENTRY(glm_translate2d_to) TEST_ENTRY(glm_translate2d_x) TEST_ENTRY(glm_translate2d_y) + TEST_ENTRY(glm_translate2d_make) + TEST_ENTRY(glm_scale2d_to) + TEST_ENTRY(glm_scale2d_make) + TEST_ENTRY(glm_scale2d) + TEST_ENTRY(glm_scale2d_uni) TEST_ENTRY(glmc_translate2d) TEST_ENTRY(glmc_translate2d_to) TEST_ENTRY(glmc_translate2d_x) TEST_ENTRY(glmc_translate2d_y) + TEST_ENTRY(glmc_translate2d_make) + TEST_ENTRY(glmc_scale2d_to) + TEST_ENTRY(glmc_scale2d_make) + TEST_ENTRY(glmc_scale2d) + TEST_ENTRY(glmc_scale2d_uni) /* mat4 */ TEST_ENTRY(glm_mat4_ucopy)