47 void init(
const ViewLayer *view_layer,
bool build_meta_data =
false);
50 std::optional<std::string>
operator[](
float encoded_hash)
const;
52 MEM_CXX_CLASS_ALLOC_FUNCS(
"cryptomatte:CryptomatteSession")
66 const Object *asset_object =
reinterpret_cast<Object *
>(id);
67 while (asset_object->
parent !=
nullptr) {
68 asset_object = asset_object->
parent;
106 if (build_meta_data) {
111 init(view_layer, build_meta_data);
119 if (cryptoflags == 0) {
129 if (build_meta_data) {
131 objects.
add_ID(base->object->id);
140 if (build_meta_data) {
142 const Object *asset_object = base->object;
143 while (asset_object->
parent !=
nullptr) {
144 asset_object = asset_object->
parent;
155 if (build_meta_data) {
157 for (
int i = 0;
i < base->object->totcol;
i++) {
173 return layers.lookup_or_add_default(layer_name);
179 std::optional<std::string>
result = layer[encoded_hash];
229 const char *layer_name,
238 const char *layer_name,
241 if (material ==
nullptr) {
250 const char *layer_name,
253 const Object *asset_object = object;
254 while (asset_object->
parent !=
nullptr) {
255 asset_object = asset_object->
parent;
266 const float encoded_hash,
270 std::optional<std::string> name = (*session)[encoded_hash];
287 if (
STRNLEN(entry->name) != 0) {
304 if (matte_id ==
nullptr) {
317 std::istringstream ss(matte_id);
321 getline(ss, token,
',');
323 if (token.length() > 0) {
324 size_t first = token.find_first_not_of(
' ');
325 size_t last = token.find_last_not_of(
' ');
326 if (first == std::string::npos || last == std::string::npos) {
329 token = token.substr(first, (last - first + 1));
330 if (*token.begin() ==
'<' && *(--token.end()) ==
'>') {
331 float encoded_hash = atof(token.substr(1, token.length() - 2).c_str());
336 const char *name = token.c_str();
337 int name_len = token.length();
344 if (entry !=
nullptr) {
374 const std::string manifest = layer.
manifest();
399 bool skip_next =
false;
401 char current_char = ref[
len];
406 if (current_char ==
'\\') {
409 if (current_char ==
'\"') {
421 std::ostringstream stream;
439 char front = ref.
front();
443 const int name_len = quoted_name_len - 2;
451 char colon = ref.
front();
463 if (quoted_hash_len < 2) {
466 const int hash_len = quoted_hash_len - 2;
471 else if (front ==
',') {
474 else if (front ==
'}') {
493 bool is_first =
true;
503 manifest << quoted(item.key) <<
":\"" << item.value.hex_encoded() <<
"\"";
519 std::stringstream stream;
521 stream << std::setfill(
'0') << std::setw(
sizeof(uint32_t) * 2) << std::hex
522 << render_pass_identifier;
523 return stream.str().substr(0, 7);
534 while (last_token > 0 && std::isdigit(render_pass_name[last_token - 1])) {
537 return render_pass_name.
substr(0, last_token);
551 std::stringstream encoded;
552 encoded << std::setfill(
'0') << std::setw(
sizeof(uint32_t) * 2) << std::hex <<
hash;
553 return encoded.str();
556std::unique_ptr<CryptomatteLayer> CryptomatteLayer::read_from_manifest(
559 std::unique_ptr<CryptomatteLayer> layer = std::make_unique<CryptomatteLayer>();
564uint32_t CryptomatteLayer::add_ID(
const ID &
id)
566 const char *name = &
id.name[2];
572 return cryptohash_int;
577 hashes.add_overwrite(name, cryptomatte_hash);
580std::optional<std::string> CryptomatteLayer::operator[](
float encoded_hash)
const
585 return std::make_optional(item.key);
591std::string CryptomatteLayer::manifest()
const
608 if (end_index <= start_index) {
611 return key.
substr(start_index + 1, end_index - start_index - 1);
615 const char *propname,
629 data->hash_to_layer_name.add(layer_hash, propvalue);
633 const char *propname,
647 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.
Material * BKE_object_material_get(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)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
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 * STRNCPY(char(&dst)[N], const char *src)
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.
BMesh const char void * data
const Value * lookup_ptr(const Key &key) const
ItemIterator items() 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 const char * data() const
constexpr StringRef drop_prefix(int64_t n) const
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_callocN(size_t len, const char *str)
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)
StringRef BKE_cryptomatte_extract_layer_name(StringRef render_pass_name)
CryptomatteLayer * BKE_cryptomatte_layer_get(CryptomatteSession &session, StringRef layer_name)
static std::string cryptomatte_layer_name_hash(const StringRef layer_name)
std::string BKE_cryptomatte_meta_data_key(StringRef layer_name, StringRefNull key_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
uint32_t add_ID(const ID &id)
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