add 2D affine transformations

Fri, 30 May 2025 19:37:23 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 30 May 2025 19:37:23 +0200
changeset 130
c3fce2a543ee
parent 129
84e89b36c792
child 131
b951ae1c638d

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,

mercurial