[Bf-blender-cvs] [ac7b595cb06] compositor-cryptomatte-workflow: Order of layer name selection

Jeroen Bakker noreply at git.blender.org
Tue Mar 9 14:10:56 CET 2021


Commit: ac7b595cb06ddd4aa2cd564d0dcddda8a3014e20
Author: Jeroen Bakker
Date:   Tue Mar 9 10:45:42 2021 +0100
Branches: compositor-cryptomatte-workflow
https://developer.blender.org/rBac7b595cb06ddd4aa2cd564d0dcddda8a3014e20

Order of layer name selection

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

M	source/blender/blenkernel/BKE_cryptomatte.hh
M	source/blender/blenkernel/intern/cryptomatte.cc

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

diff --git a/source/blender/blenkernel/BKE_cryptomatte.hh b/source/blender/blenkernel/BKE_cryptomatte.hh
index 7c325932b7c..b3560c51578 100644
--- a/source/blender/blenkernel/BKE_cryptomatte.hh
+++ b/source/blender/blenkernel/BKE_cryptomatte.hh
@@ -105,7 +105,7 @@ struct CryptomatteStampDataCallbackData {
   static void extract_layer_manifest(void *_data, const char *propname, char *propvalue, int len);
 };
 
-blender::Vector<blender::StringRef> BKE_cryptomatte_layer_names_get(
+const blender::Vector<std::string> &BKE_cryptomatte_layer_names_get(
     const CryptomatteSession &session);
 
 }  // namespace blender::bke::cryptomatte
diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc
index 93060a72aac..74576b8bbbb 100644
--- a/source/blender/blenkernel/intern/cryptomatte.cc
+++ b/source/blender/blenkernel/intern/cryptomatte.cc
@@ -51,6 +51,8 @@
 
 struct CryptomatteSession {
   blender::Map<std::string, blender::bke::cryptomatte::CryptomatteLayer> layers;
+  /* Layer names in order of creation. */
+  blender::Vector<std::string> layer_names;
 
   CryptomatteSession();
   CryptomatteSession(const Main *bmain);
@@ -104,14 +106,29 @@ CryptomatteSession::CryptomatteSession(StampData *stamp_data)
 CryptomatteSession::CryptomatteSession(const Scene *scene)
 {
   LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
-    add_layer(blender::StringRefNull(view_layer->name) + ".CryptoObject");
-    add_layer(blender::StringRefNull(view_layer->name) + ".CryptoAsset");
-    add_layer(blender::StringRefNull(view_layer->name) + ".CryptoMaterial");
+    eViewLayerCryptomatteFlags cryptoflags = static_cast<eViewLayerCryptomatteFlags>(
+        view_layer->cryptomatte_flag & VIEW_LAYER_CRYPTOMATTE_ALL);
+    if (cryptoflags == 0) {
+      cryptoflags = static_cast<eViewLayerCryptomatteFlags>(VIEW_LAYER_CRYPTOMATTE_ALL);
+    }
+
+    if (cryptoflags & VIEW_LAYER_CRYPTOMATTE_OBJECT) {
+      add_layer(blender::StringRefNull(view_layer->name) + ".CryptoObject");
+    }
+    if (cryptoflags & VIEW_LAYER_CRYPTOMATTE_ASSET) {
+      add_layer(blender::StringRefNull(view_layer->name) + ".CryptoAsset");
+    }
+    if (cryptoflags & VIEW_LAYER_CRYPTOMATTE_MATERIAL) {
+      add_layer(blender::StringRefNull(view_layer->name) + ".CryptoMaterial");
+    }
   }
 }
 
 blender::bke::cryptomatte::CryptomatteLayer &CryptomatteSession::add_layer(std::string layer_name)
 {
+  if (!layer_names.contains(layer_name)) {
+    layer_names.append(layer_name);
+  }
   return layers.lookup_or_add_default(layer_name);
 }
 
@@ -245,7 +262,8 @@ void BKE_cryptomatte_matte_id_to_entries(NodeCryptomatte *node_storage, const ch
   }
   /* Update the matte_id so the files can be opened in versions that don't
    * use `CryptomatteEntry`. */
-  if (matte_id != node_storage->matte_id && STREQ(node_storage->matte_id, matte_id)) {
+  if (matte_id != node_storage->matte_id && node_storage->matte_id &&
+      STREQ(node_storage->matte_id, matte_id)) {
     MEM_SAFE_FREE(node_storage->matte_id);
     node_storage->matte_id = static_cast<char *>(MEM_dupallocN(matte_id));
   }
@@ -631,14 +649,10 @@ void CryptomatteStampDataCallbackData::extract_layer_manifest(void *_data,
   blender::bke::cryptomatte::manifest::from_manifest(layer, propvalue);
 }
 
-blender::Vector<blender::StringRef> BKE_cryptomatte_layer_names_get(
+const blender::Vector<std::string> &BKE_cryptomatte_layer_names_get(
     const CryptomatteSession &session)
 {
-  blender::Vector<blender::StringRef> layer_names;
-  for (std::string layer_name : session.layers.keys()) {
-    layer_names.append(layer_name);
-  }
-  return layer_names;
+  return session.layer_names;
 }
 
 }  // namespace blender::bke::cryptomatte



More information about the Bf-blender-cvs mailing list