Fix T73372: cryptomatte not filling last pass for odd number of levels
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Sat, 21 Mar 2020 00:37:00 +0000 (01:37 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Sat, 21 Mar 2020 14:04:12 +0000 (15:04 +0100)
Make logic consistent with the render pass creation in Python.

intern/cycles/blender/blender_sync.cpp

index 91d715af7e24f3888992d43a1c3b9bd9cb548470..28a737c33412a690019590bbc197539260f10365 100644 (file)
@@ -633,12 +633,12 @@ vector<Pass> BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay,
 
   /* Cryptomatte stores two ID/weight pairs per RGBA layer.
    * User facing parameter is the number of pairs. */
-  int crypto_depth = min(16, get_int(crp, "pass_crypto_depth")) / 2;
+  int crypto_depth = min(16, get_int(crp, "pass_crypto_depth"));
   scene->film->cryptomatte_depth = crypto_depth;
   scene->film->cryptomatte_passes = CRYPT_NONE;
   if (get_boolean(crp, "use_pass_crypto_object")) {
-    for (int i = 0; i < crypto_depth; ++i) {
-      string passname = cryptomatte_prefix + string_printf("Object%02d", i);
+    for (int i = 0; i < crypto_depth; i += 2) {
+      string passname = cryptomatte_prefix + string_printf("Object%02d", i / 2);
       b_engine.add_pass(passname.c_str(), 4, "RGBA", b_view_layer.name().c_str());
       Pass::add(PASS_CRYPTOMATTE, passes, passname.c_str());
     }
@@ -646,8 +646,8 @@ vector<Pass> BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay,
                                                         CRYPT_OBJECT);
   }
   if (get_boolean(crp, "use_pass_crypto_material")) {
-    for (int i = 0; i < crypto_depth; ++i) {
-      string passname = cryptomatte_prefix + string_printf("Material%02d", i);
+    for (int i = 0; i < crypto_depth; i += 2) {
+      string passname = cryptomatte_prefix + string_printf("Material%02d", i / 2);
       b_engine.add_pass(passname.c_str(), 4, "RGBA", b_view_layer.name().c_str());
       Pass::add(PASS_CRYPTOMATTE, passes, passname.c_str());
     }
@@ -655,8 +655,8 @@ vector<Pass> BlenderSync::sync_render_passes(BL::RenderLayer &b_rlay,
                                                         CRYPT_MATERIAL);
   }
   if (get_boolean(crp, "use_pass_crypto_asset")) {
-    for (int i = 0; i < crypto_depth; ++i) {
-      string passname = cryptomatte_prefix + string_printf("Asset%02d", i);
+    for (int i = 0; i < crypto_depth; i += 2) {
+      string passname = cryptomatte_prefix + string_printf("Asset%02d", i / 2);
       b_engine.add_pass(passname.c_str(), 4, "RGBA", b_view_layer.name().c_str());
       Pass::add(PASS_CRYPTOMATTE, passes, passname.c_str());
     }