[Bf-blender-cvs] [5ff3dd5d97] render-layers: Fix logic for BKE_scene_layer_base_flag_recalculate

Dalai Felinto noreply at git.blender.org
Mon Jan 16 18:01:54 CET 2017


Commit: 5ff3dd5d979bfcc1087a772fdaf6216fe3493761
Author: Dalai Felinto
Date:   Mon Jan 16 16:35:36 2017 +0100
Branches: render-layers
https://developer.blender.org/rB5ff3dd5d979bfcc1087a772fdaf6216fe3493761

Fix logic for BKE_scene_layer_base_flag_recalculate

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

M	source/blender/blenkernel/intern/layer.c
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 59c35d3f4c..89a1a054ed 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -199,21 +199,26 @@ 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)
+static void layer_collection_base_flag_recalculate(LayerCollection *lc, const bool tree_is_visible, const bool tree_is_selectable)
 {
-	*is_visible &= (lc->flag & COLLECTION_VISIBLE) != 0;
+	bool is_visible = tree_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);
+	bool is_selectable = tree_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)) {
+		if (is_visible) {
+			base->flag |= BASE_VISIBLED;
+		}
+		else {
 			base->flag &= ~BASE_VISIBLED;
 		}
 
-		if (!(*is_selectable)) {
-			base->flag &= ~BASE_SELECTED;
+		if (is_selectable) {
+			base->flag |= BASE_SELECTABLED;
+		}
+		else {
 			base->flag &= ~BASE_SELECTABLED;
 		}
 	}
@@ -228,14 +233,15 @@ static void layer_collection_base_flag_recalculate(LayerCollection *lc, bool *is
  */
 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 |= BASE_VISIBLED + BASE_SELECTABLED;
+	for (LayerCollection *lc = sl->layer_collections.first; lc; lc = lc->next) {
+		layer_collection_base_flag_recalculate(lc, true, true);
 	}
 
-	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);
+	/* if base is not selectabled, clear select */
+	for (ObjectBase *base = sl->object_bases.first; base; base = base->next) {
+		if ((base->flag & BASE_SELECTABLED) == 0) {
+			base->flag &= ~BASE_SELECTED;
+		}
 	}
 }
 
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index b67ebe2c1b..7fa0873a41 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -2270,24 +2270,28 @@ static PointerRNA rna_LayerCollection_objects_get(CollectionPropertyIterator *it
 	return rna_pointer_inherit_refine(&iter->parent, &RNA_Object, base->object);
 }
 
-static void rna_LayerCollection_hide_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
+static void rna_LayerCollection_hide_update(bContext *C, PointerRNA *ptr)
 {
+	Scene *scene = CTX_data_scene(C);
 	LayerCollection *lc = ptr->data;
-	if ((lc->flag & COLLECTION_VISIBLE) == 0) {
-		SceneLayer *sl = BKE_scene_layer_find_from_collection(scene, lc);
-		/* hide and deselect bases that are directly influenced by this LayerCollection */
-		BKE_scene_layer_base_flag_recalculate(sl);
-	}
+	SceneLayer *sl = BKE_scene_layer_find_from_collection(scene, lc);
+
+	/* hide and deselect bases that are directly influenced by this LayerCollection */
+	BKE_scene_layer_base_flag_recalculate(sl);
+	WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
 }
 
-static void rna_LayerCollection_hide_select_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
+static void rna_LayerCollection_hide_select_update(bContext *C, PointerRNA *ptr)
 {
 	LayerCollection *lc = ptr->data;
 
 	if ((lc->flag & COLLECTION_SELECTABLE) == 0) {
+		Scene *scene = CTX_data_scene(C);
 		SceneLayer *sl = BKE_scene_layer_find_from_collection(scene, lc);
+
 		/* deselect bases that are directly influenced by this LayerCollection */
 		BKE_scene_layer_base_flag_recalculate(sl);
+		WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, CTX_data_scene(C));
 	}
 }
 
@@ -5427,12 +5431,14 @@ static void rna_def_layer_collection(BlenderRNA *brna)
 	/* Flags */
 	prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", COLLECTION_VISIBLE);
+	RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
 	RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 1);
 	RNA_def_property_ui_text(prop, "Hide", "Restrict visiblity");
 	RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollection_hide_update");
 
 	prop = RNA_def_property(srna, "hide_select", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", COLLECTION_SELECTABLE);
+	RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
 	RNA_def_property_ui_icon(prop, ICON_RESTRICT_SELECT_OFF, 1);
 	RNA_def_property_ui_text(prop, "Hide Selectable", "Restrict selection");
 	RNA_def_property_update(prop, NC_SCENE | ND_LAYER_CONTENT, "rna_LayerCollection_hide_select_update");




More information about the Bf-blender-cvs mailing list