mirror of
https://github.com/recp/cglm.git
synced 2025-10-04 09:08:53 +00:00
2d: add scale2d and its friends
This commit is contained in:
@@ -27,7 +27,7 @@
|
|||||||
* and stores result in same matrix
|
* and stores result in same matrix
|
||||||
*
|
*
|
||||||
* @param[in, out] m affine transfrom
|
* @param[in, out] m affine transfrom
|
||||||
* @param[in] v translate vector [x, y, z]
|
* @param[in] v translate vector [x, y]
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
@@ -44,7 +44,7 @@ glm_translate2d(mat3 m, vec2 v) {
|
|||||||
* source matrix will remain same
|
* source matrix will remain same
|
||||||
*
|
*
|
||||||
* @param[in] m affine transfrom
|
* @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
|
* @param[out] dest translated matrix
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
@@ -86,7 +86,7 @@ glm_translate2d_y(mat3 m, float y) {
|
|||||||
* @brief creates NEW translate 2d transform matrix by v vector
|
* @brief creates NEW translate 2d transform matrix by v vector
|
||||||
*
|
*
|
||||||
* @param[out] m affine transfrom
|
* @param[out] m affine transfrom
|
||||||
* @param[in] v translate vector [x, y, z]
|
* @param[in] v translate vector [x, y]
|
||||||
*/
|
*/
|
||||||
CGLM_INLINE
|
CGLM_INLINE
|
||||||
void
|
void
|
||||||
@@ -96,5 +96,80 @@ glm_translate2d_make(mat3 m, vec2 v) {
|
|||||||
m[2][1] = v[1];
|
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 */
|
#endif /* cglm_affine2d_h */
|
||||||
|
@@ -33,6 +33,22 @@ CGLM_EXPORT
|
|||||||
void
|
void
|
||||||
glmc_translate2d_y(mat3 m, float to);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -37,3 +37,27 @@ void
|
|||||||
glmc_translate2d_y(mat3 m, float to) {
|
glmc_translate2d_y(mat3 m, float to) {
|
||||||
glm_translate2d_y(m, 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);
|
||||||
|
}
|
||||||
|
@@ -35,7 +35,7 @@ TEST_IMPL(GLM_PREFIX, translate2d_to) {
|
|||||||
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
|
vec3 v1 = {2.0f, 3.0f, 1.0f}, v2;
|
||||||
|
|
||||||
glm_mat3_identity(m1);
|
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);
|
glm_mat3_mulv(m2, v1, v2);
|
||||||
|
|
||||||
ASSERT(test_eq(v2[0], 15.0f))
|
ASSERT(test_eq(v2[0], 15.0f))
|
||||||
@@ -43,7 +43,7 @@ TEST_IMPL(GLM_PREFIX, translate2d_to) {
|
|||||||
ASSERT(test_eq(v2[2], 1.0f))
|
ASSERT(test_eq(v2[2], 1.0f))
|
||||||
|
|
||||||
glm_mat3_identity(m1);
|
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);
|
glm_mat3_mulv(m2, v2, v2);
|
||||||
|
|
||||||
ASSERT(test_eq(v2[0], 16.0f))
|
ASSERT(test_eq(v2[0], 16.0f))
|
||||||
@@ -99,3 +99,116 @@ TEST_IMPL(GLM_PREFIX, translate2d_y) {
|
|||||||
|
|
||||||
TEST_SUCCESS
|
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
|
||||||
|
}
|
||||||
|
20
test/tests.h
20
test/tests.h
@@ -75,11 +75,21 @@ TEST_DECLARE(glm_translate2d)
|
|||||||
TEST_DECLARE(glm_translate2d_to)
|
TEST_DECLARE(glm_translate2d_to)
|
||||||
TEST_DECLARE(glm_translate2d_x)
|
TEST_DECLARE(glm_translate2d_x)
|
||||||
TEST_DECLARE(glm_translate2d_y)
|
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)
|
||||||
TEST_DECLARE(glmc_translate2d_to)
|
TEST_DECLARE(glmc_translate2d_to)
|
||||||
TEST_DECLARE(glmc_translate2d_x)
|
TEST_DECLARE(glmc_translate2d_x)
|
||||||
TEST_DECLARE(glmc_translate2d_y)
|
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 */
|
/* mat4 */
|
||||||
TEST_DECLARE(glm_mat4_ucopy)
|
TEST_DECLARE(glm_mat4_ucopy)
|
||||||
@@ -781,11 +791,21 @@ TEST_LIST {
|
|||||||
TEST_ENTRY(glm_translate2d_to)
|
TEST_ENTRY(glm_translate2d_to)
|
||||||
TEST_ENTRY(glm_translate2d_x)
|
TEST_ENTRY(glm_translate2d_x)
|
||||||
TEST_ENTRY(glm_translate2d_y)
|
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)
|
||||||
TEST_ENTRY(glmc_translate2d_to)
|
TEST_ENTRY(glmc_translate2d_to)
|
||||||
TEST_ENTRY(glmc_translate2d_x)
|
TEST_ENTRY(glmc_translate2d_x)
|
||||||
TEST_ENTRY(glmc_translate2d_y)
|
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 */
|
/* mat4 */
|
||||||
TEST_ENTRY(glm_mat4_ucopy)
|
TEST_ENTRY(glm_mat4_ucopy)
|
||||||
|
Reference in New Issue
Block a user