49 void init(
const ViewLayer *view_layer,
bool build_meta_data =
false);
52 std::optional<std::string>
operator[](
float encoded_hash)
const;
54#ifdef WITH_CXX_GUARDEDALLOC
55 MEM_CXX_CLASS_ALLOC_FUNCS(
"cryptomatte:CryptomatteSession")
72 materials.add_ID(*
id);
101 if (build_meta_data) {
106 init(view_layer, build_meta_data);
114 if (cryptoflags == 0) {
124 if (build_meta_data) {
126 objects.add_ID(base->object->id);
139 if (build_meta_data) {
141 for (
int i = 0; i < base->object->totcol; i++) {
144 materials.add_ID(material->id);
157 return layers.lookup_or_add_default(layer_name);
163 std::optional<std::string> result = layer[encoded_hash];
213 const char *layer_name,
218 return layer->add_ID(object->id);
222 const char *layer_name,
225 if (material ==
nullptr) {
230 return layer->add_ID(material->id);
234 const char *layer_name,
237 const Object *asset_object = object;
238 while (asset_object->
parent !=
nullptr) {
239 asset_object = asset_object->
parent;
250 const float encoded_hash,
254 std::optional<std::string> name = (*session)[encoded_hash];
271 if (
BLI_strnlen(entry->name,
sizeof(entry->name)) != 0) {
288 if (matte_id ==
nullptr) {
301 std::istringstream ss(matte_id);
305 getline(ss, token,
',');
307 if (token.length() > 0) {
308 size_t first = token.find_first_not_of(
' ');
309 size_t last = token.find_last_not_of(
' ');
310 if (first == std::string::npos || last == std::string::npos) {
313 token = token.substr(first, (last - first + 1));
314 if (*token.begin() ==
'<' && *(--token.end()) ==
'>') {
315 float encoded_hash = atof(token.substr(1, token.length() - 2).c_str());
316 entry = MEM_cnew<CryptomatteEntry>(__func__);
320 const char *name = token.c_str();
321 int name_len = token.length();
322 entry = MEM_cnew<CryptomatteEntry>(__func__);
328 if (entry !=
nullptr) {
336 return BLI_hash_mm3(
reinterpret_cast<const uchar *
>(name.data()), name.size(), 0);
358 const std::string manifest = layer.
manifest();
383 bool skip_next =
false;
385 char current_char = ref[
len];
390 if (current_char ==
'\\') {
393 if (current_char ==
'\"') {
405 std::ostringstream stream;
423 char front = ref.
front();
427 const int name_len = quoted_name_len - 2;
435 char colon = ref.
front();
447 if (quoted_hash_len < 2) {
450 const int hash_len = quoted_hash_len - 2;
453 layer.add_hash(name,
hash);
455 else if (front ==
',') {
458 else if (front ==
'}') {
475 std::stringstream manifest;
477 bool is_first =
true;
487 manifest << quoted(item.key) <<
":\"" << item.value.hex_encoded() <<
"\"";
490 return manifest.str();
503 std::stringstream stream;
505 stream << std::setfill(
'0') << std::setw(
sizeof(
uint32_t) * 2) << std::hex
506 << render_pass_identifier;
507 return stream.str().substr(0, 7);
518 while (last_token > 0 && std::isdigit(render_pass_name[last_token - 1])) {
521 return render_pass_name.
substr(0, last_token);
529 std::istringstream(
hex_encoded) >> std::hex >> result.hash;
535 std::stringstream encoded;
536 encoded << std::setfill(
'0') << std::setw(
sizeof(
uint32_t) * 2) << std::hex <<
hash;
537 return encoded.str();
540std::unique_ptr<CryptomatteLayer> CryptomatteLayer::read_from_manifest(
543 std::unique_ptr<CryptomatteLayer> layer = std::make_unique<CryptomatteLayer>();
550 const char *name = &
id.name[2];
556 return cryptohash_int;
561 hashes.add_overwrite(name, cryptomatte_hash);
564std::optional<std::string> CryptomatteLayer::operator[](
float encoded_hash)
const
569 return std::make_optional(item.key);
575std::string CryptomatteLayer::manifest()
const
592 if (end_index <= start_index) {
595 return key.
substr(start_index + 1, end_index - start_index - 1);
599 const char *propname,
613 data->hash_to_layer_name.add(layer_hash, propvalue);
617 const char *propname,
631 if (!data->hash_to_layer_name.contains(layer_hash)) {
float BKE_cryptomatte_hash_to_float(uint32_t cryptomatte_hash)
uint32_t BKE_cryptomatte_hash(const char *name, int name_len)
void BKE_stamp_info_callback(void *data, StampData *stamp_data, StampCallback callback, bool noskip)
void BKE_render_result_stamp_data(RenderResult *rr, const char *key, const char *value)
void BKE_scene_view_layers_synced_ensure(const Scene *scene)
ListBase * BKE_view_layer_object_bases_get(ViewLayer *view_layer)
General operations, lookup, etc. for materials.
struct Material * BKE_object_material_get(struct Object *ob, short act)
A dynamically sized string ADT.
char * BLI_dynstr_get_cstring(const DynStr *ds) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void BLI_dynstr_nappend(DynStr *__restrict ds, const char *cstr, int len) ATTR_NONNULL()
DynStr * BLI_dynstr_new(void) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_dynstr_free(DynStr *ds) ATTR_NONNULL()
void BLI_dynstr_appendf(DynStr *__restrict ds, const char *__restrict format,...) ATTR_PRINTF_FORMAT(2
void BLI_dynstr_append(DynStr *__restrict ds, const char *cstr) ATTR_NONNULL()
uint32_t BLI_hash_mm3(const unsigned char *data, size_t len, uint32_t seed)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
#define LISTBASE_FOREACH(type, var, list)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define STRNCPY(dst, src)
int char char int int int int size_t BLI_strnlen(const char *str, size_t maxlen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
eViewLayerCryptomatteFlags
@ VIEW_LAYER_CRYPTOMATTE_MATERIAL
@ VIEW_LAYER_CRYPTOMATTE_ASSET
@ VIEW_LAYER_CRYPTOMATTE_OBJECT
#define VIEW_LAYER_CRYPTOMATTE_ALL
Object is a sort of wrapper for general info.
#define RE_PASSNAME_CRYPTOMATTE_MATERIAL
#define RE_PASSNAME_CRYPTOMATTE_ASSET
#define RE_PASSNAME_CRYPTOMATTE_OBJECT
Read Guarded memory(de)allocation.
const Value * lookup_ptr(const Key &key) const
ItemIterator items() const
constexpr const char & front() const
static constexpr int64_t not_found
constexpr int64_t find_last_of(StringRef chars, int64_t pos=INT64_MAX) const
constexpr int64_t find_first_not_of(StringRef chars, int64_t pos=0) const
constexpr bool is_empty() const
constexpr StringRef substr(int64_t start, int64_t size) const
constexpr bool startswith(StringRef prefix) const
constexpr bool endswith(StringRef suffix) const
constexpr int64_t find_first_of(StringRef chars, int64_t pos=0) const
constexpr int64_t size() const
constexpr StringRef drop_prefix(int64_t n) const
bool contains(const T &value) const
void append(const T &value)
CryptomatteSession * BKE_cryptomatte_init_from_render_result(const RenderResult *render_result)
uint32_t BKE_cryptomatte_hash(const char *name, const int name_len)
void BKE_cryptomatte_store_metadata(const CryptomatteSession *session, RenderResult *render_result)
static void add_render_result_meta_data(RenderResult *render_result, const blender::StringRef layer_name, const blender::StringRefNull key_name, const blender::StringRefNull value)
bool BKE_cryptomatte_find_name(const CryptomatteSession *session, const float encoded_hash, char *r_name, int name_maxncpy)
CryptomatteSession * BKE_cryptomatte_init()
void BKE_cryptomatte_free(CryptomatteSession *session)
CryptomatteSession * BKE_cryptomatte_init_from_scene(const Scene *scene, bool build_meta_data)
void BKE_cryptomatte_add_layer(CryptomatteSession *session, const char *layer_name)
float BKE_cryptomatte_hash_to_float(uint32_t cryptomatte_hash)
uint32_t BKE_cryptomatte_asset_hash(CryptomatteSession *session, const char *layer_name, const Object *object)
static uint32_t cryptomatte_determine_identifier(const blender::StringRef name)
CryptomatteSession * BKE_cryptomatte_init_from_view_layer(const ViewLayer *view_layer)
void BKE_cryptomatte_matte_id_to_entries(NodeCryptomatte *node_storage, const char *matte_id)
char * BKE_cryptomatte_entries_to_matte_id(NodeCryptomatte *node_storage)
uint32_t BKE_cryptomatte_object_hash(CryptomatteSession *session, const char *layer_name, const Object *object)
uint32_t BKE_cryptomatte_material_hash(CryptomatteSession *session, const char *layer_name, const Material *material)
void *(* MEM_dupallocN)(const void *vmemh)
static bool from_manifest(CryptomatteLayer &layer, blender::StringRefNull manifest)
static constexpr int quoted_string_len_(blender::StringRef ref)
constexpr StringRef WHITESPACES
static std::string unquote_(const blender::StringRef ref)
static constexpr blender::StringRef skip_whitespaces_(blender::StringRef ref)
static std::string to_manifest(const CryptomatteLayer *layer)
CryptomatteLayer * BKE_cryptomatte_layer_get(CryptomatteSession &session, const StringRef layer_name)
StringRef BKE_cryptomatte_extract_layer_name(const StringRef render_pass_name)
std::string BKE_cryptomatte_meta_data_key(const StringRef layer_name, const StringRefNull key_name)
static std::string cryptomatte_layer_name_hash(const StringRef layer_name)
const blender::Vector< std::string > & BKE_cryptomatte_layer_names_get(const CryptomatteSession &session)
CryptomatteSession()=default
blender::Map< std::string, blender::bke::cryptomatte::CryptomatteLayer > layers
std::optional< std::string > operator[](float encoded_hash) const
void init(const ViewLayer *view_layer, bool build_meta_data=false)
blender::bke::cryptomatte::CryptomatteLayer & add_layer(std::string layer_name)
blender::Vector< std::string > layer_names
struct StampData * stamp_data
static CryptomatteHash from_hex_encoded(blender::StringRef hex_encoded)
CryptomatteHash(uint32_t hash)
std::string hex_encoded() const
float float_encoded() const
void add_hash(blender::StringRef name, CryptomatteHash cryptomatte_hash)
blender::Map< std::string, CryptomatteHash > hashes
std::string manifest() const
static void extract_layer_manifest(void *_data, const char *propname, char *propvalue, int propvalue_maxncpy)
static blender::StringRef extract_layer_hash(blender::StringRefNull key)
static void extract_layer_names(void *_data, const char *propname, char *propvalue, int propvalue_maxncpy)
CryptomatteSession * session