Mon, 26 Feb 2024 21:16:00 +0100
use tree iterator to free scene nodes
src/scene.c | file | annotate | diff | comparison | revisions |
1.1 --- a/src/scene.c Thu Feb 22 22:34:50 2024 +0100 1.2 +++ b/src/scene.c Mon Feb 26 21:16:00 2024 +0100 1.3 @@ -75,20 +75,18 @@ 1.4 void asc_scene_node_free(AscSceneNode *node) { 1.5 if (node == NULL) return; 1.6 1.7 - // TODO: replace with UCX tree visitor 1.8 - // TODO: avoid recursion 1.9 - 1.10 - // free the children recursively 1.11 - while (node->children != NULL) { 1.12 - asc_scene_node_free(node->children); 1.13 - } 1.14 - 1.15 // remove this node from its parent 1.16 asc_scene_node_unlink(node); 1.17 1.18 - // free the node 1.19 - if (node->free_func != NULL) { 1.20 - node->free_func(node); 1.21 + // free the entire subtree 1.22 + CxTreeIterator iter = cx_tree_iterator(node, true, child_list_off_); 1.23 + cx_foreach(AscSceneNode*, child, iter) { 1.24 + if (!iter.exiting) continue; 1.25 + if (child->free_func != NULL) { 1.26 + child->free_func(child); 1.27 + } else { 1.28 + free(child); 1.29 + } 1.30 } 1.31 } 1.32