[Bf-blender-cvs] [b0077992d27] blender2.8: Cycles: add per layer collection mask/holdout support.

Brecht Van Lommel noreply at git.blender.org
Wed Jul 25 16:00:00 CEST 2018


Commit: b0077992d2759b29b536187a226e8382b72261b6
Author: Brecht Van Lommel
Date:   Wed Jul 25 12:26:09 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBb0077992d2759b29b536187a226e8382b72261b6

Cycles: add per layer collection mask/holdout support.

In the outliner, right click > view layer > set holdout. This is
temporary until we have more general dynamic overrides, but helps
Spring production for now.

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

M	intern/cycles/blender/blender_object.cpp
M	intern/cycles/blender/blender_sync.h
M	release/scripts/startup/bl_ui/space_outliner.py
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/editors/space_outliner/outliner_collections.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_layer.c
M	source/blender/makesrna/intern/rna_object_api.c

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

diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index 56365d12bab..fd8790c0c79 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -291,6 +291,7 @@ void BlenderSync::sync_background_light(bool use_portal)
 /* Object */
 
 Object *BlenderSync::sync_object(BL::Depsgraph& b_depsgraph,
+                                 BL::ViewLayer& b_view_layer,
                                  BL::DepsgraphObjectInstance& b_instance,
                                  float motion_time,
                                  bool hide_tris,
@@ -345,7 +346,8 @@ Object *BlenderSync::sync_object(BL::Depsgraph& b_depsgraph,
 
 	/* Visibility flags for both parent and child. */
 	PointerRNA cobject = RNA_pointer_get(&b_ob.ptr, "cycles");
-	bool use_holdout = get_boolean(cobject, "is_holdout");
+	bool use_holdout = get_boolean(cobject, "is_holdout") ||
+	                   b_ob.holdout_get(b_view_layer);
 	uint visibility = object_ray_visibility(b_ob) & PATH_RAY_ALL_VISIBILITY;
 
 	if(b_parent.ptr.data != b_ob.ptr.data) {
@@ -588,6 +590,7 @@ void BlenderSync::sync_objects(BL::Depsgraph& b_depsgraph, float motion_time)
 	bool cancel = false;
 	bool use_portal = false;
 
+	BL::ViewLayer b_view_layer = b_depsgraph.view_layer_eval();
 	BL::Depsgraph::mode_enum depsgraph_mode = b_depsgraph.mode();
 
 	BL::Depsgraph::object_instances_iterator b_instance_iter;
@@ -609,6 +612,7 @@ void BlenderSync::sync_objects(BL::Depsgraph& b_depsgraph, float motion_time)
 		 if(!object_render_hide(b_ob, true, true, hide_tris, depsgraph_mode)) {
 			/* object itself */
 			sync_object(b_depsgraph,
+			            b_view_layer,
 			            b_instance,
 			            motion_time,
 			            hide_tris,
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index ba3f5e6428f..e63ef9e5e47 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -78,8 +78,6 @@ public:
 	void sync_view(BL::SpaceView3D& b_v3d,
 	               BL::RegionView3D& b_rv3d,
 	               int width, int height);
-	inline int get_layer_samples() { return view_layer.samples; }
-	inline int get_layer_bound_samples() { return view_layer.bound_samples; }
 
 	/* get parameters */
 	static SceneParams get_scene_params(BL::Scene& b_scene,
@@ -126,6 +124,7 @@ private:
 	                 bool motion,
 	                 int motion_step = 0);
 	Object *sync_object(BL::Depsgraph& b_depsgraph,
+	                    BL::ViewLayer& b_view_layer,
 	                    BL::DepsgraphObjectInstance& b_instance,
 	                    float motion_time,
 	                    bool hide_tris,
diff --git a/release/scripts/startup/bl_ui/space_outliner.py b/release/scripts/startup/bl_ui/space_outliner.py
index 8f722c4d3ce..284a49c8789 100644
--- a/release/scripts/startup/bl_ui/space_outliner.py
+++ b/release/scripts/startup/bl_ui/space_outliner.py
@@ -142,8 +142,12 @@ class OUTLINER_MT_collection_view_layer(Menu):
 
         space = context.space_data
 
-        layout.operator("outliner.collection_exclude_set", text="Exclude")
-        layout.operator("outliner.collection_include_set", text="Include")
+        layout.operator("outliner.collection_exclude_set")
+        layout.operator("outliner.collection_exclude_clear")
+
+        if context.engine == 'CYCLES':
+            layout.operator("outliner.collection_holdout_set")
+            layout.operator("outliner.collection_holdout_clear")
 
 
 class OUTLINER_MT_collection(Menu):
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 2f5c8e7817e..73a217b8865 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -715,6 +715,11 @@ static int layer_collection_sync(
 				lc->runtime_flag |= LAYER_COLLECTION_HAS_VISIBLE_OBJECTS;
 			}
 
+			/* Holdout */
+			if (lc->flag & LAYER_COLLECTION_HOLDOUT) {
+				base->flag |= BASE_HOLDOUT;
+			}
+
 			lc->runtime_flag |= LAYER_COLLECTION_HAS_OBJECTS;
 		}
 
@@ -750,7 +755,12 @@ void BKE_layer_collection_sync(const Scene *scene, ViewLayer *view_layer)
 
 	/* Clear visible and selectable flags to be reset. */
 	for (Base *base = view_layer->object_bases.first; base; base = base->next) {
-		base->flag &= ~(BASE_VISIBLE | BASE_ENABLED | BASE_SELECTABLE | BASE_ENABLED_VIEWPORT | BASE_ENABLED_RENDER);
+		base->flag &= ~(BASE_VISIBLE |
+		                BASE_ENABLED |
+		                BASE_SELECTABLE |
+		                BASE_ENABLED_VIEWPORT |
+		                BASE_ENABLED_RENDER |
+		                BASE_HOLDOUT);
 	}
 
 	view_layer->runtime_flag = 0;
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 3a586e49ab3..94afc410000 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -492,6 +492,7 @@ static void do_version_layers_to_collections(Main *bmain, Scene *scene)
 				{
 					if (srl->lay_zmask & (1 << layer)) {
 						have_override = true;
+						lc->flag |= LAYER_COLLECTION_HOLDOUT;
 
 						BKE_override_layer_collection_boolean_add(
 						        lc,
diff --git a/source/blender/editors/space_outliner/outliner_collections.c b/source/blender/editors/space_outliner/outliner_collections.c
index ad94615a0d2..eec1d654944 100644
--- a/source/blender/editors/space_outliner/outliner_collections.c
+++ b/source/blender/editors/space_outliner/outliner_collections.c
@@ -574,7 +574,7 @@ static TreeTraversalAction layer_collection_find_data_to_edit(TreeElement *te, v
 	return TRAVERSE_CONTINUE;
 }
 
-static bool collections_view_layer_poll(bContext *C, bool include)
+static bool collections_view_layer_poll(bContext *C, bool clear, int flag)
 {
 	/* Poll function so the right click menu show current state of selected collections. */
 	SpaceOops *soops = CTX_wm_space_outliner(C);
@@ -593,10 +593,10 @@ static bool collections_view_layer_poll(bContext *C, bool include)
 	GSET_ITER(collections_to_edit_iter, data.collections_to_edit) {
 		LayerCollection *lc = BLI_gsetIterator_getKey(&collections_to_edit_iter);
 
-		if (include && (lc->flag & LAYER_COLLECTION_EXCLUDE)) {
+		if (clear && (lc->flag & flag)) {
 			result = true;
 		}
-		else if (!include && !(lc->flag & LAYER_COLLECTION_EXCLUDE)) {
+		else if (!clear && !(lc->flag & flag)) {
 			result = true;
 		}
 	}
@@ -605,27 +605,37 @@ static bool collections_view_layer_poll(bContext *C, bool include)
 	return result;
 }
 
-static bool collections_exclude_poll(bContext *C)
+static bool collections_exclude_set_poll(bContext *C)
 {
-	return collections_view_layer_poll(C, false);
+	return collections_view_layer_poll(C, false, LAYER_COLLECTION_EXCLUDE);
 }
 
-static bool collections_include_poll(bContext *C)
+static bool collections_exclude_clear_poll(bContext *C)
 {
-	return collections_view_layer_poll(C, true);
+	return collections_view_layer_poll(C, true, LAYER_COLLECTION_EXCLUDE);
 }
 
-static void layer_collection_exclude_recursive_set(LayerCollection *lc)
+static bool collections_holdout_set_poll(bContext *C)
+{
+	return collections_view_layer_poll(C, false, LAYER_COLLECTION_HOLDOUT);
+}
+
+static bool collections_holdout_clear_poll(bContext *C)
+{
+	return collections_view_layer_poll(C, true, LAYER_COLLECTION_HOLDOUT);
+}
+
+static void layer_collection_flag_recursive_set(LayerCollection *lc, int flag)
 {
 	for (LayerCollection *nlc = lc->layer_collections.first; nlc; nlc = nlc->next) {
-		if (lc->flag & LAYER_COLLECTION_EXCLUDE) {
-			nlc->flag |= LAYER_COLLECTION_EXCLUDE;
+		if (lc->flag & flag) {
+			nlc->flag |= flag;
 		}
 		else {
-			nlc->flag &= ~LAYER_COLLECTION_EXCLUDE;
+			nlc->flag &= ~flag;
 		}
 
-		layer_collection_exclude_recursive_set(nlc);
+		layer_collection_flag_recursive_set(nlc, flag);
 	}
 }
 
@@ -636,7 +646,8 @@ static int collection_view_layer_exec(bContext *C, wmOperator *op)
 	ViewLayer *view_layer = CTX_data_view_layer(C);
 	SpaceOops *soops = CTX_wm_space_outliner(C);
 	struct CollectionEditData data = {.scene = scene, .soops = soops};
-	bool include = STREQ(op->idname, "OUTLINER_OT_collection_include_set");
+	bool clear = strstr(op->idname, "clear") != NULL;
+	int flag = strstr(op->idname, "holdout") ? LAYER_COLLECTION_HOLDOUT : LAYER_COLLECTION_EXCLUDE;
 
 	data.collections_to_edit = BLI_gset_ptr_new(__func__);
 
@@ -647,14 +658,14 @@ static int collection_view_layer_exec(bContext *C, wmOperator *op)
 		LayerCollection *lc = BLI_gsetIterator_getKey(&collections_to_edit_iter);
 
 		if (!(lc->collection->flag & COLLECTION_IS_MASTER)) {
-			if (include) {
-				lc->flag &= ~LAYER_COLLECTION_EXCLUDE;
+			if (clear) {
+				lc->flag &= ~flag;
 			}
 			else {
-				lc->flag |= LAYER_COLLECTION_EXCLUDE;
+				lc->flag |= flag;
 			}
 
-			layer_collection_exclude_recursive_set(lc);
+			layer_collection_flag_recursive_set(lc, flag);
 		}
 	}
 
@@ -671,28 +682,58 @@ static int collection_view_layer_exec(bContext *C, wmOperator *op)
 void OUTLINER_OT_collection_exclude_set(wmOperatorType *ot)
 {
 	/* identifiers */
-	ot->name = "Exclude from View Layer";
+	ot->name = "Set Exclude";
 	ot->idname = "OUTLINER_OT_collection_exclude_set";
 	ot->description = "Exclude collection from the active view layer";
 
 	/* api callbacks */
 	ot->exec = collection_view_layer_exec;
-	ot->poll = collections_exclude_poll;
+	ot->poll = collections_exclude_set_poll;
 
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
 
-void OUTLINER_OT_collection_include_set(wmOperatorType *ot)
+void OUTLINER_OT_collection_exclude_clear(wmOperatorType *ot)
 {
 	/* identifiers */
-	ot->name = "Include in View Layer";
-	ot->idname = "OUTLINER_OT_collection_include_set";
+	ot->name = "Clear Exclude";
+	ot->idname = "OUTLINER_OT_collection_exclude_clear";
 	ot->description = "Include collection in the active view layer";
 
 	/* api callbacks */
 	ot->exec = collection_view_layer_exec;
-	ot->poll = collections_include_poll;
+	ot->poll = collections_exclude_clear_poll;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}
+
+void OUTLINER_OT_collection_holdout_set(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot-

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list