src/scene_node.c

changeset 207
4d184a8706b1
parent 206
26726b7a89a7
child 210
3021616e5772
--- 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 <cx/tree.h>
 #include <cx/linked_list.h>
 #include <cx/printf.h>
 
-#include "ascension/error.h"
+#include <assert.h>
 
 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;
 

mercurial