add rotation functions, but rotation with special point of origin is still broken

Sat, 12 Jul 2025 23:05:43 +0200

author
Mike Becker <universe@uap-core.de>
date
Sat, 12 Jul 2025 23:05:43 +0200
changeset 200
cf0579d3bbc4
parent 199
1d0db7f48457
child 201
030fa72d516a

add rotation functions, but rotation with special point of origin is still broken

src/ascension/datatypes.h file | annotate | diff | comparison | revisions
src/ascension/scene_node.h file | annotate | diff | comparison | revisions
src/ascension/transform.h file | annotate | diff | comparison | revisions
src/scene.c file | annotate | diff | comparison | revisions
test/snake/snake.c file | annotate | diff | comparison | revisions
--- a/src/ascension/datatypes.h	Sat Jul 12 22:28:30 2025 +0200
+++ b/src/ascension/datatypes.h	Sat Jul 12 23:05:43 2025 +0200
@@ -342,7 +342,7 @@
     mat[asc_mat4_index(1,1)] = -2.f / height;
 }
 
-static inline void asc_mat4f_mulst(
+static inline void asc_mat4f_mul(
     asc_mat4f dest,
     asc_mat4f const left,
     asc_mat4f const right
--- a/src/ascension/scene_node.h	Sat Jul 12 22:28:30 2025 +0200
+++ b/src/ascension/scene_node.h	Sat Jul 12 23:05:43 2025 +0200
@@ -179,7 +179,7 @@
  * @param matrix the matrix to multiply with the current transformation matrix
  */
 ASC_TRANFORM_FUNC void asc_node_transform_apply(AscSceneNode *node, const asc_transform matrix) {
-    asc_mat4f_mulst(node->transform, node->transform, matrix);
+    asc_mat4f_mul(node->transform, node->transform, matrix);
     asc_node_update_transform(node);
 }
 
--- a/src/ascension/transform.h	Sat Jul 12 22:28:30 2025 +0200
+++ b/src/ascension/transform.h	Sat Jul 12 23:05:43 2025 +0200
@@ -69,13 +69,6 @@
     }
 }
 
-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_translate2f(
         asc_transform transform,
         asc_vec2f vec
@@ -94,11 +87,102 @@
     }
 }
 
-ASC_TRANFORM_FUNC void asc_transform_rotate_euler2f(
-        __attribute__((__unused__)) asc_transform transform,
-        __attribute__((__unused__)) asc_vec2f vec
+ASC_TRANFORM_FUNC void asc_transform_yaw(
+        asc_transform transform,
+        float angle
 ) {
-    // TODO: implement - and think about the point of origin!
+    float s = sinf(angle);
+    float c = cosf(angle);
+
+    float m00 = transform[asc_mat4_index(0, 0)];
+    float m02 = transform[asc_mat4_index(0, 2)];
+    float m10 = transform[asc_mat4_index(1, 0)];
+    float m12 = transform[asc_mat4_index(1, 2)];
+    float m20 = transform[asc_mat4_index(2, 0)];
+    float m22 = transform[asc_mat4_index(2, 2)];
+
+    transform[asc_mat4_index(0, 0)] = m00 * c + m02 * s;
+    transform[asc_mat4_index(0, 2)] = -m00 * s + m02 * c;
+    transform[asc_mat4_index(1, 0)] = m10 * c + m12 * s;
+    transform[asc_mat4_index(1, 2)] = -m10 * s + m12 * c;
+    transform[asc_mat4_index(2, 0)] = m20 * c + m22 * s;
+    transform[asc_mat4_index(2, 2)] = -m20 * s + m22 * c;
+}
+
+ASC_TRANFORM_FUNC void asc_transform_pitch(
+    asc_transform transform,
+    float angle
+) {
+    float s = sinf(angle);
+    float c = cosf(angle);
+
+    float m01 = transform[asc_mat4_index(0, 1)];
+    float m02 = transform[asc_mat4_index(0, 2)];
+    float m11 = transform[asc_mat4_index(1, 1)];
+    float m12 = transform[asc_mat4_index(1, 2)];
+    float m21 = transform[asc_mat4_index(2, 1)];
+    float m22 = transform[asc_mat4_index(2, 2)];
+
+    transform[asc_mat4_index(0, 1)] = m01 * c - m02 * s;
+    transform[asc_mat4_index(0, 2)] = m01 * s + m02 * c;
+    transform[asc_mat4_index(1, 1)] = m11 * c - m12 * s;
+    transform[asc_mat4_index(1, 2)] = m11 * s + m12 * c;
+    transform[asc_mat4_index(2, 1)] = m21 * c - m22 * s;
+    transform[asc_mat4_index(2, 2)] = m21 * s + m22 * c;
 }
 
-#endif //ASCENSION_TRANSFORM_H
+ASC_TRANFORM_FUNC void asc_transform_roll(
+    asc_transform transform,
+    float angle
+) {
+    float s = sinf(angle);
+    float c = cosf(angle);
+
+    float m00 = transform[asc_mat4_index(0, 0)];
+    float m01 = transform[asc_mat4_index(0, 1)];
+    float m10 = transform[asc_mat4_index(1, 0)];
+    float m11 = transform[asc_mat4_index(1, 1)];
+    float m20 = transform[asc_mat4_index(2, 0)];
+    float m21 = transform[asc_mat4_index(2, 1)];
+
+    transform[asc_mat4_index(0, 0)] = m00 * c - m01 * s;
+    transform[asc_mat4_index(0, 1)] = m00 * s + m01 * c;
+    transform[asc_mat4_index(1, 0)] = m10 * c - m11 * s;
+    transform[asc_mat4_index(1, 1)] = m10 * s + m11 * c;
+    transform[asc_mat4_index(2, 0)] = m20 * c - m21 * s;
+    transform[asc_mat4_index(2, 1)] = m20 * s + m21 * c;
+}
+
+ASC_TRANFORM_FUNC void asc_transform_roll_origin(
+    asc_transform transform,
+    float angle,
+    asc_vec3f point_of_origin
+) {
+    // TODO: this is somehow still broken - find out why
+    asc_transform translate;
+    asc_transform_identity(translate);
+    translate[asc_mat4_index(3, 0)] = -point_of_origin.x;
+    translate[asc_mat4_index(3, 1)] = -point_of_origin.y;
+    translate[asc_mat4_index(3, 2)] = -point_of_origin.z;
+
+    asc_transform rotate;
+    asc_transform_identity(rotate);
+    float s = sinf(angle);
+    float c = cosf(angle);
+    rotate[asc_mat4_index(0, 0)] = c;
+    rotate[asc_mat4_index(0, 1)] = s;
+    rotate[asc_mat4_index(1, 0)] = -s;
+    rotate[asc_mat4_index(1, 1)] = c;
+
+    asc_transform result;
+    asc_mat4f_mul(result, transform, translate);
+    asc_mat4f_mul(transform, result, rotate);
+    translate[asc_mat4_index(3, 0)] *= -1.f;
+    translate[asc_mat4_index(3, 1)] *= -1.f;
+    translate[asc_mat4_index(3, 2)] *= -1.f;
+    asc_mat4f_mul(result, transform, translate);
+    asc_transform_copy(transform, result);
+}
+
+
+#endif //ASCENSION_TRANSFORM_H
\ No newline at end of file
--- a/src/scene.c	Sat Jul 12 22:28:30 2025 +0200
+++ b/src/scene.c	Sat Jul 12 23:05:43 2025 +0200
@@ -168,7 +168,7 @@
                 // skip unnecessary multiplication with unity matrix
                 asc_transform_copy(node->world_transform, node->transform);
             } else {
-                asc_mat4f_mulst(
+                asc_mat4f_mul(
                         node->world_transform,
                         node->transform,
                         node->parent->world_transform
--- a/test/snake/snake.c	Sat Jul 12 22:28:30 2025 +0200
+++ b/test/snake/snake.c	Sat Jul 12 23:05:43 2025 +0200
@@ -118,7 +118,7 @@
     asc_ui_add_node(node);
 }
 
-static void create_spaceship(void) {
+static AscSceneNode *create_spaceship(void) {
     AscSceneNode *sprite = asc_sprite(
         .name = "Player",
         .texture = TEXTURE_SHIP,
@@ -128,8 +128,7 @@
         .height = 64
     );
     asc_scene_add_node(MAIN_SCENE, sprite);
-
-    // TODO: return something
+    return sprite;
 }
 
 static asc_rect update_viewport_for_window_resize(asc_vec2u window_size) {
@@ -194,7 +193,7 @@
     create_score_counter();
 
     // create spaceship
-    create_spaceship();
+    AscSceneNode *spaceship = create_spaceship();
 
     // Main Loop
     do {
@@ -207,6 +206,12 @@
             asc_context_quit();
         }
 
+        // player rotation
+        if (asc_key_pressed(ASC_KEY(LEFT))) {
+            asc_transform_roll_origin(spaceship->transform, asc_rad(-90), ASC_VEC3F(32, 32, 0));
+            asc_node_update_transform(spaceship);
+        }
+
         // debug-key for clearing the shader registry
         if (asc_key_pressed(ASC_KEY(S))) {
             asc_shader_clear_registry();

mercurial