# HG changeset patch # User Mike Becker # Date 1748626643 -7200 # Node ID c3fce2a543ee8f0f186fc4805d9b4c7158262843 # Parent 84e89b36c792c0a4c8f7e56cfb25f9c18946e7df add 2D affine transformations diff -r 84e89b36c792 -r c3fce2a543ee src/ascension/transform.h --- a/src/ascension/transform.h Fri May 30 19:32:13 2025 +0200 +++ b/src/ascension/transform.h Fri May 30 19:37:23 2025 +0200 @@ -53,7 +53,7 @@ memcpy(dest, src, ASC_TRANSFORM_SIZE); } -ASC_TRANFORM_FUNC void asc_transform_translate( +ASC_TRANFORM_FUNC void asc_transform_translate3f( asc_transform transform, asc_vec3f vec ) { @@ -62,7 +62,7 @@ transform[asc_mat4_index(3, 2)] += vec.z; } -ASC_TRANFORM_FUNC void asc_transform_scale( +ASC_TRANFORM_FUNC void asc_transform_scale3f( asc_transform transform, asc_vec3f vec ) { @@ -73,23 +73,60 @@ } } -ASC_TRANFORM_FUNC void asc_transform_rotate( +ASC_TRANFORM_FUNC void asc_transform_rotate_euler3f( __attribute__((__unused__)) asc_transform transform, __attribute__((__unused__)) asc_vec3f vec ) { // TODO: implement } -ASC_TRANFORM_FUNC void asc_transform_from_parts( +ASC_TRANFORM_FUNC void asc_transform_from_vec3f( asc_transform transform, asc_vec3f position, asc_vec3f scale, asc_vec3f rotation ) { asc_transform_identity(transform); - asc_transform_scale(transform, scale); - asc_transform_translate(transform, position); - asc_transform_rotate(transform, rotation); + asc_transform_scale3f(transform, scale); + asc_transform_translate3f(transform, position); + asc_transform_rotate_euler3f(transform, rotation); +} + +ASC_TRANFORM_FUNC void asc_transform_translate2f( + asc_transform transform, + asc_vec2f vec +) { + transform[asc_mat4_index(3, 0)] += vec.x; + transform[asc_mat4_index(3, 1)] += vec.y; +} + +ASC_TRANFORM_FUNC void asc_transform_scale2f( + asc_transform transform, + asc_vec2f vec +) { + for (unsigned i = 0 ; i < 3 ; i++) { + transform[asc_mat4_index(0, i)] *= vec.width; + transform[asc_mat4_index(1, i)] *= vec.height; + } +} + +ASC_TRANFORM_FUNC void asc_transform_rotate_euler2f( + __attribute__((__unused__)) asc_transform transform, + __attribute__((__unused__)) asc_vec2f vec +) { + // TODO: implement +} + +ASC_TRANFORM_FUNC void asc_transform_from_vec2f( + asc_transform transform, + asc_vec2f position, + asc_vec2f scale, + asc_vec2f rotation +) { + asc_transform_identity(transform); + asc_transform_scale2f(transform, scale); + asc_transform_translate2f(transform, position); + asc_transform_rotate_euler2f(transform, rotation); } #endif //ASCENSION_TRANSFORM_H diff -r 84e89b36c792 -r c3fce2a543ee src/scene.c --- a/src/scene.c Fri May 30 19:32:13 2025 +0200 +++ b/src/scene.c Fri May 30 19:37:23 2025 +0200 @@ -122,7 +122,8 @@ if (asc_test_flag(node->flags, ASC_SCENE_NODE_UPDATE_TRANSFORM)) { asc_set_flag(node->flags, ASC_SCENE_NODE_TRANSFORM_UPDATED); asc_clear_flag(node->flags, ASC_SCENE_NODE_UPDATE_TRANSFORM); - asc_transform_from_parts( + // TODO: FIXME: this makes it impossible to directly modify the transform with matrix operations! + asc_transform_from_vec3f( node->transform, node->position, node->scale,