apply new CxTreeIterator from ucx 3.1 preview

Thu, 22 Feb 2024 22:34:50 +0100

author
Mike Becker <universe@uap-core.de>
date
Thu, 22 Feb 2024 22:34:50 +0100
changeset 30
fceda550ebcb
parent 29
1d001eb694dc
child 31
8324037e0148

apply new CxTreeIterator from ucx 3.1 preview

src/scene.c file | annotate | diff | comparison | revisions
--- a/src/scene.c	Tue Jan 23 21:34:12 2024 +0100
+++ b/src/scene.c	Thu Feb 22 22:34:50 2024 +0100
@@ -32,9 +32,11 @@
 
 #include <assert.h>
 
-#define asc_scene_node_layout \
+#define node_layout_ \
     offsetof(AscSceneNode, parent), offsetof(AscSceneNode, children), \
     offsetof(AscSceneNode, prev), offsetof(AscSceneNode, next)
+#define child_list_off_ \
+    offsetof(AscSceneNode, children), offsetof(AscSceneNode, next)
 
 void asc_scene_init(AscScene *scene) {
     if (scene->root != NULL) {
@@ -52,23 +54,14 @@
     asc_scene_node_link(scene->root, node);
 }
 
-static void asc_scene_draw_node(AscSceneNode *node) {
-    if (node->draw_func != NULL) {
-        node->draw_func(node);
-    }
-    if (node->children != NULL) {
-        asc_scene_draw_node(node->children);
+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_);
+    cx_foreach(AscSceneNode*, node, iter) {
+        if (node->draw_func != NULL) {
+            node->draw_func(node);
+        }
     }
-    if (node->next != NULL) {
-        asc_scene_draw_node(node->next);
-    }
-}
-
-void asc_scene_draw(AscScene const *scene) {
-    // TODO: replace with UCX tree visitor
-    // TODO: don't visit the tree, visit the render groups
-    // TODO: avoid recursion
-    asc_scene_draw_node(scene->root);
 }
 
 AscSceneNode *asc_scene_node_empty(void) {
@@ -100,9 +93,9 @@
 }
 
 void asc_scene_node_link(AscSceneNode * restrict parent, AscSceneNode * restrict node) {
-    cx_tree_link(parent, node, asc_scene_node_layout);
+    cx_tree_link(parent, node, node_layout_);
 }
 
 void asc_scene_node_unlink(AscSceneNode *node) {
-    cx_tree_unlink(node, asc_scene_node_layout);
+    cx_tree_unlink(node, node_layout_);
 }
\ No newline at end of file

mercurial