[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