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:
committed by
Philipp Oeser
parent
76ac9c9684
commit
4156520c2a
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user