[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