[Bf-blender-cvs] [0ad3979a6c] render-layers: Implement update of selected/visible based on collection tree
Dalai Felinto
noreply at git.blender.org
Mon Jan 16 10:54:43 CET 2017
Commit: 0ad3979a6ce57efc57ec1afea1931074faaf3df1
Author: Dalai Felinto
Date: Mon Jan 16 10:54:34 2017 +0100
Branches: render-layers
https://developer.blender.org/rB0ad3979a6ce57efc57ec1afea1931074faaf3df1
Implement update of selected/visible based on collection tree
===================================================================
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 25e67e7192..6563014a2b 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -38,7 +38,6 @@ extern "C" {
#define TODO_LAYER_OVERRIDE /* CollectionOverride */
#define TODO_LAYER_CONTEXT /* get/set current (context) SceneLayer */
#define TODO_LAYER_BASE /* Base to ObjectBase related TODO */
-#define TODO_LAYER_TREE /* evaluation of scene layer tree */
#define TODO_LAYER /* generic todo */
struct LayerCollection;
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index b78dcbd6e8..81facb75d7 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -197,6 +197,29 @@ static void scene_layer_object_base_unref(SceneLayer* sl, ObjectBase *base)
}
}
+static void layer_collection_base_flag_recalculate(LayerCollection *lc, bool *is_visible, bool *is_selectable)
+{
+ *is_visible &= (lc->flag & COLLECTION_VISIBLE) != 0;
+ /* an object can only be selected if it's visible */
+ *is_selectable &= *is_visible && ((lc->flag & COLLECTION_SELECTABLE) != 0);
+
+ for (LinkData *link = lc->object_bases.first; link; link = link->next) {
+ ObjectBase *base = link->data;
+
+ if (!*is_visible) {
+ base->flag &= ~BASE_VISIBLE;
+ }
+
+ if (!*is_selectable) {
+ base->flag &= ~BASE_SELECTED;
+ }
+ }
+
+ for (LayerCollection *lcn = lc->layer_collections.first; lcn; lcn = lcn->next) {
+ layer_collection_base_flag_recalculate(lcn, is_visible, is_selectable);
+ }
+}
+
/**
* Re-evaluate the ObjectBase flags for SceneLayer
*/
@@ -204,9 +227,13 @@ void BKE_scene_layer_base_flag_recalculate(SceneLayer *sl)
{
/* tranverse the entire tree and update ObjectBase flags */
for (ObjectBase *base = sl->object_bases.first; base; base = base->next) {
- base->flag = 0;
+ base->flag |= BASE_VISIBLE;
+ }
+
+ for (LayerCollection *lc = sl->layer_collections.first; lc; lc = lc->next) {
+ bool is_visible = true, is_selectable = true;
+ layer_collection_base_flag_recalculate(lc, &is_visible, &is_selectable);
}
- TODO_LAYER_TREE
}
/**
More information about the Bf-blender-cvs
mailing list