src/scene.c

changeset 112
3e956c96dd6c
parent 108
d619bf7dd87b
--- 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

mercurial