Commit: 60aa0b5b155aad774f85bdd6bc5d497157d568cb Author: Dalai Felinto Date: Mon Dec 19 17:52:09 2016 +0100 Branches: render-layers https://developer.blender.org/rB60aa0b5b155aad774f85bdd6bc5d497157d568cb
Reworked logic of iterators otherwise I could not get different iterators based on a flag (SELECT), which is used everywhere in object_relations.c The alternative would be to split every function in object_relations.c into _all, and _selected =================================================================== M source/blender/blenkernel/BKE_collection.h M source/blender/blenkernel/BKE_layer.h M source/blender/blenkernel/intern/collection.c M source/blender/blenkernel/intern/layer.c M source/blender/blenlib/BLI_iterator.h M source/blender/blenlib/CMakeLists.txt D source/blender/blenlib/intern/BLI_iterator.c M source/blender/editors/object/object_relations.c =================================================================== diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h index 3185f82..2b037f5 100644 --- a/source/blender/blenkernel/BKE_collection.h +++ b/source/blender/blenkernel/BKE_collection.h @@ -38,6 +38,7 @@ extern "C" { struct Iterator; struct SceneCollection; struct Object; +struct ObjectBase; struct Scene; struct SceneCollection *BKE_collection_add(struct Scene *scene, struct SceneCollection *sc_parent, const char *name); @@ -54,8 +55,13 @@ void BKE_scene_collections_callback(struct Scene *scene, BKE_scene_collections_C void BKE_scene_objects_callback(struct Scene *scene, BKE_scene_objects_Cb callback, void *data); /* iterators */ -void BKE_scene_objects_Iterator_begin(struct Iterator *iter, void *data); -void BKE_scene_collections_Iterator_begin(struct Iterator *iter, void *data); +void BKE_scene_collections_Iterator_begin(struct Iterator *iter, void *data_in); +void BKE_scene_collections_Iterator_next(struct Iterator *iter); +void BKE_scene_collections_Iterator_end(struct Iterator *iter); + +void BKE_scene_objects_Iterator_begin(struct Iterator *iter, void *data_in); +void BKE_scene_objects_Iterator_next(struct Iterator *iter); +void BKE_scene_objects_Iterator_end(struct Iterator *iter); typedef struct SceneCollectionIterData { struct SceneCollection *sc; @@ -63,27 +69,22 @@ typedef struct SceneCollectionIterData { } SceneCollectionIterData; #define FOREACH_SCENE_COLLECTION(scene, _sc) \ - ITER_BEGIN(BKE_scene_collections_Iterator_begin, scene, _sc) + ITER_BEGIN(BKE_scene_collections_Iterator_begin, \ + BKE_scene_collections_Iterator_next, \ + BKE_scene_collections_Iterator_end, \ + scene, _sc) #define FOREACH_SCENE_COLLECTION_END \ ITER_END #define FOREACH_SCENE_OBJECT(scene, _ob) \ -{ \ - GSet *visited = BLI_gset_ptr_new(__func__); \ - SceneCollection *sc; \ - FOREACH_SCENE_COLLECTION(scene, sc) \ - for (LinkData *link = sc->objects.first; link; link = link->next) { \ - _ob = link->data; \ - if (!BLI_gset_haskey(visited, ob)) { \ - BLI_gset_add(visited, ob); + ITER_BEGIN(BKE_scene_objects_Iterator_begin, \ + BKE_scene_objects_Iterator_next, \ + BKE_scene_objects_Iterator_end, \ + scene, _ob) #define FOREACH_SCENE_OBJECT_END \ - } \ - } \ - FOREACH_SCENE_COLLECTION_END \ - BLI_gset_free(visited, NULL); \ -} + ITER_END #ifdef __cplusplus } diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h index acfad81..090ab34 100644 --- a/source/blender/blenkernel/BKE_layer.h +++ b/source/blender/blenkernel/BKE_layer.h @@ -27,6 +27,8 @@ * \ingroup bke */ +#include "BKE_collection.h" + #ifdef __cplusplus extern "C" { #endif @@ -72,6 +74,45 @@ void BKE_collection_unlink(struct SceneLayer *sl, struct LayerCollection *lc); void BKE_collection_override_datablock_add(struct LayerCollection *lc, const char *data_path, struct ID *id); +/* iterators */ + +void BKE_selected_objects_Iterator_begin(Iterator *iter, void *data_in); +void BKE_selected_objects_Iterator_next(Iterator *iter); +void BKE_selected_objects_Iterator_end(Iterator *iter); + +#define FOREACH_SELECTED_OBJECT(sl, _ob) \ + ITER_BEGIN(BKE_selected_objects_Iterator_begin, \ + BKE_selected_objects_Iterator_next, \ + BKE_selected_objects_Iterator_end, \ + sl, _ob) + +#define FOREACH_SELECTED_OBJECT_END \ + ITER_END + +#define FOREACH_OBJECT_FLAG(scene, sl, flag, _ob) \ +{ \ + IteratorBeginCb func_begin; \ + IteratorCb func_next, func_end; \ + void *data_in; \ + \ + if (flag == SELECT) { \ + func_begin = &BKE_selected_objects_Iterator_begin; \ + func_next = &BKE_selected_objects_Iterator_next; \ + func_end = &BKE_selected_objects_Iterator_end; \ + data_in = sl; \ + } \ + else { \ + func_begin = BKE_scene_objects_Iterator_begin; \ + func_next = BKE_scene_objects_Iterator_next; \ + func_end = BKE_scene_objects_Iterator_end; \ + data_in = scene; \ + } \ + ITER_BEGIN(func_begin, func_next, func_end, data_in, _ob) + + +#define FOREACH_OBJECT_FLAG_END \ + ITER_END \ +} #ifdef __cplusplus } diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c index 81d8d26..0305753 100644 --- a/source/blender/blenkernel/intern/collection.c +++ b/source/blender/blenkernel/intern/collection.c @@ -202,6 +202,13 @@ void BKE_collection_object_remove(struct Scene *UNUSED(scene), struct SceneColle /* ---------------------------------------------------------------------- */ /* Iteractors */ +/* scene collection iteractor */ + +typedef struct SceneCollectionsIteratorData { + Scene *scene; + void **array; + int tot, cur; + } SceneCollectionsIteratorData; static void scene_collection_callback(SceneCollection *sc, BKE_scene_collections_Cb callback, void *data) { @@ -249,7 +256,104 @@ static void scene_collections_array(Scene *scene, SceneCollection ***collections * Only use this in non-performance critical situations * (it iterates over all scene collections twice) */ -void BKE_scene_collections_Iterator_begin(Iterator *iter, void *data) +void BKE_scene_collections_Iterator_begin(Iterator *iter, void *data_in) +{ + Scene *scene = data_in; + SceneCollectionsIteratorData *data = MEM_callocN(sizeof(SceneCollectionIterData), __FUNCTION__); + + data->scene = scene; + iter->data = data; + + scene_collections_array(scene, (SceneCollection ***)&data->array, &data->tot); + BLI_assert(data->tot != 0); + + data->cur = 0; + iter->current = data->array[data->cur]; + iter->valid = true; +} + +void BKE_scene_collections_Iterator_next(struct Iterator *iter) +{ + SceneCollectionsIteratorData *data = iter->data; + + if (++data->cur < data->tot) { + iter->current = data->array[data->cur]; + } + else { + iter->valid = false; + } +} + +void BKE_scene_collections_Iterator_end(struct Iterator *iter) +{ + SceneCollectionsIteratorData *data = iter->data; + + if (data->array) { + MEM_freeN(data->array); + } + iter->valid = false; +} + + +/* scene objects iteractor */ + +typedef struct SceneObjectsIteratorData { + GSet *visited; + LinkData *link; + Iterator scene_collection_iter; +} SceneObjectsIteratorData; + +void BKE_scene_objects_Iterator_begin(Iterator *iter, void *data_in) +{ + Scene *scene = data_in; + SceneObjectsIteratorData *data = MEM_callocN(sizeof(SceneObjectsIteratorData), __FUNCTION__); + iter->data = data; + + /* lookup list ot make sure each object is object called once */ + data->visited = BLI_gset_ptr_new(__func__); + + /* we wrap the scenecollection iterator here to go over the scene collections */ + BKE_scene_collections_Iterator_begin(&data->scene_collection_iter, scene); + + SceneCollection *sc = data->scene_collection_iter.current; + iter->current = sc->objects.first; +} + +void BKE_scene_objects_Iterator_next(Iterator *iter) +{ + SceneObjectsIteratorData *data = iter->data; + + if (data->link->next) { + data->link = data->link->next; + iter->current = data->link->data; + } + else { + //TODO redo logic + while (data->scene_collection_iter.valid) { + SceneCollection *sc = data->scene_collection_iter.current; + if (sc->objects.first) { + data->link = sc->objects.first; + iter->current = data->link->data; + break; + } + BKE_scene_collections_Iterator_next(&data->scene_collection_iter); + } + + if (!data->scene_collection_iter.valid) { + iter->valid = false; + } + } + +#if 0 // TODO + if (!BLI_gset_haskey(visited, ob)) { \ + BLI_gset_add(visited, ob); + } +#endif +} + +void BKE_scene_objects_Iterator_end(Iterator *iter) { - scene_collections_array(data, (SceneCollection ***)&iter->array, &iter->tot); + SceneObjectsIteratorData *data = iter->data; + BKE_scene_collections_Iterator_end(&data->scene_collection_iter); + BLI_gset_free(data->visited, NULL); } diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index 5f4aadf..2f61ff3 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -347,3 +347,36 @@ void BKE_collection_override_datablock_add(LayerCollection *UNUSED(lc), const ch { TODO_LAYER_OVERRIDE; } + +/* Iterators */ + +void BKE @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs