Blender V4.3
COM_RenderLayersNode.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
9
10namespace blender::compositor {
11
12RenderLayersNode::RenderLayersNode(bNode *editor_node) : Node(editor_node)
13{
14 /* pass */
15}
16
17void RenderLayersNode::test_socket_link(NodeConverter &converter,
18 const CompositorContext &context,
19 NodeOutput *output,
20 RenderLayersProg *operation,
21 Scene *scene,
22 int layer_id,
23 bool is_preview) const
24{
25 operation->set_scene(scene);
26 operation->set_layer_id(layer_id);
27 operation->set_render_data(context.get_render_data());
28 operation->set_view_name(context.get_view_name());
29
30 converter.map_output_socket(output, operation->get_output_socket());
31 converter.add_operation(operation);
32
33 if (is_preview) { /* only for image socket */
34 converter.add_preview(operation->get_output_socket());
35 }
36}
37
38void RenderLayersNode::test_render_link(NodeConverter &converter,
39 const CompositorContext &context,
40 Render *re) const
41{
42 Scene *scene = (Scene *)this->get_bnode()->id;
43 const short layer_id = this->get_bnode()->custom1;
45 if (rr == nullptr) {
46 missing_render_link(converter);
47 return;
48 }
49 ViewLayer *view_layer = (ViewLayer *)BLI_findlink(&scene->view_layers, layer_id);
50 if (view_layer == nullptr) {
51 missing_render_link(converter);
52 return;
53 }
54 RenderLayer *rl = RE_GetRenderLayer(rr, view_layer->name);
55 if (rl == nullptr) {
56 missing_render_link(converter);
57 return;
58 }
59
60 for (NodeOutput *output : get_output_sockets()) {
61 NodeImageLayer *storage = (NodeImageLayer *)output->get_bnode_socket()->storage;
63 &rl->passes, storage->pass_name, offsetof(RenderPass, name));
64 if (rpass == nullptr) {
65 missing_socket_link(converter, output);
66 continue;
67 }
68 RenderLayersProg *operation;
69 bool is_preview;
70 if (STREQ(rpass->name, RE_PASSNAME_COMBINED) &&
71 STREQ(output->get_bnode_socket()->name, "Alpha"))
72 {
73 operation = new RenderLayersAlphaProg(rpass->name, DataType::Value, rpass->channels);
74 is_preview = false;
75 }
76 else if (STREQ(rpass->name, RE_PASSNAME_Z)) {
77 operation = new RenderLayersDepthProg(rpass->name, DataType::Value, rpass->channels);
78 is_preview = false;
79 }
80 else {
81 DataType type;
82 switch (rpass->channels) {
83 case 4:
84 type = DataType::Color;
85 break;
86 case 3:
87 type = DataType::Vector;
88 break;
89 case 1:
90 type = DataType::Value;
91 break;
92 default:
93 BLI_assert_msg(0, "Unexpected number of channels for pass");
94 type = DataType::Value;
95 break;
96 }
97 operation = new RenderLayersProg(rpass->name, type, rpass->channels);
98 is_preview = STREQ(output->get_bnode_socket()->name, "Image");
99 }
100 test_socket_link(converter, context, output, operation, scene, layer_id, is_preview);
101 }
102}
103
104void RenderLayersNode::missing_socket_link(NodeConverter &converter, NodeOutput *output) const
105{
106 NodeOperation *operation;
107 switch (output->get_data_type()) {
108 case DataType::Color: {
109 const float color[4] = {0.0f, 0.0f, 0.0f, 0.0f};
110 SetColorOperation *color_operation = new SetColorOperation();
111 color_operation->set_channels(color);
112 operation = color_operation;
113 break;
114 }
115 case DataType::Vector: {
116 const float vector[3] = {0.0f, 0.0f, 0.0f};
117 SetVectorOperation *vector_operation = new SetVectorOperation();
118 vector_operation->set_vector(vector);
119 operation = vector_operation;
120 break;
121 }
122 case DataType::Value: {
123 SetValueOperation *value_operation = new SetValueOperation();
124 value_operation->set_value(0.0f);
125 operation = value_operation;
126 break;
127 }
128 default: {
129 BLI_assert_msg(0, "Unexpected data type");
130 return;
131 }
132 }
133
134 converter.map_output_socket(output, operation->get_output_socket());
135 converter.add_operation(operation);
136}
137
138void RenderLayersNode::missing_render_link(NodeConverter &converter) const
139{
140 for (NodeOutput *output : outputs_) {
141 missing_socket_link(converter, output);
142 }
143}
144
146 const CompositorContext &context) const
147{
148 Scene *scene = (Scene *)this->get_bnode()->id;
149 Render *re = (scene) ? RE_GetSceneRender(scene) : nullptr;
150
151 if (re != nullptr) {
152 test_render_link(converter, context, re);
154 }
155 else {
156 missing_render_link(converter);
157 }
158}
159
160} // namespace blender::compositor
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:57
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define STREQ(a, b)
#define RE_PASSNAME_COMBINED
#define RE_PASSNAME_Z
Overall context of the compositor.
void map_output_socket(NodeOutput *node_socket, NodeOperationOutput *operation_socket)
void add_preview(NodeOperationOutput *output)
void add_operation(NodeOperation *operation)
NodeOperationOutput * get_output_socket(unsigned int index=0)
NodeOutput are sockets that can send data/input.
Definition COM_Node.h:239
const bNode * get_bnode() const
get the reference to the SDNA bNode struct
Definition COM_Node.h:65
Span< NodeOutput * > get_output_sockets() const
get access to the vector of input sockets
Definition COM_Node.h:109
Vector< NodeOutput * > outputs_
the list of actual output-sockets
Definition COM_Node.h:56
void convert_to_operations(NodeConverter &converter, const CompositorContext &context) const override
convert node to operation
void set_view_name(const char *view_name)
void set_render_data(const RenderData *rd)
#define offsetof(t, d)
@ Vector
Vector data type.
RenderResult * RE_AcquireResultRead(Render *re)
RenderLayer * RE_GetRenderLayer(RenderResult *rr, const char *name)
void RE_ReleaseResult(Render *re)
Render * RE_GetSceneRender(const Scene *scene)
ListBase passes
Definition RE_pipeline.h:97
char name[64]
Definition RE_pipeline.h:58
char name[64]
int16_t custom1
struct ID * id