[Bf-blender-cvs] [f2db6cefa08] blender2.8: Layer collection enable flag

Dalai Felinto noreply at git.blender.org
Wed Sep 20 14:23:11 CEST 2017


Commit: f2db6cefa0869fe474b4fbbb467d63bff8c0935b
Author: Dalai Felinto
Date:   Wed Sep 20 14:15:35 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBf2db6cefa0869fe474b4fbbb467d63bff8c0935b

Layer collection enable flag

Right now this is exposed in the outliner, though all this
(visible/selectable/enable) should be moved to a new panel soon.

This removes objects from the depsgraph when the collection is disabled.

It allows you to "hide" lamps but still having them lighting the scene.
Same for light probes and other support objects.

Pending tasks:

* Have depsgraph to include invisible objects in the DEG_OBJECTS_ITER, and
then have Eevee and other engines to make a distinction between an
invisible and a visible object.

(for example, we probably want invisible objects to not show in the
viewport, but cast shadows and show up in light probes).

* Change how we evaluate collection settings so that an invisible
collection can force an object to be invisible.

Reviewers: campbellbarton

Subscribers: sergey

Differential Revision: https://developer.blender.org/D2848

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/layer.c
M	source/blender/editors/space_outliner/outliner_collections.c
M	source/blender/editors/space_outliner/outliner_draw.c
M	source/blender/editors/space_outliner/outliner_intern.h
M	source/blender/editors/space_outliner/outliner_ops.c
M	source/blender/makesdna/DNA_layer_types.h
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index 5f95a69ed1e..52d5405ec0a 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -81,6 +81,7 @@ struct LayerCollection *BKE_layer_collection_get_active_ensure(struct Scene *sce
 
 int BKE_layer_collection_count(struct SceneLayer *sl);
 
+struct LayerCollection *BKE_layer_collection_from_index(struct SceneLayer *sl, const int index);
 int BKE_layer_collection_findindex(struct SceneLayer *sl, const struct LayerCollection *lc);
 
 bool BKE_layer_collection_move_above(const struct Scene *scene, struct LayerCollection *lc_dst, struct LayerCollection *lc_src);
@@ -93,6 +94,9 @@ struct LayerCollection *BKE_collection_link(struct SceneLayer *sl, struct SceneC
 
 void BKE_collection_unlink(struct SceneLayer *sl, struct LayerCollection *lc);
 
+void BKE_collection_enable(struct SceneLayer *sl, struct LayerCollection *lc);
+void BKE_collection_disable(struct SceneLayer *sl, struct LayerCollection *lc);
+
 bool BKE_scene_layer_has_collection(struct SceneLayer *sl, const struct SceneCollection *sc);
 bool BKE_scene_has_object(struct Scene *scene, struct Object *ob);
 
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 16a4477977f..5d0cb6ae430 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -57,6 +57,7 @@
 /* prototype */
 struct EngineSettingsCB_Type;
 static void layer_collection_free(SceneLayer *sl, LayerCollection *lc);
+static void layer_collection_objects_populate(SceneLayer *sl, LayerCollection *lc, ListBase *objects);
 static LayerCollection *layer_collection_add(SceneLayer *sl, LayerCollection *parent, SceneCollection *sc);
 static LayerCollection *find_layer_collection_by_scene_collection(LayerCollection *lc, const SceneCollection *sc);
 static IDProperty *collection_engine_settings_create(struct EngineSettingsCB_Type *ces_type, const bool populate);
@@ -288,11 +289,7 @@ static Base *object_base_add(SceneLayer *sl, Object *ob)
 
 /* LayerCollection */
 
-/**
- * When freeing the entire SceneLayer at once we don't bother with unref
- * otherwise SceneLayer is passed to keep the syncing of the LayerCollection tree
- */
-static void layer_collection_free(SceneLayer *sl, LayerCollection *lc)
+static void layer_collection_objects_unpopulate(SceneLayer *sl, LayerCollection *lc)
 {
 	if (sl) {
 		for (LinkData *link = lc->object_bases.first; link; link = link->next) {
@@ -301,6 +298,15 @@ static void layer_collection_free(SceneLayer *sl, LayerCollection *lc)
 	}
 
 	BLI_freelistN(&lc->object_bases);
+}
+
+/**
+ * When freeing the entire SceneLayer at once we don't bother with unref
+ * otherwise SceneLayer is passed to keep the syncing of the LayerCollection tree
+ */
+static void layer_collection_free(SceneLayer *sl, LayerCollection *lc)
+{
+	layer_collection_objects_unpopulate(sl, lc);
 	BLI_freelistN(&lc->overrides);
 
 	if (lc->properties) {
@@ -352,6 +358,15 @@ static LayerCollection *collection_from_index(ListBase *lb, const int number, in
 }
 
 /**
+ * Get the collection for a given index
+ */
+LayerCollection *BKE_layer_collection_from_index(SceneLayer *sl, const int index)
+{
+	int i = 0;
+	return collection_from_index(&sl->layer_collections, index, &i);
+}
+
+/**
  * Get the active collection
  */
 LayerCollection *BKE_layer_collection_get_active(SceneLayer *sl)
@@ -797,6 +812,60 @@ void BKE_collection_unlink(SceneLayer *sl, LayerCollection *lc)
 	sl->active_collection = 0;
 }
 
+/**
+ * Recursively enable nested collections
+ */
+static void layer_collection_enable(SceneLayer *sl, LayerCollection *lc)
+{
+	layer_collection_objects_populate(sl, lc, &lc->scene_collection->objects);
+
+	for (LayerCollection *nlc = lc->layer_collections.first; nlc; nlc = nlc->next) {
+		layer_collection_enable(sl, nlc);
+	}
+}
+
+/**
+ * Enable collection
+ * Add its objects bases to SceneLayer
+ * Depsgraph needs to be rebuilt afterwards
+ */
+void BKE_collection_enable(SceneLayer *sl, LayerCollection *lc)
+{
+	if ((lc->flag & COLLECTION_DISABLED) == 0) {
+		return;
+	}
+
+	lc->flag &= ~COLLECTION_DISABLED;
+	layer_collection_enable(sl, lc);
+}
+
+/**
+ * Recursively disable nested collections
+ */
+static void layer_collection_disable(SceneLayer *sl, LayerCollection *lc)
+{
+	layer_collection_objects_unpopulate(sl, lc);
+
+	for (LayerCollection *nlc = lc->layer_collections.first; nlc; nlc = nlc->next) {
+		layer_collection_disable(sl, nlc);
+	}
+}
+
+/**
+ * Disable collection
+ * Remove all its object bases from SceneLayer
+ * Depsgraph needs to be rebuilt afterwards
+ */
+void BKE_collection_disable(SceneLayer *sl, LayerCollection *lc)
+{
+	if ((lc->flag & COLLECTION_DISABLED) != 0) {
+		return;
+	}
+
+	lc->flag |= COLLECTION_DISABLED;
+	layer_collection_disable(sl, lc);
+}
+
 static void layer_collection_object_add(SceneLayer *sl, LayerCollection *lc, Object *ob)
 {
 	Base *base = object_base_add(sl, ob);
diff --git a/source/blender/editors/space_outliner/outliner_collections.c b/source/blender/editors/space_outliner/outliner_collections.c
index 2db87df8809..092909cbcba 100644
--- a/source/blender/editors/space_outliner/outliner_collections.c
+++ b/source/blender/editors/space_outliner/outliner_collections.c
@@ -27,6 +27,7 @@
 #include "BKE_context.h"
 #include "BKE_collection.h"
 #include "BKE_layer.h"
+#include "BKE_main.h"
 #include "BKE_report.h"
 
 #include "DEG_depsgraph.h"
@@ -403,6 +404,82 @@ void OUTLINER_OT_collection_select(wmOperatorType *ot)
 	            "Index of collection to select", 0, INT_MAX);
 }
 
+#define ACTION_DISABLE 0
+#define ACTION_ENABLE 1
+#define ACTION_TOGGLE 2
+
+static int collection_toggle_exec(bContext *C, wmOperator *op)
+{
+	Main *bmain = CTX_data_main(C);
+	Scene *scene = CTX_data_scene(C);
+	SceneLayer *scene_layer = CTX_data_scene_layer(C);
+	int action = RNA_enum_get(op->ptr, "action");
+	LayerCollection *layer_collection = CTX_data_layer_collection(C);
+
+	if (layer_collection->flag & COLLECTION_DISABLED) {
+		if (ELEM(action, ACTION_TOGGLE, ACTION_ENABLE)) {
+			BKE_collection_enable(scene_layer, layer_collection);
+		}
+		else { /* ACTION_DISABLE */
+			BKE_reportf(op->reports, RPT_ERROR, "Layer collection %s already disabled",
+			            layer_collection->scene_collection->name);
+			return OPERATOR_CANCELLED;
+		}
+	}
+	else {
+		if (ELEM(action, ACTION_TOGGLE, ACTION_DISABLE)) {
+			BKE_collection_disable(scene_layer, layer_collection);
+		}
+		else { /* ACTION_ENABLE */
+			BKE_reportf(op->reports, RPT_ERROR, "Layer collection %s already enabled",
+			            layer_collection->scene_collection->name);
+			return OPERATOR_CANCELLED;
+		}
+	}
+
+	DEG_relations_tag_update(bmain);
+	/* TODO(sergey): Use proper flag for tagging here. */
+	DEG_id_tag_update(&scene->id, 0);
+
+	WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
+	WM_event_add_notifier(C, NC_SCENE | ND_LAYER_CONTENT, scene);
+
+	return OPERATOR_FINISHED;
+}
+
+void OUTLINER_OT_collection_toggle(wmOperatorType *ot)
+{
+	PropertyRNA *prop;
+
+	static EnumPropertyItem actions_items[] = {
+		{ACTION_DISABLE, "DISABLE", 0, "Disable", "Disable selected markers"},
+		{ACTION_ENABLE, "ENABLE", 0, "Enable", "Enable selected markers"},
+		{ACTION_TOGGLE, "TOGGLE", 0, "Toggle", "Toggle disabled flag for selected markers"},
+		{0, NULL, 0, NULL, NULL}
+	};
+
+	/* identifiers */
+	ot->name = "Toggle Collection";
+	ot->idname = "OUTLINER_OT_collection_toggle";
+	ot->description = "Deselect collection objects";
+
+	/* api callbacks */
+	ot->exec = collection_toggle_exec;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+	/* properties */
+	prop = RNA_def_int(ot->srna, "collection_index", -1, -1, INT_MAX, "Collection Index", "Index of collection to toggle", 0, INT_MAX);
+	RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+	prop = RNA_def_enum(ot->srna, "action", actions_items, ACTION_TOGGLE, "Action", "Selection action to execute");
+	RNA_def_property_flag(prop, PROP_SKIP_SAVE);
+}
+
+#undef ACTION_TOGGLE
+#undef ACTION_ENABLE
+#undef ACTION_DISABLE
+
 /* -------------------------------------------------------------------- */
 
 static int stubs_invoke(bContext *UNUSED(C), wmOperator *op, const wmEvent *UNUSED(event))
diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c
index de820114159..c2414ec6413 100644
--- a/source/blender/editors/space_outliner/outliner_draw.c
+++ b/source/blender/editors/space_outliner/outliner_draw.c
@@ -59,6 +59,7 @@
 #include "BKE_object.h"
 
 #include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
 
 #include "ED_armature.h"
 #include "ED_keyframing.h"
@@ -246,6 +247,30 @@ static void restrictbutton_gp_layer_flag_cb(bContext *C, void *UNUSED(poin), voi
 	WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
 }
 
+static void enablebutton_collection_flag_cb(bContext *C, void *poin, void *poin2)
+{
+	Main *bmain = CTX_data_main(C);
+	Scene *scene = poin;
+	LayerCollection *layer_collection = poin2;
+	SceneLayer *scene_layer = BKE_scene_layer_find_from_collection(scene, layer_collection);
+
+	/* We need to toggle the flag since this is called after the flag is already set. */
+	layer_collection->flag ^= COLLECTION_DISABLED;
+
+	if (layer_collection->flag & COLLECTION_DISABLED) {
+		BKE_collection_enable(scene_layer, layer_collection);
+	}
+	else {
+		BKE_collection_disable(scene_layer, layer_collection);
+	}
+
+	DEG_relations_tag_update(bmain);
+	/* TODO(sergey): Use proper flag for tagging here. */
+	DEG_id_tag_update(&scene->id, 0);
+	WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
+	WM_event_add_notifier(C, NC_SCENE | ND_LAYER_CONTENT, NULL);
+}
+
 static void restrictbutton_collection_flag_cb(bContext *C, void *poin, void *UNUSED(poin2))
 {
 	Scene *scene = poin;
@@ -559,8 +584,18 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
 			else if (tselem->type == TSE_LAYER_COLLECTION) {
 				LayerCollection *collection = te->directdata;
 
+				const bool is_enabled = (collection->flag & COLLECTION_DISABLED) == 0;
+
 				UI_block_emboss_set(block, UI_E

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list