[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