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