[Bf-blender-cvs] [a2502ee20fb] temp_cryptomatte: Cryptomatte: Added extra pass that determines an "asset" name by the top level object in the hierarchy

Stefan Werner noreply at git.blender.org
Fri Nov 3 21:10:11 CET 2017


Commit: a2502ee20fb69ea50fe506cfd1b5f5ab844b48ff
Author: Stefan Werner
Date:   Thu Aug 31 12:02:27 2017 +0200
Branches: temp_cryptomatte
https://developer.blender.org/rBa2502ee20fb69ea50fe506cfd1b5f5ab844b48ff

Cryptomatte: Added extra pass that determines an "asset" name by the top level object in the hierarchy

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

M	intern/cycles/blender/addon/engine.py
M	intern/cycles/blender/addon/properties.py
M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_object.cpp
M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/device/device_cpu.cpp
M	intern/cycles/kernel/geom/geom_object.h
M	intern/cycles/kernel/kernel_globals.h
M	intern/cycles/kernel/kernel_passes.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/render/object.cpp
M	intern/cycles/render/object.h

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

diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py
index cde183266ea..0b550faae34 100644
--- a/intern/cycles/blender/addon/engine.py
+++ b/intern/cycles/blender/addon/engine.py
@@ -264,3 +264,6 @@ def register_passes(engine, scene, srl):
     if(crl.use_pass_crypto_material):
         for i in range(0, crl.pass_crypto_depth, 2):
             engine.register_pass(scene, srl, "AOV uCryptoMaterial" + '{:02d}'.format(i), 4, "RGBA", 'COLOR')
+    if(srl.cycles.use_pass_crypto_asset):
+        for i in range(0, srl.cycles.pass_crypto_depth, 2):
+            engine.register_pass(scene, srl, "AOV uCryptoAsset" + '{:02d}'.format(i), 4, "RGBA", 'COLOR')
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index dc4e17f3717..1412133e723 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -1314,6 +1314,12 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
                 default=False,
                 update=update_render_passes,
                 )
+        cls.use_pass_crypto_asset = BoolProperty(
+                name="CryptoMatte Asset",
+                description="CryptoMatte Asset pass",
+                default=False,
+                update=update_render_passes,
+                )
         cls.pass_crypto_depth = IntProperty(
                 name="CryptoMatte Depth",
                 description="CryptoMatte Depth",
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index acf1ad6371d..9c2e2090b40 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -587,6 +587,7 @@ class CyclesRender_PT_layer_passes(CyclesButtonsPanel, Panel):
         row = layout.row(align=True)
         row.prop(crl, "use_pass_crypto_object", text="Object", toggle=True)
         row.prop(crl, "use_pass_crypto_material", text="Material", toggle=True)
+        row.prop(crl, "use_pass_crypto_asset", text="Asset", toggle=True)
         row = layout.row(align=True)
         row.active = use_cpu(context)
         row.prop(crl, "pass_crypto_accurate", text="Accurate Mode")
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index a930c439370..1679cdc5e21 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -350,6 +350,23 @@ Object *BlenderSync::sync_object(BL::Object& b_parent,
 		object_updated = true;
 	}
 
+	/* sync the asset name for Cryptomatte */
+	BL::Object parent = b_ob.parent();
+	ustring parent_name;
+	if(parent) {
+		while(parent.parent()) {
+			parent = parent.parent();
+		}
+		parent_name = parent.name();
+	}
+	else {
+		parent_name = b_ob.name();
+	}
+	if(object->asset_name != parent_name) {
+		object->asset_name = parent_name;
+		object_updated = true;
+	}
+
 	/* object sync
 	 * transform comparison should not be needed, but duplis don't work perfect
 	 * in the depsgraph and may not signal changes, so this is a workaround */
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 47689ad8474..ef0f324b7dd 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -601,6 +601,16 @@ void BlenderSync::sync_film(BL::RenderLayer& b_rlay,
 			scene->film->use_cryptomatte |= CRYPT_MATERIAL;
 		}
 
+		if(get_boolean(crp, "use_pass_crypto_asset")) {
+			for(int i = 0; i < crypto_depth; ++i) {
+				string passname = string_printf("uCryptoAsset%02d", i);
+				AOV aov = {ustring(passname), 9999, AOV_CRYPTOMATTE};
+				passes.add(aov);
+				passname = "AOV " + passname;
+				b_engine.add_pass(passname.c_str(), 4, "RGBA", b_srlay.name().c_str());
+			}
+			scene->film->use_cryptomatte |= CRYPT_ASSET;
+		}
 		if(get_boolean(crp, "pass_crypto_accurate")) {
 			scene->film->use_cryptomatte |= CRYPT_ACCURATE;
 		}
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index cbcd28ca06d..9c3dfc20bcb 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -613,7 +613,7 @@ public:
 		return true;
 	}
 
-	void path_trace(DeviceTask &task, RenderTile &tile, KernelGlobals *kg, vector<map<float, float> >& coverage_object, vector<map<float, float> >& coverage_material)
+	void path_trace(DeviceTask &task, RenderTile &tile, KernelGlobals *kg, vector<map<float, float> >& coverage_object, vector<map<float, float> >& coverage_material, vector<map<float, float > >& coverage_asset)
 	{
 		kg->coverage_object = kg->coverage_material = NULL;
 
@@ -626,6 +626,10 @@ public:
 				coverage_material.clear();
 				coverage_material.resize(tile.w * tile.h);
 			}
+			if(kg->__data.film.use_cryptomatte & CRYPT_ASSET) {
+				coverage_asset.clear();
+				coverage_asset.resize(tile.w * tile.h);
+			}
 		}
 
 		float *render_buffer = (float*)tile.buffer;
@@ -648,6 +652,9 @@ public:
 						if(kg->__data.film.use_cryptomatte & CRYPT_MATERIAL) {
 							kg->coverage_material = &coverage_material[tile.w * (y - tile.y) + x - tile.x];
 						}
+						if(kg->__data.film.use_cryptomatte & CRYPT_ASSET) {
+							kg->coverage_asset = &coverage_asset[tile.w * (y - tile.y) + x - tile.x];
+						}
 					}
 					path_trace_kernel()(kg, render_buffer, rng_state,
 					                    sample, x, y, tile.offset, tile.stride);
@@ -725,13 +732,14 @@ public:
 				/* cryptomatte data. This needs a better place than here. */
 				vector<map<float, float> >coverage_object;
 				vector<map<float, float> >coverage_material;
+				vector<map<float, float> >coverage_asset;
 
 				if(use_split_kernel) {
 					device_memory data;
 					split_kernel->path_trace(&task, tile, kgbuffer, data);
 				}
 				else {
-					path_trace(task, tile, kg, coverage_object, coverage_material);
+					path_trace(task, tile, kg, coverage_object, coverage_material, coverage_asset);
 				}
 				if(kg->__data.film.use_cryptomatte & CRYPT_ACCURATE) {
 					int aov_index = 0;
@@ -741,6 +749,9 @@ public:
 					if(kg->__data.film.use_cryptomatte & CRYPT_MATERIAL) {
 						aov_index += flatten_coverage(kg, coverage_material, tile, aov_index);
 					}
+					if(kg->__data.film.use_cryptomatte & CRYPT_ASSET) {
+						aov_index += flatten_coverage(kg, coverage_asset, tile, aov_index);
+					}
 				}
 			}
 			else if(tile.task == RenderTile::DENOISE) {
diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h
index aedd38f4d06..66eb0cb34ff 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -342,6 +342,16 @@ ccl_device_inline float object_cryptomatte_id(KernelGlobals *kg, int object)
 	return f.x;
 }
 
+ccl_device_inline float object_cryptomatte_asset_id(KernelGlobals *kg, int object)
+{
+	if(object == OBJECT_NONE)
+		return 0;
+
+	int offset = object*OBJECT_SIZE + OBJECT_CRYPTOMATTE;
+	float4 f = kernel_tex_fetch(__objects, offset);
+	return f.y;
+}
+
 /* Particle data from which object was instanced */
 
 ccl_device_inline float particle_index(KernelGlobals *kg, int particle)
diff --git a/intern/cycles/kernel/kernel_globals.h b/intern/cycles/kernel/kernel_globals.h
index 0113c326c56..64fbad935c1 100644
--- a/intern/cycles/kernel/kernel_globals.h
+++ b/intern/cycles/kernel/kernel_globals.h
@@ -74,6 +74,11 @@ typedef struct KernelGlobals {
 	VolumeStep *decoupled_volume_steps[2];
 	int decoupled_volume_steps_index;
 
+	/* A buffer for storing per-pixel coverage for Cryptomatte. */
+	map<float, float> *coverage_object;
+	map<float, float> *coverage_material;
+	map<float, float> *coverage_asset;
+
 	/* split kernel */
 	SplitData split_data;
 	SplitParams split_param_data;
@@ -81,9 +86,6 @@ typedef struct KernelGlobals {
 	int2 global_size;
 	int2 global_id;
 
-	/* A buffer for storing per-pixel coverage for Cryptomatte. */
-	map<float, float> *coverage_object;
-	map<float, float> *coverage_material;
 } KernelGlobals;
 
 #endif  /* __KERNEL_CPU__ */
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index 9640a3207a1..e9f3048be50 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -347,7 +347,32 @@ ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg, ccl_global fl
 	#endif /* __KERNEL_CPU__ */
 		}
 	}
-	
+	if(kernel_data.film.use_cryptomatte & CRYPT_ASSET) {
+		float matte_weight = state->matte_weight * (1.0f - average(shader_bsdf_transparency(kg, sd)));
+		if(matte_weight > 0.0f) {
+			float id = object_cryptomatte_asset_id(kg, sd->object);
+#ifdef __KERNEL_CPU__
+			if(kg->coverage_asset) {
+				if((sample == 0) && (state->transparent_bounce == 0)) {
+					(*kg->coverage_asset)[id] = matte_weight;
+				} else {
+					(*kg->coverage_asset)[id] += matte_weight;
+				}
+			}
+			else {
+#endif /* __KERNEL_CPU__ */
+				bool initialize_slots = (sample == 0) && (state->transparent_bounce == 0);
+				int pass_offset = (kernel_data.film.pass_aov[aov_count] & ~(1 << 31));
+				kernel_assert(kernel_data.film.pass_aov[aov_count] & (1 << 31));
+				kernel_write_id_slots(buffer + pass_offset, 2 * (kernel_data.film.use_cryptomatte & 255), id, matte_weight, initialize_slots);
+				state->written_aovs |= (1 << aov_count);
+				aov_count += kernel_data.film.use_cryptomatte & 255;
+#ifdef __KERNEL_CPU__
+			}
+#endif /* __KERNEL_CPU__ */
+		}
+	}
+
 	if(flag & (PASS_DIFFUSE_INDIRECT|PASS_DIFFUSE_COLOR|PASS_DIFFUSE_DIRECT))
 		L->color_diffuse += shader_bsdf_diffuse(kg, sd)*throughput;
 	if(flag & (PASS_GLOSSY_INDIRECT|PASS_GLOSSY_COLOR|PASS_GLOSSY_DIRECT))
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index f9bc1b9e008..625a35e07b3 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -409,7 +409,8 @@ typedef enum CryptomatteType {
 	CRYPT_NONE = 0,
 	CRYPT_OBJECT = (1 << 31),
 	CRYPT_MATERIAL = (1 << 30),
-	CRYPT_ACCURATE = (1 << 29),
+	CRYPT_ASSET = (1 << 29),
+	CRYPT_ACCURATE = (1 << 28),
 } CryptomatteType;
 
 typedef enum DenoisingPassOffsets {
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp
index 1da0d3a8223..c7e642ac44c 100644


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list