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