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

Reply via email to