[Bf-blender-cvs] [bd14352a01] render-layers: object/base iterator refactor + add FOREACH_VISIBLE_BASE

Dalai Felinto noreply at git.blender.org
Thu Jan 19 18:28:19 CET 2017


Commit: bd14352a01e5573d13e089b5957e8cd60a07c0e7
Author: Dalai Felinto
Date:   Thu Jan 19 12:07:12 2017 +0100
Branches: render-layers
https://developer.blender.org/rBbd14352a01e5573d13e089b5957e8cd60a07c0e7

object/base iterator refactor + add FOREACH_VISIBLE_BASE

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/layer.c

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 9ae9cdb3e3..b92624e0f0 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -101,6 +101,10 @@ void BKE_visible_objects_Iterator_begin(Iterator *iter, void *data_in);
 void BKE_visible_objects_Iterator_next(Iterator *iter);
 void BKE_visible_objects_Iterator_end(Iterator *iter);
 
+void BKE_visible_bases_Iterator_begin(Iterator *iter, void *data_in);
+void BKE_visible_bases_Iterator_next(Iterator *iter);
+void BKE_visible_bases_Iterator_end(Iterator *iter);
+
 #define FOREACH_SELECTED_OBJECT(sl, _ob)                                      \
 	ITER_BEGIN(BKE_selected_objects_Iterator_begin,                           \
 	           BKE_selected_objects_Iterator_next,                            \
@@ -119,6 +123,17 @@ void BKE_visible_objects_Iterator_end(Iterator *iter);
 #define FOREACH_VISIBLE_OBJECT_END                                            \
 	ITER_END
 
+
+#define FOREACH_VISIBLE_BASE(sl, _object_base)                                \
+	ITER_BEGIN(BKE_visible_bases_Iterator_begin,                              \
+	           BKE_visible_bases_Iterator_next,                               \
+	           BKE_visible_bases_Iterator_end,                                \
+	           sl, _object_base)
+
+#define FOREACH_VISIBLE_BASE_END                                              \
+	ITER_END
+
+
 #define FOREACH_OBJECT(sl, _ob)                                               \
 {                                                                             \
 	ObjectBase *base;                                                         \
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index d93d7526c6..40cba30437 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -47,6 +47,7 @@
 static void layer_collection_free(SceneLayer *sl, LayerCollection *lc);
 static LayerCollection *layer_collection_add(SceneLayer *sl, ListBase *lb, SceneCollection *sc);
 static LayerCollection *find_layer_collection_by_scene_collection(LayerCollection *lc, const SceneCollection *sc);
+static void object_bases_Iterator_next(Iterator *iter, const int flag);
 
 /* RenderLayer */
 
@@ -570,7 +571,7 @@ void BKE_collection_override_datablock_add(LayerCollection *UNUSED(lc), const ch
 /* ---------------------------------------------------------------------- */
 /* Iterators */
 
-void BKE_selected_objects_Iterator_begin(Iterator *iter, void *data_in)
+static void object_bases_Iterator_begin(Iterator *iter, void *data_in, const int flag)
 {
 	SceneLayer *sl = data_in;
 	ObjectBase *base = sl->object_bases.first;
@@ -584,76 +585,90 @@ void BKE_selected_objects_Iterator_begin(Iterator *iter, void *data_in)
 	iter->valid = true;
 	iter->data = base;
 
-	if ((base->flag & BASE_SELECTED) == 0) {
-		BKE_selected_objects_Iterator_next(iter);
+	if ((base->flag & flag) == 0) {
+		object_bases_Iterator_next(iter, flag);
 	}
 	else {
-		iter->current = base->object;
+		iter->current = base;
 	}
 }
 
-void BKE_selected_objects_Iterator_next(Iterator *iter)
+static void object_bases_Iterator_next(Iterator *iter, const int flag)
 {
 	ObjectBase *base = ((ObjectBase *)iter->data)->next;
 
 	while (base) {
-		if ((base->flag & BASE_SELECTED) != 0) {
-			iter->current = base->object;
+		if ((base->flag & flag) != 0) {
+			iter->current = base;
 			iter->data = base;
 			return;
 		}
 		base = base->next;
-	};
+	}
 
 	iter->current = NULL;
 	iter->valid = false;
 }
 
-void BKE_selected_objects_Iterator_end(Iterator *UNUSED(iter))
+static void objects_Iterator_begin(Iterator *iter, void *data_in, const int flag)
 {
-	/* do nothing */
+	object_bases_Iterator_begin(iter, data_in, flag);
+
+	if (iter->valid) {
+		iter->current = ((ObjectBase *)iter->current)->object;
+	}
 }
 
-void BKE_visible_objects_Iterator_begin(Iterator *iter, void *data_in)
+static void objects_Iterator_next(Iterator *iter, const int flag)
 {
-	SceneLayer *sl = data_in;
-	ObjectBase *base = sl->object_bases.first;
+	object_bases_Iterator_next(iter, flag);
 
-	/* when there are no objects */
-	if (base ==  NULL) {
-		iter->valid = false;
-		return;
+	if (iter->valid) {
+		iter->current = ((ObjectBase *)iter->current)->object;
 	}
+}
 
-	iter->valid = true;
-	iter->data = base;
+void BKE_selected_objects_Iterator_begin(Iterator *iter, void *data_in)
+{
+	objects_Iterator_begin(iter, data_in, BASE_SELECTED);
+}
 
-	if ((base->flag & BASE_VISIBLED) == 0) {
-		BKE_selected_objects_Iterator_next(iter);
-	}
-	else {
-		iter->current = base->object;
-	}
+void BKE_selected_objects_Iterator_next(Iterator *iter)
+{
+	object_bases_Iterator_next(iter, BASE_SELECTED);
 }
 
-void BKE_visible_objects_Iterator_next(Iterator *iter)
+void BKE_selected_objects_Iterator_end(Iterator *UNUSED(iter))
 {
-	ObjectBase *base = ((ObjectBase *)iter->data)->next;
+	/* do nothing */
+}
 
-	while (base) {
-		if ((base->flag & BASE_VISIBLED) != 0) {
-			iter->current = base->object;
-			iter->data = base;
-			return;
-		}
-		base = base->next;
-	};
+void BKE_visible_objects_Iterator_begin(Iterator *iter, void *data_in)
+{
+	objects_Iterator_begin(iter, data_in, BASE_VISIBLED);
+}
 
-	iter->current = NULL;
-	iter->valid = false;
+void BKE_visible_objects_Iterator_next(Iterator *iter)
+{
+	objects_Iterator_next(iter, BASE_VISIBLED);
 }
 
 void BKE_visible_objects_Iterator_end(Iterator *UNUSED(iter))
 {
 	/* do nothing */
 }
+
+void BKE_visible_bases_Iterator_begin(Iterator *iter, void *data_in)
+{
+	object_bases_Iterator_begin(iter, data_in, BASE_VISIBLED);
+}
+
+void BKE_visible_bases_Iterator_next(Iterator *iter)
+{
+	object_bases_Iterator_next(iter, BASE_VISIBLED);
+}
+
+void BKE_visible_bases_Iterator_end(Iterator *UNUSED(iter))
+{
+	/* do nothing */
+}




More information about the Bf-blender-cvs mailing list