use tree iterator to free scene nodes

Mon, 26 Feb 2024 21:16:00 +0100

author
Mike Becker <universe@uap-core.de>
date
Mon, 26 Feb 2024 21:16:00 +0100
changeset 31
8324037e0148
parent 30
fceda550ebcb
child 32
86468a71dd73

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  

mercurial