Cycles: add object level holdout property.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Sat, 18 Nov 2017 05:06:27 +0000 (06:06 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Wed, 29 Nov 2017 17:11:40 +0000 (18:11 +0100)
This works the same as the holdout shader and Z mask layer. Combined with
overrides in 2.8 this is intended to replace the Z mask layer bits.

intern/cycles/blender/addon/properties.py
intern/cycles/blender/addon/ui.py
intern/cycles/blender/blender_object.cpp

index e5084138a9c21cc0e847e8711320d14e75171fa3..b17593a19d6eb9f0ca57e6345bd0050cf5cf4c79 100644 (file)
@@ -1087,6 +1087,15 @@ class CyclesObjectSettings(bpy.types.PropertyGroup):
                 default=False,
                 )
 
+        cls.is_holdout = BoolProperty(
+                name="Holdout",
+                description="Render objects as a holdout or matte, creating a "
+                            "hole in the image with zero alpha, to fill out in "
+                            "compositing with real footange or another render",
+                default=False,
+                )
+
+
     @classmethod
     def unregister(cls):
         del bpy.types.Object.cycles
index 03ca1ab6c7facb465984f30f86e9174b6c60af00..6badfed76d58d868ea3b7aa768997acf5108c68a 100644 (file)
@@ -868,7 +868,9 @@ class CYCLES_OBJECT_PT_cycles_settings(CyclesButtonsPanel, Panel):
         if ob.type != 'LAMP':
             flow.prop(visibility, "shadow")
 
-        layout.prop(cob, "is_shadow_catcher")
+        row = layout.row()
+        row.prop(cob, "is_shadow_catcher")
+        row.prop(cob, "is_holdout")
 
         col = layout.column()
         col.label(text="Performance:")
index f02d54961126babded56f933ccbb038896e0952c..38ef1bc52498e51e371733e1a200da6864510f5b 100644 (file)
@@ -295,7 +295,9 @@ Object *BlenderSync::sync_object(BL::Object& b_parent,
        }
 
        /* Visibility flags for both parent and child. */
-       bool use_holdout = (layer_flag & render_layer.holdout_layer) != 0;
+       PointerRNA cobject = RNA_pointer_get(&b_ob.ptr, "cycles");
+       bool use_holdout = (layer_flag & render_layer.holdout_layer) != 0 ||
+                          get_boolean(cobject, "is_holdout");
        uint visibility = object_ray_visibility(b_ob) & PATH_RAY_ALL_VISIBILITY;
 
        if(b_parent.ptr.data != b_ob.ptr.data) {
@@ -374,7 +376,6 @@ Object *BlenderSync::sync_object(BL::Object& b_parent,
                object_updated = true;
        }
 
-       PointerRNA cobject = RNA_pointer_get(&b_ob.ptr, "cycles");
        bool is_shadow_catcher = get_boolean(cobject, "is_shadow_catcher");
        if(is_shadow_catcher != object->is_shadow_catcher) {
                object->is_shadow_catcher = is_shadow_catcher;