56 if (scene->root == NULL) return; |
56 if (scene->root == NULL) return; |
57 for (unsigned i = 0 ; i < ASC_RENDER_GROUP_COUNT ; i++) { |
57 for (unsigned i = 0 ; i < ASC_RENDER_GROUP_COUNT ; i++) { |
58 cxListFree(scene->internal.render_groups[i]); |
58 cxListFree(scene->internal.render_groups[i]); |
59 scene->internal.render_groups[i] = NULL; |
59 scene->internal.render_groups[i] = NULL; |
60 } |
60 } |
|
61 // TODO: add names to scenes |
61 asc_dprintf("Destroyed scene %"PRIxPTR, (uintptr_t) scene); |
62 asc_dprintf("Destroyed scene %"PRIxPTR, (uintptr_t) scene); |
62 asc_scene_node_free(scene->root); |
63 asc_scene_node_free(scene->root); |
63 } |
64 } |
64 |
65 |
65 void asc_scene_execute_behaviors(AscScene *scene) { |
66 void asc_scene_execute_behaviors(AscScene *scene) { |
66 CxTreeVisitor iter = cx_tree_visitor(scene->root, |
67 CxTreeVisitor iter = cx_tree_visitor(scene->root, |
67 offsetof(AscSceneNode, children), |
68 offsetof(AscSceneNode, children), |
68 offsetof(AscSceneNode, next) |
69 offsetof(AscSceneNode, next) |
69 ); |
70 ); |
70 cx_foreach(AscSceneNode*, node, iter) { |
71 cx_foreach(AscSceneNode*, node, iter) { |
71 CxIterator behavior_iter = cxListIterator(node->behaviors); |
72 CxIterator behavior_iter = cxListMutIterator(node->behaviors); |
72 cx_foreach(AscBehavior*, behavior, behavior_iter) { |
73 cx_foreach(AscBehavior*, behavior, behavior_iter) { |
73 asc_behavior_trigger(behavior); |
74 if (behavior->enabled) { |
|
75 asc_behavior_trigger(behavior); |
|
76 } |
|
77 if (behavior->killed) { |
|
78 cxIteratorFlagRemoval(behavior_iter); |
|
79 } |
74 } |
80 } |
75 } |
81 } |
76 } |
82 } |
77 |
83 |
78 static void asc_scene_draw2d( |
84 static void asc_scene_draw2d( |