From 4156520c2ad2e7a1f0fadc8ea0e0fb69c80e2aff Mon Sep 17 00:00:00 2001 From: Omar Emara Date: Tue, 30 Jul 2024 18:51:20 +0200 Subject: [PATCH] Fix #125232: EEVEE writes wrong Cryptomatte meta data EEVEE writes wrong Cryptomatte meta data layer name. The view layer name is always prepended to the Cryptomatte layer name, which can cause the view layer name to be duplicated or the existence of view layer name where it shouldn't be. Old: cryptomatte/{hash}/name: string 'ViewLayer.ViewLayer.CryptoObject' New: cryptomatte/{hash}/name: string 'ViewLayer.CryptoObject' Pull Request: https://projects.blender.org/blender/blender/pulls/125515 --- source/blender/blenkernel/BKE_cryptomatte.h | 3 +-- .../blender/blenkernel/intern/cryptomatte.cc | 22 ++++------------- .../blenkernel/intern/cryptomatte_test.cc | 24 +++++++++---------- .../engines/eevee_next/eevee_cryptomatte.cc | 2 +- 4 files changed, 18 insertions(+), 33 deletions(-) diff --git a/source/blender/blenkernel/BKE_cryptomatte.h b/source/blender/blenkernel/BKE_cryptomatte.h index 8eca69d1217..03e279de801 100644 --- a/source/blender/blenkernel/BKE_cryptomatte.h +++ b/source/blender/blenkernel/BKE_cryptomatte.h @@ -55,8 +55,7 @@ void BKE_cryptomatte_matte_id_to_entries(struct NodeCryptomatte *node_storage, const char *matte_id); void BKE_cryptomatte_store_metadata(const struct CryptomatteSession *session, - struct RenderResult *render_result, - const ViewLayer *view_layer); + struct RenderResult *render_result); #ifdef __cplusplus } diff --git a/source/blender/blenkernel/intern/cryptomatte.cc b/source/blender/blenkernel/intern/cryptomatte.cc index a8d7e97cc2f..1eafd91c537 100644 --- a/source/blender/blenkernel/intern/cryptomatte.cc +++ b/source/blender/blenkernel/intern/cryptomatte.cc @@ -301,15 +301,6 @@ void BKE_cryptomatte_matte_id_to_entries(NodeCryptomatte *node_storage, const ch } } -static std::string cryptomatte_determine_name(const ViewLayer *view_layer, - const blender::StringRefNull cryptomatte_layer_name) -{ - std::stringstream stream; - const size_t view_layer_name_len = BLI_strnlen(view_layer->name, sizeof(view_layer->name)); - stream << std::string(view_layer->name, view_layer_name_len) << "." << cryptomatte_layer_name; - return stream.str(); -} - static uint32_t cryptomatte_determine_identifier(const blender::StringRef name) { return BLI_hash_mm3(reinterpret_cast(name.data()), name.size(), 0); @@ -326,9 +317,7 @@ static void add_render_result_meta_data(RenderResult *render_result, value.data()); } -void BKE_cryptomatte_store_metadata(const CryptomatteSession *session, - RenderResult *render_result, - const ViewLayer *view_layer) +void BKE_cryptomatte_store_metadata(const CryptomatteSession *session, RenderResult *render_result) { for (const blender::MapItem item : session->layers.items()) @@ -337,12 +326,11 @@ void BKE_cryptomatte_store_metadata(const CryptomatteSession *session, const blender::bke::cryptomatte::CryptomatteLayer &layer = item.value; const std::string manifest = layer.manifest(); - const std::string name = cryptomatte_determine_name(view_layer, layer_name); - add_render_result_meta_data(render_result, name, "name", name); - add_render_result_meta_data(render_result, name, "hash", "MurmurHash3_32"); - add_render_result_meta_data(render_result, name, "conversion", "uint32_to_float32"); - add_render_result_meta_data(render_result, name, "manifest", manifest); + add_render_result_meta_data(render_result, layer_name, "name", layer_name); + add_render_result_meta_data(render_result, layer_name, "hash", "MurmurHash3_32"); + add_render_result_meta_data(render_result, layer_name, "conversion", "uint32_to_float32"); + add_render_result_meta_data(render_result, layer_name, "manifest", manifest); } } diff --git a/source/blender/blenkernel/intern/cryptomatte_test.cc b/source/blender/blenkernel/intern/cryptomatte_test.cc index 669b36dab3c..78174048abf 100644 --- a/source/blender/blenkernel/intern/cryptomatte_test.cc +++ b/source/blender/blenkernel/intern/cryptomatte_test.cc @@ -102,29 +102,29 @@ static void validate_cryptomatte_session_from_stamp_data(void * /*data*/, return; } - if (prop_name == "cryptomatte/87f095e/name") { - EXPECT_STREQ("viewlayername.layer1", propvalue); + if (prop_name == "cryptomatte/67da54b/name") { + EXPECT_STREQ("layer1", propvalue); } - else if (prop_name == "cryptomatte/87f095e/hash") { + else if (prop_name == "cryptomatte/67da54b/hash") { EXPECT_STREQ("MurmurHash3_32", propvalue); } - else if (prop_name == "cryptomatte/87f095e/conversion") { + else if (prop_name == "cryptomatte/67da54b/conversion") { EXPECT_STREQ("uint32_to_float32", propvalue); } - else if (prop_name == "cryptomatte/87f095e/manifest") { + else if (prop_name == "cryptomatte/67da54b/manifest") { EXPECT_STREQ(R"({"Object":"12345678"})", propvalue); } - else if (prop_name == "cryptomatte/c42daa7/name") { - EXPECT_STREQ("viewlayername.layer2", propvalue); + else if (prop_name == "cryptomatte/79b2306/name") { + EXPECT_STREQ("layer2", propvalue); } - else if (prop_name == "cryptomatte/c42daa7/hash") { + else if (prop_name == "cryptomatte/79b2306/hash") { EXPECT_STREQ("MurmurHash3_32", propvalue); } - else if (prop_name == "cryptomatte/c42daa7/conversion") { + else if (prop_name == "cryptomatte/79b2306/conversion") { EXPECT_STREQ("uint32_to_float32", propvalue); } - else if (prop_name == "cryptomatte/c42daa7/manifest") { + else if (prop_name == "cryptomatte/79b2306/manifest") { EXPECT_STREQ(R"({"Object2":"87654321"})", propvalue); } @@ -149,11 +149,9 @@ TEST(cryptomatte, session_from_stamp_data) RE_FreeRenderResult(render_result); /* Create StampData from CryptomatteSession. */ - ViewLayer view_layer; - STRNCPY(view_layer.name, "viewlayername"); RenderResult *render_result2 = static_cast( MEM_callocN(sizeof(RenderResult), __func__)); - BKE_cryptomatte_store_metadata(session.get(), render_result2, &view_layer); + BKE_cryptomatte_store_metadata(session.get(), render_result2); /* Validate StampData. */ BKE_stamp_info_callback( diff --git a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc index ca1a2bcb465..912a983452f 100644 --- a/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc +++ b/source/blender/draw/engines/eevee_next/eevee_cryptomatte.cc @@ -129,7 +129,7 @@ float Cryptomatte::register_id(const eViewLayerEEVEEPassType layer, const ID &id void Cryptomatte::store_metadata(RenderResult *render_result) { if (session_) { - BKE_cryptomatte_store_metadata(&*session_, render_result, inst_.view_layer); + BKE_cryptomatte_store_metadata(&*session_, render_result); } }