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
This commit is contained in:
Omar Emara
2024-07-30 18:51:20 +02:00
committed by Philipp Oeser
parent 76ac9c9684
commit 4156520c2a
4 changed files with 18 additions and 33 deletions
+1 -2
View File
@@ -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
}
@@ -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<const uchar *>(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<std::string, blender::bke::cryptomatte::CryptomatteLayer> 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);
}
}
@@ -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<RenderResult *>(
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(
@@ -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);
}
}