src/scene.c

changeset 32
86468a71dd73
parent 31
8324037e0148
child 33
e7ddb52facd3
     1.1 --- a/src/scene.c	Mon Feb 26 21:16:00 2024 +0100
     1.2 +++ b/src/scene.c	Mon Mar 04 21:16:46 2024 +0100
     1.3 @@ -52,12 +52,23 @@
     1.4  
     1.5  void asc_scene_add(AscScene *scene, AscSceneNode *node) {
     1.6      asc_scene_node_link(scene->root, node);
     1.7 +    asc_node_update(node);
     1.8  }
     1.9  
    1.10  void asc_scene_draw(AscScene const *scene) {
    1.11 -    // TODO: don't visit the tree, visit the render groups
    1.12      CxTreeIterator iter = cx_tree_iterator(scene->root, false, child_list_off_);
    1.13 +
    1.14 +    // skip the root node deliberately, we know it's just the container
    1.15 +    cxIteratorNext(iter);
    1.16 +
    1.17 +    // draw the children
    1.18      cx_foreach(AscSceneNode*, node, iter) {
    1.19 +        if (node->need_update && node->update_func != NULL) {
    1.20 +            node->need_update = false;
    1.21 +            asc_transform_copy(node->transform, node->parent->transform);
    1.22 +            node->update_func(node);
    1.23 +        }
    1.24 +        // TODO: don't visit the tree for drawing, visit the render groups
    1.25          if (node->draw_func != NULL) {
    1.26              node->draw_func(node);
    1.27          }
    1.28 @@ -65,10 +76,10 @@
    1.29  }
    1.30  
    1.31  AscSceneNode *asc_scene_node_empty(void) {
    1.32 -    // TODO: check if this can remain a calloc or if it's too expensive
    1.33      AscSceneNode *node = calloc(1, sizeof(AscSceneNode));
    1.34      assert(node != NULL);
    1.35      node->free_func = (asc_scene_free_func) free;
    1.36 +    asc_transform_identity(node->transform);
    1.37      return node;
    1.38  }
    1.39  

mercurial