Fri, 30 May 2025 19:37:23 +0200
add 2D affine transformations
src/ascension/transform.h | file | annotate | diff | comparison | revisions | |
src/scene.c | file | annotate | diff | comparison | revisions |
--- 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
--- 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,