[Bf-blender-cvs] [42bb135] render-layers: Fresh morning fixup of iterator logics

Dalai Felinto noreply at git.blender.org
Tue Dec 20 10:42:45 CET 2016


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;




More information about the Bf-blender-cvs mailing list