[Bf-blender-cvs] [9d480951bc3] temp-cryptomatte-manifest-parser: Cryptomatte: testcases for Cryptomatte layer.

Jeroen Bakker noreply at git.blender.org
Thu Feb 25 10:12:33 CET 2021


Commit: 9d480951bc3fb573406d6ba3692983d2ebae1e02
Author: Jeroen Bakker
Date:   Wed Feb 24 15:51:15 2021 +0100
Branches: temp-cryptomatte-manifest-parser
https://developer.blender.org/rB9d480951bc3fb573406d6ba3692983d2ebae1e02

Cryptomatte: testcases for Cryptomatte layer.

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

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

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

diff --git a/source/blender/blenkernel/BKE_cryptomatte.hh b/source/blender/blenkernel/BKE_cryptomatte.hh
index 4631bb2616e..b7d3508e725 100644
--- a/source/blender/blenkernel/BKE_cryptomatte.hh
+++ b/source/blender/blenkernel/BKE_cryptomatte.hh
@@ -25,6 +25,7 @@
 
 #include <string>
 
+#include "BLI_map.hh"
 #include "BLI_string_ref.hh"
 
 namespace blender {
@@ -56,4 +57,17 @@ std::string BKE_cryptomatte_meta_data_key(const StringRef layer_name,
  */
 StringRef BKE_cryptomatte_extract_layer_name(const StringRef render_pass_name);
 
+struct CryptomatteLayer {
+  blender::Map<std::string, std::string> hashes;
+
+#ifdef WITH_CXX_GUARDEDALLOC
+  MEM_CXX_CLASS_ALLOC_FUNCS("cryptomatte:CryptomatteLayer")
+#endif
+  std::string encode_hash(uint32_t cryptomatte_hash);
+
+  void add_hash(blender::StringRef name, uint32_t cryptomatte_hash);
+  void add_encoded_hash(blender::StringRef name, blender::StringRefNull cryptomatte_encoded_hash);
+  std::string manifest();
+};
+
 }  // namespace blender
diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc
index 628c8c6e86a..a4924bb86f1 100644
--- a/source/blender/blenkernel/intern/cryptomatte.cc
+++ b/source/blender/blenkernel/intern/cryptomatte.cc
@@ -35,7 +35,6 @@
 #include "BLI_dynstr.h"
 #include "BLI_hash_mm3.h"
 #include "BLI_listbase.h"
-#include "BLI_map.hh"
 #include "BLI_string.h"
 
 #include "MEM_guardedalloc.h"
@@ -47,55 +46,10 @@
 #include <string>
 #include <string_view>
 
-struct CryptomatteLayer {
-  blender::Map<std::string, std::string> hashes;
-
-#ifdef WITH_CXX_GUARDEDALLOC
-  MEM_CXX_CLASS_ALLOC_FUNCS("cryptomatte:CryptomatteLayer")
-#endif
-  std::string encode_hash(uint32_t cryptomatte_hash)
-  {
-    std::stringstream encoded;
-    encoded << std::setfill('0') << std::setw(sizeof(uint32_t) * 2) << std::hex
-            << cryptomatte_hash;
-    return encoded.str();
-  }
-
-  void add_hash(blender::StringRef name, uint32_t cryptomatte_hash)
-  {
-    add_encoded_hash(name, encode_hash(cryptomatte_hash));
-  }
-
-  void add_encoded_hash(blender::StringRef name, blender::StringRefNull cryptomatte_encoded_hash)
-  {
-    hashes.add_overwrite(name, cryptomatte_encoded_hash);
-  }
-
-  std::string manifest()
-  {
-    std::stringstream manifest;
-
-    bool is_first = true;
-    const blender::Map<std::string, std::string> &const_map = hashes;
-    manifest << "{";
-    for (blender::Map<std::string, std::string>::Item item : const_map.items()) {
-      if (is_first) {
-        is_first = false;
-      }
-      else {
-        manifest << ",";
-      }
-      manifest << quoted(item.key) << ":\"" << item.value << "\"";
-    }
-    manifest << "}";
-    return manifest.str();
-  }
-};
-
 struct CryptomatteSession {
-  CryptomatteLayer objects;
-  CryptomatteLayer assets;
-  CryptomatteLayer materials;
+  blender::CryptomatteLayer objects;
+  blender::CryptomatteLayer assets;
+  blender::CryptomatteLayer materials;
 
 #ifdef WITH_CXX_GUARDEDALLOC
   MEM_CXX_CLASS_ALLOC_FUNCS("cryptomatte:CryptomatteSession")
@@ -120,7 +74,7 @@ uint32_t BKE_cryptomatte_hash(const char *name, const int name_len)
   return cryptohash_int;
 }
 
-static uint32_t cryptomatte_hash(CryptomatteLayer *layer, const ID *id)
+static uint32_t cryptomatte_hash(blender::CryptomatteLayer *layer, const ID *id)
 {
   const char *name = &id->name[2];
   const int name_len = BLI_strnlen(name, MAX_NAME - 2);
@@ -300,7 +254,7 @@ void BKE_cryptomatte_store_metadata(struct CryptomatteSession *session,
                                     const char *cryptomatte_layer_name)
 {
   /* Create Manifest. */
-  CryptomatteLayer *layer = nullptr;
+  blender::CryptomatteLayer *layer = nullptr;
   switch (cryptomatte_layer) {
     case VIEW_LAYER_CRYPTOMATTE_OBJECT:
       layer = &session->objects;
@@ -361,4 +315,42 @@ StringRef BKE_cryptomatte_extract_layer_name(const StringRef render_pass_name)
   return render_pass_name.substr(0, last_token);
 }
 
+std::string CryptomatteLayer::encode_hash(uint32_t cryptomatte_hash)
+{
+  std::stringstream encoded;
+  encoded << std::setfill('0') << std::setw(sizeof(uint32_t) * 2) << std::hex << cryptomatte_hash;
+  return encoded.str();
+}
+
+void CryptomatteLayer::add_hash(blender::StringRef name, uint32_t cryptomatte_hash)
+{
+  add_encoded_hash(name, encode_hash(cryptomatte_hash));
+}
+
+void CryptomatteLayer::add_encoded_hash(blender::StringRef name,
+                                        blender::StringRefNull cryptomatte_encoded_hash)
+{
+  hashes.add_overwrite(name, cryptomatte_encoded_hash);
+}
+
+std::string CryptomatteLayer::manifest()
+{
+  std::stringstream manifest;
+
+  bool is_first = true;
+  const blender::Map<std::string, std::string> &const_map = hashes;
+  manifest << "{";
+  for (blender::Map<std::string, std::string>::Item item : const_map.items()) {
+    if (is_first) {
+      is_first = false;
+    }
+    else {
+      manifest << ",";
+    }
+    manifest << quoted(item.key) << ":\"" << item.value << "\"";
+  }
+  manifest << "}";
+  return manifest.str();
+}
+
 }  // namespace blender
diff --git a/source/blender/blenkernel/intern/cryptomatte_test.cc b/source/blender/blenkernel/intern/cryptomatte_test.cc
index 3773b2b3bf9..5c9412c0c4d 100644
--- a/source/blender/blenkernel/intern/cryptomatte_test.cc
+++ b/source/blender/blenkernel/intern/cryptomatte_test.cc
@@ -41,4 +41,23 @@ TEST(cryptomatte, extract_layer_name)
   ASSERT_EQ("", BKE_cryptomatte_extract_layer_name(""));
 }
 
+TEST(cryptomatte, cryptomatte_layer)
+{
+  blender::CryptomatteLayer layer;
+  ASSERT_EQ("{}", layer.manifest());
+
+  layer.add_hash("Object", 123);
+  ASSERT_EQ("{\"Object\":\"0000007b\"}", layer.manifest());
+
+  layer.add_encoded_hash("Object2", "123245678");
+  ASSERT_EQ("{\"Object\":\"0000007b\",\"Object2\":\"123245678\"}", layer.manifest());
+}
+
+TEST(cryptomatte, cryptomatte_layer_quoted)
+{
+  blender::CryptomatteLayer layer;
+  layer.add_hash("\"Object\"", 123);
+  ASSERT_EQ("{\"\\\"Object\\\"\":\"0000007b\"}", layer.manifest());
+}
+
 }  // namespace blender::bke::tests



More information about the Bf-blender-cvs mailing list