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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to