diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-03-27 02:37:41 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-03-27 02:37:41 +0400 |
commit | 9f91fc10ab648c7a0a28b3b3ef87078675b497c7 (patch) | |
tree | 603af2eeab0ac05bfb7379b2ac86c46bda79585c /source/blender | |
parent | 1942452ce52fa917198fee6f389f1bc7e4c620fe (diff) |
move FOREACH_NODETREE internal checks into functions.
BKE_node_tree_iter_init,step()
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 60 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/node.c | 53 |
2 files changed, 71 insertions, 42 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index e62994576a3..ddb85e4ccfd 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -641,57 +641,33 @@ void BKE_node_tree_unlink_id(ID *id, struct bNodeTree *ntree); * FOREACH_NODETREE_END */ +/* should be an opaque type, only for internal use by BKE_node_tree_iter_*** */ +struct NodeTreeIterStore { + bNodeTree *ngroup; + Scene *scene; + Material *mat; + Tex *tex; + Lamp *lamp; + World *world; +}; + +void BKE_node_tree_iter_init(struct NodeTreeIterStore *ntreeiter, struct Main *bmain); +bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter, + struct bNodeTree **r_nodetree, struct ID **r_id); + #define FOREACH_NODETREE(bmain, _nodetree, _id) \ { \ + struct NodeTreeIterStore _nstore; \ bNodeTree *_nodetree; \ ID *_id; \ - bNodeTree *_ngroup = bmain->nodetree.first; \ - Scene *_scene = bmain->scene.first; \ - Material *_mat = bmain->mat.first; \ - Tex *_tex = bmain->tex.first; \ - Lamp *_lamp = bmain->lamp.first; \ - World *_world = bmain->world.first; \ /* avoid compiler warning about unused variables */ \ - (void)_id; \ - (void)_nodetree; \ - do { \ - if (_ngroup) { \ - _nodetree = _ngroup; \ - _id = (ID *)_ngroup; \ - _ngroup = _ngroup->id.next; \ - } \ - else if (_scene) { \ - _nodetree = _scene->nodetree; \ - _id = (ID *)_scene; \ - _scene = _scene->id.next; \ - } \ - else if (_mat) { \ - _nodetree = _mat->nodetree; \ - _id = (ID *)_mat; \ - _mat = _mat->id.next; \ - } \ - else if (_tex) { \ - _nodetree = _tex->nodetree; \ - _id = (ID *)_tex; \ - _tex = _tex->id.next; \ - } \ - else if (_lamp) { \ - _nodetree = _lamp->nodetree; \ - _id = (ID *)_lamp; \ - _lamp = _lamp->id.next; \ - } \ - else if (_world) { \ - _nodetree = _world->nodetree; \ - _id = (ID *)_world; \ - _world = _world->id.next; \ - } \ - else \ - break; \ + BKE_node_tree_iter_init(&_nstore, bmain); \ + while (BKE_node_tree_iter_step(&_nstore, &_nodetree, &_id) == true) { \ if (_nodetree) { #define FOREACH_NODETREE_END \ } \ - } while (TRUE); \ + } \ } /* ************** SHADER NODES *************** */ diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index a1d9d8af627..7fcbc14a593 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -3593,3 +3593,56 @@ void clear_scene_in_nodes(Main *bmain, Scene *sce) } } } + + +/* -------------------------------------------------------------------- */ +/* NodeTree Iterator Helpers (FOREACH_NODETREE) */ + +void BKE_node_tree_iter_init(struct NodeTreeIterStore *ntreeiter, struct Main *bmain) +{ + ntreeiter->ngroup = bmain->nodetree.first; + ntreeiter->scene = bmain->scene.first; + ntreeiter->mat = bmain->mat.first; + ntreeiter->tex = bmain->tex.first; + ntreeiter->lamp = bmain->lamp.first; + ntreeiter->world = bmain->world.first; +} +bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter, + bNodeTree **r_nodetree, struct ID **r_id) +{ + if (ntreeiter->ngroup) { + *r_nodetree = ntreeiter->ngroup; + *r_id = (ID *)ntreeiter->ngroup; + ntreeiter->ngroup = ntreeiter->ngroup->id.next; + } + else if (ntreeiter->scene) { + *r_nodetree = ntreeiter->scene->nodetree; + *r_id = (ID *)ntreeiter->scene; + ntreeiter->scene = ntreeiter->scene->id.next; + } + else if (ntreeiter->mat) { + *r_nodetree = ntreeiter->mat->nodetree; + *r_id = (ID *)ntreeiter->mat; + ntreeiter->mat = ntreeiter->mat->id.next; + } + else if (ntreeiter->tex) { + *r_nodetree = ntreeiter->tex->nodetree; + *r_id = (ID *)ntreeiter->tex; + ntreeiter->tex = ntreeiter->tex->id.next; + } + else if (ntreeiter->lamp) { + *r_nodetree = ntreeiter->lamp->nodetree; + *r_id = (ID *)ntreeiter->lamp; + ntreeiter->lamp = ntreeiter->lamp->id.next; + } + else if (ntreeiter->world) { + *r_nodetree = ntreeiter->world->nodetree; + *r_id = (ID *)ntreeiter->world; + ntreeiter->world = ntreeiter->world->id.next; + } + else { + return false; + } + + return true; +} |