[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