[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