diff -r 8324037e0148 -r 86468a71dd73 src/scene.c --- a/src/scene.c Mon Feb 26 21:16:00 2024 +0100 +++ b/src/scene.c Mon Mar 04 21:16:46 2024 +0100 @@ -52,12 +52,23 @@ void asc_scene_add(AscScene *scene, AscSceneNode *node) { asc_scene_node_link(scene->root, node); + asc_node_update(node); } void asc_scene_draw(AscScene const *scene) { - // TODO: don't visit the tree, visit the render groups CxTreeIterator iter = cx_tree_iterator(scene->root, false, child_list_off_); + + // skip the root node deliberately, we know it's just the container + cxIteratorNext(iter); + + // draw the children cx_foreach(AscSceneNode*, node, iter) { + if (node->need_update && node->update_func != NULL) { + node->need_update = false; + asc_transform_copy(node->transform, node->parent->transform); + node->update_func(node); + } + // TODO: don't visit the tree for drawing, visit the render groups if (node->draw_func != NULL) { node->draw_func(node); } @@ -65,10 +76,10 @@ } AscSceneNode *asc_scene_node_empty(void) { - // TODO: check if this can remain a calloc or if it's too expensive AscSceneNode *node = calloc(1, sizeof(AscSceneNode)); assert(node != NULL); node->free_func = (asc_scene_free_func) free; + asc_transform_identity(node->transform); return node; }