[Bf-blender-cvs] [baad441362] render-layers: FOREACH_VISIBLE_OBJECT macro

Dalai Felinto noreply at git.blender.org
Fri Jan 13 18:34:29 CET 2017


Commit: baad4413625f09b6fb321cde1b98de95e5829b38
Author: Dalai Felinto
Date:   Fri Jan 13 16:59:13 2017 +0100
Branches: render-layers
https://developer.blender.org/rBbaad4413625f09b6fb321cde1b98de95e5829b38

FOREACH_VISIBLE_OBJECT macro

Also adding a new flag value for ObjectBase to store visibility.

I still need this to be synced, but the idea is to centralize the
logic of tree evluation, and keep the visibility cached.

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

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

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 2acea6ebd1..25e67e7192 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -94,6 +94,10 @@ void BKE_selected_objects_Iterator_begin(Iterator *iter, void *data_in);
 void BKE_selected_objects_Iterator_next(Iterator *iter);
 void BKE_selected_objects_Iterator_end(Iterator *iter);
 
+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);
+
 #define FOREACH_SELECTED_OBJECT(sl, _ob)                                      \
 	ITER_BEGIN(BKE_selected_objects_Iterator_begin,                           \
 	           BKE_selected_objects_Iterator_next,                            \
@@ -103,6 +107,15 @@ void BKE_selected_objects_Iterator_end(Iterator *iter);
 #define FOREACH_SELECTED_OBJECT_END                                           \
 	ITER_END
 
+#define FOREACH_VISIBLE_OBJECT(sl, _ob)                                       \
+	ITER_BEGIN(BKE_visible_objects_Iterator_begin,                            \
+	           BKE_visible_objects_Iterator_next,                             \
+	           BKE_visible_objects_Iterator_end,                              \
+	           sl, _ob)
+
+#define FOREACH_VISIBLE_OBJECT_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 90797d34bb..b78dcbd6e8 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -500,6 +500,7 @@ void BKE_collection_override_datablock_add(LayerCollection *UNUSED(lc), const ch
 	TODO_LAYER_OVERRIDE;
 }
 
+/* ---------------------------------------------------------------------- */
 /* Iterators */
 
 void BKE_selected_objects_Iterator_begin(Iterator *iter, void *data_in)
@@ -545,3 +546,47 @@ void BKE_selected_objects_Iterator_end(Iterator *UNUSED(iter))
 {
 	/* do nothing */
 }
+
+void BKE_visible_objects_Iterator_begin(Iterator *iter, void *data_in)
+{
+	SceneLayer *sl = data_in;
+	ObjectBase *base = sl->object_bases.first;
+
+	/* when there are no objects */
+	if (base ==  NULL) {
+		iter->valid = false;
+		return;
+	}
+
+	iter->valid = true;
+	iter->data = base;
+
+	if ((base->flag & BASE_VISIBLE) == 0) {
+		BKE_selected_objects_Iterator_next(iter);
+	}
+	else {
+		iter->current = base->object;
+	}
+}
+
+void BKE_visible_objects_Iterator_next(Iterator *iter)
+{
+	ObjectBase *base = ((ObjectBase *)iter->data)->next;
+
+	while (base) {
+		if ((base->flag & BASE_VISIBLE) != 0) {
+			iter->current = base->object;
+			iter->data = base;
+			return;
+		}
+		base = base->next;
+	};
+
+	iter->current = NULL;
+	iter->valid = false;
+}
+
+void BKE_visible_objects_Iterator_end(Iterator *UNUSED(iter))
+{
+	/* do nothing */
+}
diff --git a/source/blender/makesdna/DNA_layer_types.h b/source/blender/makesdna/DNA_layer_types.h
index 63856d9d3c..31230cf61d 100644
--- a/source/blender/makesdna/DNA_layer_types.h
+++ b/source/blender/makesdna/DNA_layer_types.h
@@ -80,6 +80,7 @@ typedef struct SceneCollection {
 /* ObjectBase->flag */
 enum {
 	BASE_SELECTED         = (1 << 0),
+	BASE_VISIBLE          = (1 << 1),
 };
 
 /* LayerCollection->flag */




More information about the Bf-blender-cvs mailing list