48 void init(
const ViewLayer *view_layer,
bool build_meta_data =
false);
51 std::optional<std::string>
operator[](
float encoded_hash)
const;
53 MEM_CXX_CLASS_ALLOC_FUNCS(
"cryptomatte:CryptomatteSession")
67 const Object *asset_object =
reinterpret_cast<Object *
>(id);
68 while (asset_object->
parent !=
nullptr) {
69 asset_object = asset_object->
parent;
107 if (build_meta_data) {
112 init(view_layer, build_meta_data);
120 if (cryptoflags == 0) {
132 if (build_meta_data) {
134 objects.
add_ID(base->object->id);
143 if (build_meta_data) {
145 const Object *asset_object = base->object;
146 while (asset_object->
parent !=
nullptr) {
147 asset_object = asset_object->
parent;
158 if (build_meta_data) {
160 for (
int i = 0;
i < base->object->totcol;
i++) {
176 return layers.lookup_or_add_default(layer_name);
182 std::optional<std::string>
result = layer[encoded_hash];
232 const char *layer_name,
241 const char *layer_name,
244 if (material ==
nullptr) {
253 const char *layer_name,
256 const Object *asset_object = object;
257 while (asset_object->
parent !=
nullptr) {
258 asset_object = asset_object->
parent;
269 const float encoded_hash,
273 std::optional<std::string>
name = (*session)[encoded_hash];
290 if (entry->name[0] !=
'\0') {
307 if (matte_id ==
nullptr) {
320 std::istringstream ss(matte_id);
324 getline(ss, token,
',');
326 if (token.length() > 0) {
327 size_t first = token.find_first_not_of(
' ');
328 size_t last = token.find_last_not_of(
' ');
329 if (first == std::string::npos || last == std::string::npos) {
332 token = token.substr(first, (last - first + 1));
333 if (*token.begin() ==
'<' && *(--token.end()) ==
'>') {
334 float encoded_hash = atof(token.substr(1, token.length() - 2).c_str());
339 const char *
name = token.c_str();
340 int name_len = token.length();
347 if (entry !=
nullptr) {
377 const std::string manifest = layer.
manifest();
402 bool skip_next =
false;
404 char current_char = ref[
len];
409 if (current_char ==
'\\') {
412 if (current_char ==
'\"') {
424 std::ostringstream stream;
442 char front = ref.
front();
446 const int name_len = quoted_name_len - 2;
454 char colon = ref.
front();
466 if (quoted_hash_len < 2) {
469 const int hash_len = quoted_hash_len - 2;
474 else if (front ==
',') {
477 else if (front ==
'}') {
496 bool is_first =
true;
506 manifest << quoted(item.key) <<
":\"" << item.value.hex_encoded() <<
"\"";
522 std::stringstream stream;
524 stream << std::setfill(
'0') << std::setw(
sizeof(uint32_t) * 2) << std::hex
525 << render_pass_identifier;
526 return stream.str().substr(0, 7);
537 while (last_token > 0 && std::isdigit(render_pass_name[last_token - 1])) {
540 return render_pass_name.
substr(0, last_token);
554 std::stringstream encoded;
555 encoded << std::setfill(
'0') << std::setw(
sizeof(uint32_t) * 2) << std::hex <<
hash;
556 return encoded.str();
559std::unique_ptr<CryptomatteLayer> CryptomatteLayer::read_from_manifest(
562 std::unique_ptr<CryptomatteLayer> layer = std::make_unique<CryptomatteLayer>();
567uint32_t CryptomatteLayer::add_ID(
const ID &
id)
569 const char *
name = &
id.name[2];
575 return cryptohash_int;
583std::optional<std::string> CryptomatteLayer::operator[](
float encoded_hash)
const
588 return std::make_optional(item.key);
594std::string CryptomatteLayer::manifest()
const
611 if (end_index <= start_index) {
614 return key.
substr(start_index + 1, end_index - start_index - 1);
618 const char *propname,
632 data->hash_to_layer_name.add(layer_hash, propvalue);
636 const char *propname,
650 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_utf8(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