src/scene_node.c

changeset 113
71ba88258ea0
parent 108
d619bf7dd87b
child 114
5b91bbab1ac0
--- a/src/scene_node.c	Tue May 06 23:04:54 2025 +0200
+++ b/src/scene_node.c	Sat May 10 15:06:47 2025 +0200
@@ -45,13 +45,20 @@
 AscSceneNode *asc_scene_node_empty(void) {
     AscSceneNode *node = calloc(1, sizeof(AscSceneNode));
     node->render_group = ASC_RENDER_GROUP_NONE;
-    node->free_func = (asc_scene_free_func) free;
     node->scale.x = node->scale.y = node->scale.z = 1;
     asc_transform_identity(node->transform);
     asc_transform_identity(node->world_transform);
     return node;
 }
 
+static void asc_scene_node_destroy(AscSceneNode *node) {
+    cxListFree(node->behaviors);
+    if (node->destroy_func != NULL) {
+        node->destroy_func(node);
+    }
+    free(node->name);
+}
+
 void asc_scene_node_free(AscSceneNode *node) {
     if (node == NULL) return;
 
@@ -62,12 +69,8 @@
     CxTreeIterator iter = asc_scene_node_iterator(node, true);
     cx_foreach(AscSceneNode*, child, iter) {
         if (!iter.exiting) continue;
-        cxListFree(child->behaviors);
-        if (child->free_func != NULL) {
-            child->free_func(child);
-        } else {
-            free(child);
-        }
+        asc_scene_node_destroy(child);
+        free(child);
     }
 }
 
@@ -98,7 +101,7 @@
 // TODO: rename in asc_node_add_behavior or just asc_add_behavior()
 void asc_scene_add_behavior(
         AscSceneNode *node,
-        asc_scene_update_func behavior
+        asc_scene_node_update_func behavior
 ) {
     if (node->behaviors == NULL) {
         node->behaviors = cxLinkedListCreateSimple(CX_STORE_POINTERS);
@@ -109,7 +112,7 @@
 
 void asc_scene_remove_behavior(
         AscSceneNode *node,
-        asc_scene_update_func behavior
+        asc_scene_node_update_func behavior
 ) {
     if (node->behaviors != NULL) {
         cxListFindRemove(node->behaviors, behavior);

mercurial