Blender V4.3
COM_RenderLayersProg.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6
7#include "BLI_math_interp.hh"
8#include "BLI_string.h"
9
10#include "BKE_image.hh"
11
12namespace blender::compositor {
13
14/* ******** Render Layers Base Prog ******** */
15
16RenderLayersProg::RenderLayersProg(const char *pass_name, DataType type, int elementsize)
17 : pass_name_(pass_name)
18{
19 this->set_scene(nullptr);
20 input_buffer_ = nullptr;
21 elementsize_ = elementsize;
22 rd_ = nullptr;
23 layer_buffer_ = nullptr;
24
25 this->add_output_socket(type);
26}
27
29{
30 Scene *scene = this->get_scene();
31 Render *re = (scene) ? RE_GetSceneRender(scene) : nullptr;
32 RenderResult *rr = nullptr;
33
34 if (re) {
35 rr = RE_AcquireResultRead(re);
36 }
37
38 if (rr) {
39 ViewLayer *view_layer = (ViewLayer *)BLI_findlink(&scene->view_layers, get_layer_id());
40 if (view_layer) {
41
42 RenderLayer *rl = RE_GetRenderLayer(rr, view_layer->name);
43 if (rl) {
45 if (input_buffer_) {
47 }
48 }
49 }
50 }
51 if (re) {
53 re = nullptr;
54 }
55}
56
58{
59 input_buffer_ = nullptr;
60 if (layer_buffer_) {
61 delete layer_buffer_;
62 layer_buffer_ = nullptr;
63 }
64}
65
66void RenderLayersProg::determine_canvas(const rcti & /*preferred_area*/, rcti &r_area)
67{
68 Scene *sce = this->get_scene();
69 Render *re = (sce) ? RE_GetSceneRender(sce) : nullptr;
70 RenderResult *rr = nullptr;
71
72 r_area = COM_AREA_NONE;
73
74 if (re) {
75 rr = RE_AcquireResultRead(re);
76 }
77
78 if (rr) {
79 ViewLayer *view_layer = (ViewLayer *)BLI_findlink(&sce->view_layers, get_layer_id());
80 if (view_layer) {
81 RenderLayer *rl = RE_GetRenderLayer(rr, view_layer->name);
82 if (rl) {
83 BLI_rcti_init(&r_area, 0, rl->rectx, 0, rl->recty);
84 }
85 }
86 }
87
88 if (re) {
90 }
91}
92
93std::unique_ptr<MetaData> RenderLayersProg::get_meta_data()
94{
95 Scene *scene = this->get_scene();
96 Render *re = (scene) ? RE_GetSceneRender(scene) : nullptr;
97 RenderResult *render_result = nullptr;
98 MetaDataExtractCallbackData callback_data = {std::make_unique<MetaData>()};
99
100 if (re) {
101 render_result = RE_AcquireResultRead(re);
102 }
103
104 if (render_result && render_result->stamp_data) {
105 ViewLayer *view_layer = (ViewLayer *)BLI_findlink(&scene->view_layers, get_layer_id());
106 if (view_layer) {
107 std::string full_layer_name = std::string(
108 view_layer->name,
109 BLI_strnlen(view_layer->name, sizeof(view_layer->name))) +
110 "." + pass_name_;
111 blender::StringRef cryptomatte_layer_name =
113 callback_data.set_cryptomatte_keys(cryptomatte_layer_name);
114
115 BKE_stamp_info_callback(&callback_data,
116 render_result->stamp_data,
118 false);
119
120 RenderLayer *render_layer = RE_GetRenderLayer(render_result, view_layer->name);
121 if (render_layer) {
122 RenderPass *render_pass = RE_pass_find_by_name(
123 render_layer, pass_name_.c_str(), view_name_);
124 if (render_pass) {
125 if (StringRef(render_pass->chan_id) == "XYZW") {
126 callback_data.meta_data->is_4d_vector = true;
127 }
128 }
129 }
130 }
131 }
132
133 if (re) {
135 re = nullptr;
136 }
137
138 return std::move(callback_data.meta_data);
139}
140
142 const rcti &area,
143 Span<MemoryBuffer *> /*inputs*/)
144{
145 BLI_assert(output->get_num_channels() >= elementsize_);
146 if (layer_buffer_) {
147 output->copy_from(layer_buffer_, area, 0, elementsize_, 0);
148 }
149 else {
150 std::unique_ptr<float[]> zero_elem = std::make_unique<float[]>(elementsize_);
151 output->fill(area, 0, zero_elem.get(), elementsize_);
152 }
153}
154
155/* ******** Render Layers AO Operation ******** */
156
158 const rcti &area,
159 Span<MemoryBuffer *> /*inputs*/)
160{
161 BLI_assert(output->get_num_channels() == COM_DATA_TYPE_COLOR_CHANNELS);
163 if (layer_buffer_) {
164 output->copy_from(layer_buffer_, area, 0, COM_DATA_TYPE_VECTOR_CHANNELS, 0);
165 }
166 else {
167 output->fill(area, 0, COM_VECTOR_ZERO, COM_DATA_TYPE_VECTOR_CHANNELS);
168 }
169 output->fill(area, 3, COM_VALUE_ONE, COM_DATA_TYPE_VALUE_CHANNELS);
170}
171
172/* ******** Render Layers Alpha Operation ******** */
173
175 const rcti &area,
176 Span<MemoryBuffer *> /*inputs*/)
177{
178 BLI_assert(output->get_num_channels() == COM_DATA_TYPE_VALUE_CHANNELS);
180 if (layer_buffer_) {
181 output->copy_from(layer_buffer_, area, 3, COM_DATA_TYPE_VALUE_CHANNELS, 0);
182 }
183 else {
184 output->fill(area, COM_VALUE_ZERO);
185 }
186}
187
188/* ******** Render Layers Depth Operation ******** */
189
191 const rcti &area,
192 Span<MemoryBuffer *> /*inputs*/)
193{
194 BLI_assert(output->get_num_channels() == COM_DATA_TYPE_VALUE_CHANNELS);
196 if (layer_buffer_) {
197 output->copy_from(layer_buffer_, area);
198 }
199 else {
200 const float default_depth = 10e10f;
201 output->fill(area, &default_depth);
202 }
203}
204
205} // namespace blender::compositor
void BKE_stamp_info_callback(void *data, StampData *stamp_data, StampCallback callback, bool noskip)
#define BLI_assert(a)
Definition BLI_assert.h:50
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_rcti_init(struct rcti *rect, int xmin, int xmax, int ymin, int ymax)
Definition rct.c:418
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
a MemoryBuffer contains access to the data
void add_output_socket(DataType datatype)
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
RenderLayersProg(const char *pass_name, DataType type, int elementsize)
std::unique_ptr< MetaData > get_meta_data() override
const RenderData * rd_
render data used for active rendering
virtual void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void determine_canvas(const rcti &preferred_area, rcti &r_area) override
DataType
possible data types for sockets
Definition COM_defines.h:21
StringRef BKE_cryptomatte_extract_layer_name(const StringRef render_pass_name)
constexpr float COM_VECTOR_ZERO[3]
Definition COM_defines.h:62
constexpr int COM_DATA_TYPE_VALUE_CHANNELS
Definition COM_defines.h:55
constexpr int COM_DATA_TYPE_COLOR_CHANNELS
Definition COM_defines.h:58
constexpr float COM_VALUE_ZERO[1]
Definition COM_defines.h:64
constexpr rcti COM_AREA_NONE
Definition COM_defines.h:89
constexpr float COM_VALUE_ONE[1]
Definition COM_defines.h:65
constexpr int COM_DATA_TYPE_VECTOR_CHANNELS
Definition COM_defines.h:57
RenderPass * RE_pass_find_by_name(RenderLayer *rl, const char *name, const char *viewname)
RenderResult * RE_AcquireResultRead(Render *re)
RenderLayer * RE_GetRenderLayer(RenderResult *rr, const char *name)
void RE_ReleaseResult(Render *re)
Render * RE_GetSceneRender(const Scene *scene)
float * RE_RenderLayerGetPass(RenderLayer *rl, const char *name, const char *viewname)
char chan_id[8]
Definition RE_pipeline.h:59
struct StampData * stamp_data
ListBase view_layers
char name[64]
static void extract_cryptomatte_meta_data(void *_data, const char *propname, char *propvalue, int)
void set_cryptomatte_keys(blender::StringRef cryptomatte_layer_name)