Blender V4.3
COM_MetaData.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "COM_MetaData.h"
6
7#include "BKE_image.hh"
8
9#include "RE_pipeline.h"
10
11namespace blender::compositor {
12
14{
15 entries_.add(key, value);
16}
17
24
25void MetaData::add_cryptomatte_entry(const blender::StringRef layer_name,
26 const blender::StringRefNull key,
27 const blender::StringRef value)
28{
30}
31
33{
34 std::string cryptomatte_hash = entries_.pop_default(META_DATA_KEY_CRYPTOMATTE_HASH, "");
35 std::string cryptomatte_conversion = entries_.pop_default(META_DATA_KEY_CRYPTOMATTE_CONVERSION,
36 "");
37 std::string cryptomatte_manifest = entries_.pop_default(META_DATA_KEY_CRYPTOMATTE_MANIFEST, "");
38
39 if (cryptomatte_hash.length() || cryptomatte_conversion.length() ||
40 cryptomatte_manifest.length())
41 {
42 add_cryptomatte_entry(layer_name, "name", layer_name);
43 }
44 if (cryptomatte_hash.length()) {
45 add_cryptomatte_entry(layer_name, "hash", cryptomatte_hash);
46 }
47 if (cryptomatte_conversion.length()) {
48 add_cryptomatte_entry(layer_name, "conversion", cryptomatte_conversion);
49 }
50 if (cryptomatte_manifest.length()) {
51 add_cryptomatte_entry(layer_name, "manifest", cryptomatte_manifest);
52 }
53}
54
56{
57 for (MapItem<std::string, std::string> entry : entries_.items()) {
58 BKE_render_result_stamp_data(render_result, entry.key.c_str(), entry.value.c_str());
59 }
60}
61
63 FunctionRef<void(const std::string &, const std::string &)> callback) const
64{
65 for (MapItem<std::string, std::string> entry : entries_.items()) {
66 callback(entry.key, entry.value);
67 }
68}
69
72{
73 if (!meta_data) {
74 meta_data = std::make_unique<MetaData>();
75 }
76 meta_data->add(key, value);
77}
78
88
90 const char *propname,
91 char *propvalue,
92 int /*len*/)
93{
94 MetaDataExtractCallbackData *data = static_cast<MetaDataExtractCallbackData *>(_data);
95 blender::StringRefNull key(propname);
96 if (key == data->hash_key) {
97 data->add_meta_data(META_DATA_KEY_CRYPTOMATTE_HASH, propvalue);
98 }
99 else if (key == data->conversion_key) {
100 data->add_meta_data(META_DATA_KEY_CRYPTOMATTE_CONVERSION, propvalue);
101 }
102 else if (key == data->manifest_key) {
103 data->add_meta_data(META_DATA_KEY_CRYPTOMATTE_MANIFEST, propvalue);
104 }
105}
106
107} // namespace blender::compositor
void BKE_render_result_stamp_data(RenderResult *rr, const char *key, const char *value)
uint32_t hash_key
bool add(const Key &key, const Value &value)
Definition BLI_map.hh:271
ItemIterator items() const
Definition BLI_map.hh:864
bool contains(const Key &key) const
Definition BLI_map.hh:329
Value pop_default(const Key &key, const Value &default_value)
Definition BLI_map.hh:415
void add_to_render_result(RenderResult *render_result) const
void for_each_entry(FunctionRef< void(const std::string &, const std::string &)> callback) const
void add(const blender::StringRef key, const blender::StringRef value)
void replace_hash_neutral_cryptomatte_keys(const blender::StringRef layer_name)
DEGForeachIDComponentCallback callback
std::string BKE_cryptomatte_meta_data_key(const StringRef layer_name, const StringRefNull key_name)
constexpr blender::StringRef META_DATA_KEY_CRYPTOMATTE_CONVERSION("cryptomatte/{hash}/conversion")
constexpr blender::StringRef META_DATA_KEY_CRYPTOMATTE_HASH("cryptomatte/{hash}/hash")
constexpr blender::StringRef META_DATA_KEY_CRYPTOMATTE_MANIFEST("cryptomatte/{hash}/manifest")
static void extract_cryptomatte_meta_data(void *_data, const char *propname, char *propvalue, int)
void add_meta_data(blender::StringRef key, blender::StringRefNull value)
void set_cryptomatte_keys(blender::StringRef cryptomatte_layer_name)