Blender V4.3
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
6#include "GPU_material.hh"
7
9#include "eevee_instance.hh"
11
12namespace blender::eevee {
13
15{
17 inst_.film.enabled_passes_get() &
20
21 session_.reset();
22 object_layer_ = nullptr;
23 asset_layer_ = nullptr;
24 material_layer_ = nullptr;
25
26 if (enabled_passes && !inst_.is_viewport()) {
28
29 for (const std::string &layer_name :
31 {
32 StringRef layer_name_ref = layer_name;
34 *session_, layer_name);
35 if (layer_name_ref.endswith(RE_PASSNAME_CRYPTOMATTE_OBJECT)) {
36 object_layer_ = layer;
37 }
38 else if (layer_name_ref.endswith(RE_PASSNAME_CRYPTOMATTE_ASSET)) {
39 asset_layer_ = layer;
40 }
41 else if (layer_name_ref.endswith(RE_PASSNAME_CRYPTOMATTE_MATERIAL)) {
42 material_layer_ = layer;
43 }
44 }
45 }
46
47 if (!(enabled_passes &
49 {
50 /* Ensure dummy buffer for API validation. */
51 cryptomatte_object_buf.resize(16);
52 }
53}
54
56{
58 if (!(enabled_passes &
60 {
61 return;
62 }
63
64 uint32_t resource_id = res_handle.resource_index();
65 float2 object_hashes(0.0f, 0.0f);
66
69 }
70
72 Object *asset = ob;
73 while (asset->parent) {
74 asset = asset->parent;
75 }
76 object_hashes[1] = register_id(EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET, asset->id);
77 }
78 cryptomatte_object_buf.get_or_resize(resource_id) = object_hashes;
79}
80
81void Cryptomatte::sync_material(const ::Material *material)
82{
83 /* Material crypto hashes are generated during shader codegen stage. We only need to register
84 * them to store inside the metadata. */
85 if (material_layer_ && material) {
86 material_layer_->add_ID(material->id);
87 }
88}
89
91{
92 cryptomatte_object_buf.push_update();
93
94 object_layer_ = nullptr;
95 asset_layer_ = nullptr;
96 material_layer_ = nullptr;
97}
98
99float Cryptomatte::register_id(const eViewLayerEEVEEPassType layer, const ID &id) const
100{
101 BLI_assert(ELEM(layer,
105
106 uint32_t cryptomatte_hash = 0;
107 if (session_) {
109 BLI_assert(object_layer_);
110 cryptomatte_hash = object_layer_->add_ID(id);
111 }
112 else if (layer == EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET) {
113 BLI_assert(asset_layer_);
114 cryptomatte_hash = asset_layer_->add_ID(id);
115 }
116 else if (layer == EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL) {
117 BLI_assert(material_layer_);
118 cryptomatte_hash = material_layer_->add_ID(id);
119 }
120 }
121 else {
122 const char *name = &id.name[2];
123 const int name_len = BLI_strnlen(name, MAX_NAME - 2);
124 cryptomatte_hash = BKE_cryptomatte_hash(name, name_len);
125 }
126
127 return BKE_cryptomatte_hash_to_float(cryptomatte_hash);
128}
129
131{
132 if (session_) {
133 BKE_cryptomatte_store_metadata(&*session_, render_result);
134 }
135}
136
137} // 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:50
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.c:909
#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 sync_object(Object *ob, ResourceHandle res_handle)
void store_metadata(RenderResult *render_result)
void sync_material(const ::Material *material)
eViewLayerEEVEEPassType enabled_passes_get() const
CryptomatteLayer * BKE_cryptomatte_layer_get(CryptomatteSession &session, const StringRef layer_name)
const blender::Vector< std::string > & BKE_cryptomatte_layer_names_get(const CryptomatteSession &session)
static eViewLayerEEVEEPassType enabled_passes(const ViewLayer *view_layer)
unsigned int uint32_t
Definition stdint.h:80
Definition DNA_ID.h:413
struct Object * parent