--- a/src/scene.c Tue May 06 22:54:38 2025 +0200 +++ b/src/scene.c Tue May 06 23:04:54 2025 +0200 @@ -59,6 +59,21 @@ asc_scene_node_free(scene->root); } +void asc_scene_execute_behaviors(AscScene *scene) { + CxTreeVisitor iter = cx_tree_visitor(scene->root, + offsetof(AscSceneNode, children), + offsetof(AscSceneNode, next) + ); + cx_foreach(AscSceneNode*, node, iter) { + CxIterator behavior_iter = cxListIterator(node->behaviors); + cx_foreach(AscBehavior*, behavior, behavior_iter) { + if (behavior->enabled) { + behavior->func(behavior); + } + } + } +} + void asc_scene_draw(AscScene *scene) { if (scene->root == NULL) return; @@ -93,13 +108,6 @@ cxTreeVisitorContinue(iter); } - // execute behaviors, first - // TODO: move to a separate iteration that is decoupled from drawing - issue #646 - CxIterator behavior_iter = cxListIterator(node->behaviors); - cx_foreach(AscBehavior*, behavior, behavior_iter) { - behavior->func(behavior); - } - // TODO: implement culling // check if geometry needs update