diff -r 3954c551ded3 -r b7954818a6b7 src/scene.c --- a/src/scene.c Fri Apr 12 22:23:31 2024 +0200 +++ b/src/scene.c Fri Apr 12 22:43:00 2024 +0200 @@ -28,6 +28,7 @@ #include "ascension/scene.h" #include "ascension/context.h" +#include "ascension/utils.h" #include #include @@ -84,7 +85,7 @@ node->depth = iter.depth; // skip hidden nodes (and all their children) - if (node->hidden) { + if (asc_test_flag(node->flags, ASC_SCENE_NODE_HIDDEN)) { cxTreeVisitorContinue(iter); } @@ -97,16 +98,15 @@ } // TODO: implement culling - // TODO: implement a hidden flag (requires UCX tree-continue function) // check if geometry needs update - if (node->need_graphics_update) { + if (asc_test_flag(node->flags, ASC_SCENE_NODE_UPDATE_GRAPHICS)) { assert(node->update_func != NULL); - node->need_graphics_update = false; + asc_clear_flag(node->flags, ASC_SCENE_NODE_UPDATE_GRAPHICS); node->update_func(node); } - if (node->need_transform_update) { - node->need_transform_update = false; + if (asc_test_flag(node->flags, ASC_SCENE_NODE_UPDATE_TRANSFORM)) { + asc_test_flag(node->flags, ASC_SCENE_NODE_UPDATE_TRANSFORM); asc_transform_from_parts( node->transform, node->position, @@ -242,12 +242,21 @@ } } -void asc_update_transform(AscSceneNode *node) { - if (node->need_transform_update) return; +void asc_node_update(AscSceneNode *node) { + asc_set_flag(node->flags, ASC_SCENE_NODE_UPDATE_GRAPHICS); +} + +void asc_node_update_transform(AscSceneNode *node) { + // fast skip if node is already marked + if (asc_test_flag(node->flags, ASC_SCENE_NODE_UPDATE_TRANSFORM)) { + return; + } CxTreeIterator iter = asc_scene_node_iterator(node, false); cx_foreach(AscSceneNode*, n, iter) { - // TODO: break/continue when subtree is already marked for update - n->need_transform_update = true; + if (asc_test_flag(n->flags, ASC_SCENE_NODE_UPDATE_TRANSFORM)) { + cxTreeIteratorContinue(iter); + } + asc_set_flag(n->flags, ASC_SCENE_NODE_UPDATE_TRANSFORM); } }