Commit: 42bb135480b196cc4dbeb6fb4ce793c4fa2880a6
Author: Dalai Felinto
Date:   Tue Dec 20 10:25:11 2016 +0100
Branches: render-layers
https://developer.blender.org/rB42bb135480b196cc4dbeb6fb4ce793c4fa2880a6

Fresh morning fixup of iterator logics

(and fix unfreed memory)

===================================================================

M       source/blender/blenkernel/BKE_collection.h
M       source/blender/blenkernel/intern/collection.c
M       source/blender/blenkernel/intern/layer.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_collection.h 
b/source/blender/blenkernel/BKE_collection.h
index 2b037f5..0d5bd2a 100644
--- a/source/blender/blenkernel/BKE_collection.h
+++ b/source/blender/blenkernel/BKE_collection.h
@@ -63,11 +63,6 @@ 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;
-       struct SceneCollectionIterData *parent;
-} SceneCollectionIterData;
-
 #define FOREACH_SCENE_COLLECTION(scene, _sc)                                  \
        ITER_BEGIN(BKE_scene_collections_Iterator_begin,                        
  \
                   BKE_scene_collections_Iterator_next,                         
  \
diff --git a/source/blender/blenkernel/intern/collection.c 
b/source/blender/blenkernel/intern/collection.c
index 58533c2..f2081dc 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -259,7 +259,7 @@ static void scene_collections_array(Scene *scene, 
SceneCollection ***collections
 void BKE_scene_collections_Iterator_begin(Iterator *iter, void *data_in)
 {
        Scene *scene = data_in;
-       SceneCollectionsIteratorData *data = 
MEM_callocN(sizeof(SceneCollectionIterData), __FUNCTION__);
+       SceneCollectionsIteratorData *data = 
MEM_callocN(sizeof(SceneCollectionsIteratorData), __FUNCTION__);
 
        data->scene = scene;
        iter->data = data;
@@ -288,8 +288,11 @@ void BKE_scene_collections_Iterator_end(struct Iterator 
*iter)
 {
        SceneCollectionsIteratorData *data = iter->data;
 
-       if (data->array) {
-               MEM_freeN(data->array);
+       if (data) {
+               if (data->array) {
+                       MEM_freeN(data->array);
+               }
+               MEM_freeN(data);
        }
        iter->valid = false;
 }
@@ -350,16 +353,19 @@ void BKE_scene_objects_Iterator_next(Iterator *iter)
                iter->current = link->data;
        }
        else {
+               /* if this is the last object of this ListBase look at the next 
SceneCollection */
+               SceneCollection *sc;
+               
BKE_scene_collections_Iterator_next(&data->scene_collection_iter);
                do {
-                       
BKE_scene_collections_Iterator_next(&data->scene_collection_iter);
-                       SceneCollection *sc = 
data->scene_collection_iter.current;
+                       sc = data->scene_collection_iter.current;
                        /* get the first unique object of this collection */
                        LinkData *new_link = object_base_next(data->visited, 
sc->objects.first);
                        if (new_link) {
                                data->link = new_link;
                                iter->current = data->link->data;
-                               break;
+                               return;
                        }
+                       
BKE_scene_collections_Iterator_next(&data->scene_collection_iter);
                } while (data->scene_collection_iter.valid);
 
                if (!data->scene_collection_iter.valid) {
@@ -371,6 +377,9 @@ void BKE_scene_objects_Iterator_next(Iterator *iter)
 void BKE_scene_objects_Iterator_end(Iterator *iter)
 {
        SceneObjectsIteratorData *data = iter->data;
-       BKE_scene_collections_Iterator_end(&data->scene_collection_iter);
-       BLI_gset_free(data->visited, NULL);
+       if (data) {
+               
BKE_scene_collections_Iterator_end(&data->scene_collection_iter);
+               BLI_gset_free(data->visited, NULL);
+               MEM_freeN(data);
+       }
 }
diff --git a/source/blender/blenkernel/intern/layer.c 
b/source/blender/blenkernel/intern/layer.c
index 2f61ff3..671b0d8 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -353,24 +353,31 @@ void 
BKE_collection_override_datablock_add(LayerCollection *UNUSED(lc), const ch
 void BKE_selected_objects_Iterator_begin(Iterator *iter, void *data_in)
 {
        SceneLayer *sl = data_in;
-       ObjectBase *base = sl->object_bases.first;
+       ObjectBase *ob_base = sl->object_bases.first;
 
-       iter->current = base->object;
-       iter->data = base;
-       iter->valid = ((base->flag & BASE_SELECTED) != 0);
+       iter->valid = true;
+
+       if ((ob_base->flag & BASE_SELECTED) == 0) {
+               BKE_selected_objects_Iterator_next(iter);
+       }
+       else {
+               iter->current = ob_base->object;
+               iter->data = ob_base;
+       }
 }
 
 void BKE_selected_objects_Iterator_next(Iterator *iter)
 {
        ObjectBase *ob_base = ((ObjectBase *)iter->data)->next;
-       do {
+
+       while (ob_base) {
                if ((ob_base->flag & BASE_SELECTED) != 0) {
                        iter->current = ob_base->object;
                        iter->data = ob_base;
-                       iter->valid = true;
+                       return;
                }
                ob_base = ob_base->next;
-       } while (ob_base);
+       };
 
        iter->current = NULL;
        iter->valid = false;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to