[Bf-blender-cvs] [60aa0b5] render-layers: Reworked logic of iterators
Dalai Felinto
noreply at git.blender.org
Mon Dec 19 17:58:09 CET 2016
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. @@
More information about the Bf-blender-cvs
mailing list