diff -r 26726b7a89a7 -r 4d184a8706b1 src/scene_node.c --- a/src/scene_node.c Mon Jul 14 21:56:53 2025 +0200 +++ b/src/scene_node.c Wed Jul 16 23:27:34 2025 +0200 @@ -27,12 +27,13 @@ #include "ascension/scene_node.h" #include "ascension/context.h" +#include "ascension/error.h" #include #include #include -#include "ascension/error.h" +#include static CxTreeIterator asc_scene_node_iterator( AscSceneNode *node, @@ -82,6 +83,47 @@ } } +void asc_scene_node_init_(AscSceneNode *node, struct asc_scene_node_init_args args) { + if (args.name != NULL) { + asc_scene_node_name(node, args.name); + } + node->render_group = args.render_group; + assert(args.update_func != NULL); + assert(args.draw_func != NULL); + assert(args.destroy_func != NULL); + node->update_func = args.update_func; + node->destroy_func = args.destroy_func; + node->draw_func = args.draw_func; + + if (args.pos2d.x != 0 || args.pos2d.y != 0) { + node->position = ASC_VEC3F(args.pos2d.x, args.pos2d.y, ASC_SCENE_2D_DEPTH_OFFSET); + } else if (args.pos3d.x != 0 || args.pos3d.y != 0 || args.pos3d.z != 0) { + node->position = args.pos3d; + } + + if (args.origin2d.x != 0 || args.origin2d.y != 0) { + node->origin = ASC_VEC3F(args.origin2d.x, args.origin2d.y, 0.f); + } else if (args.origin3d.x != 0 || args.origin3d.y != 0 || args.origin3d.z != 0) { + node->origin = args.origin3d; + } + + if (args.scale2d.width != 0 && args.scale2d.height != 0) { + node->scale = ASC_VEC3F(args.scale2d.width, args.scale2d.height, 1.f); + } else if (args.scale3d.x != 0 && args.scale3d.height != 0 && args.scale3d.depth != 0) { + node->scale = args.scale3d; + } else { + node->scale = ASC_VEC3F_1; + } + + if (asc_memcmpz(args.rotation, ASC_TRANSFORM_SIZE)) { + asc_mat4f_unit(node->rotation); + } else { + asc_transform_copy(node->rotation, args.rotation); + } + + asc_scene_node_update(node); +} + void asc_scene_node_calculate_transform(AscSceneNode *node) { asc_transform temp, temp2;