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,
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)
struct ViewLayer ViewLayer
struct NodeImageLayer NodeImageLayer
#define RE_PASSNAME_COMBINED
#define RE_PASSNAME_Z
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a color
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Gabor Generate Gabor noise Gradient Generate interpolated color and intensity values based on the input vector Magic Generate a psychedelic color texture Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a vector
struct RenderLayer RenderLayer
struct RenderPass RenderPass
#define output
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
Node(bNode *editor_node, bool create_sockets=true)
Definition COM_Node.cc:18
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)
DataType
possible data types for sockets
Definition COM_defines.h:21
@ Vector
Vector data type.
Definition COM_defines.h:25
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
ListBase view_layers
char name[64]
int16_t custom1
struct ID * id