[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