# HG changeset patch # User Mike Becker # Date 1752354343 -7200 # Node ID cf0579d3bbc49b85cf9b8f769a6e04f52d84db58 # Parent 1d0db7f484576c66b6f8cfcf47c6c52b3cb9d7d4 add rotation functions, but rotation with special point of origin is still broken diff -r 1d0db7f48457 -r cf0579d3bbc4 src/ascension/datatypes.h --- 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 diff -r 1d0db7f48457 -r cf0579d3bbc4 src/ascension/scene_node.h --- 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); } diff -r 1d0db7f48457 -r cf0579d3bbc4 src/ascension/transform.h --- 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 diff -r 1d0db7f48457 -r cf0579d3bbc4 src/scene.c --- 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 diff -r 1d0db7f48457 -r cf0579d3bbc4 test/snake/snake.c --- 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();