Blender V5.0
eevee_cryptomatte.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4#include "BKE_cryptomatte.hh"
5
7#include "eevee_instance.hh"
9
10namespace blender::eevee {
11
13{
14 const eViewLayerEEVEEPassType enabled_passes = (inst_.film.enabled_passes_get() &
18
19 session_.reset();
20 object_layer_ = nullptr;
21 asset_layer_ = nullptr;
22 material_layer_ = nullptr;
23
24 if (enabled_passes && !inst_.is_viewport()) {
25 session_.reset(BKE_cryptomatte_init_from_view_layer(inst_.view_layer));
26
27 for (const std::string &layer_name :
29 {
30 StringRef layer_name_ref = layer_name;
32 *session_, layer_name);
33 if (layer_name_ref.endswith(RE_PASSNAME_CRYPTOMATTE_OBJECT)) {
34 object_layer_ = layer;
35 }
36 else if (layer_name_ref.endswith(RE_PASSNAME_CRYPTOMATTE_ASSET)) {
37 asset_layer_ = layer;
38 }
39 else if (layer_name_ref.endswith(RE_PASSNAME_CRYPTOMATTE_MATERIAL)) {
40 material_layer_ = layer;
41 }
42 }
43 }
44
45 if (!(enabled_passes &
47 {
48 /* Ensure dummy buffer for API validation. */
49 cryptomatte_object_buf.resize(16);
50 }
51}
52
54{
55 const eViewLayerEEVEEPassType enabled_passes = inst_.film.enabled_passes_get();
56 if (!(enabled_passes &
58 {
59 return;
60 }
61
62 uint32_t resource_id = res_handle.resource_index();
63 float2 object_hashes(0.0f, 0.0f);
64
67 }
68
70 Object *asset = ob;
71 while (asset->parent) {
72 asset = asset->parent;
73 }
74 object_hashes[1] = register_id(EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET, asset->id);
75 }
76 cryptomatte_object_buf.get_or_resize(resource_id) = object_hashes;
77}
78
79void Cryptomatte::sync_material(const ::Material *material)
80{
81 /* Material crypto hashes are generated during shader codegen stage. We only need to register
82 * them to store inside the metadata. */
83 if (material_layer_ && material) {
84 material_layer_->add_ID(material->id);
85 }
86}
87
89{
90 cryptomatte_object_buf.push_update();
91
92 object_layer_ = nullptr;
93 asset_layer_ = nullptr;
94 material_layer_ = nullptr;
95}
96
97float Cryptomatte::register_id(const eViewLayerEEVEEPassType layer, const ID &id) const
98{
99 BLI_assert(ELEM(layer,
103
104 uint32_t cryptomatte_hash = 0;
105 if (session_) {
107 BLI_assert(object_layer_);
108 cryptomatte_hash = object_layer_->add_ID(id);
109 }
110 else if (layer == EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET) {
111 BLI_assert(asset_layer_);
112 cryptomatte_hash = asset_layer_->add_ID(id);
113 }
114 else if (layer == EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL) {
115 BLI_assert(material_layer_);
116 cryptomatte_hash = material_layer_->add_ID(id);
117 }
118 }
119 else {
120 const char *name = &id.name[2];
121 const int name_len = BLI_strnlen(name, MAX_NAME - 2);
122 cryptomatte_hash = BKE_cryptomatte_hash(name, name_len);
123 }
124
125 return BKE_cryptomatte_hash_to_float(cryptomatte_hash);
126}
127
129{
130 if (session_) {
131 BKE_cryptomatte_store_metadata(&*session_, render_result);
132 }
133}
134
135} // namespace blender::eevee
void BKE_cryptomatte_store_metadata(const struct CryptomatteSession *session, struct RenderResult *render_result)
float BKE_cryptomatte_hash_to_float(uint32_t cryptomatte_hash)
struct CryptomatteSession * BKE_cryptomatte_init_from_view_layer(const struct ViewLayer *view_layer)
uint32_t BKE_cryptomatte_hash(const char *name, int name_len)
#define BLI_assert(a)
Definition BLI_assert.h:46
int char char int int int int size_t BLI_strnlen(const char *str, size_t maxlen) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition string.cc:913
#define ELEM(...)
#define MAX_NAME
Definition DNA_defs.h:50
eViewLayerEEVEEPassType
@ EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL
@ EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT
@ EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET
#define RE_PASSNAME_CRYPTOMATTE_MATERIAL
#define RE_PASSNAME_CRYPTOMATTE_ASSET
#define RE_PASSNAME_CRYPTOMATTE_OBJECT
constexpr bool endswith(StringRef suffix) const
float register_id(const eViewLayerEEVEEPassType layer, const ID &id) const
void store_metadata(RenderResult *render_result)
void sync_material(const ::Material *material)
void sync_object(Object *ob, ResourceHandleRange res_handle)
CryptomatteLayer * BKE_cryptomatte_layer_get(CryptomatteSession &session, StringRef layer_name)
const blender::Vector< std::string > & BKE_cryptomatte_layer_names_get(const CryptomatteSession &session)
static eViewLayerEEVEEPassType enabled_passes(const ViewLayer *view_layer)
VecBase< float, 2 > float2
const char * name
Definition DNA_ID.h:414
struct Object * parent