--- 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);