[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