Blender  V3.3
COM_RenderLayersNode.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2011 Blender Foundation. */
3 
4 #include "COM_RenderLayersNode.h"
8 
9 namespace blender::compositor {
10 
11 RenderLayersNode::RenderLayersNode(bNode *editor_node) : Node(editor_node)
12 {
13  /* pass */
14 }
15 
16 void RenderLayersNode::test_socket_link(NodeConverter &converter,
19  RenderLayersProg *operation,
20  Scene *scene,
21  int layer_id,
22  bool is_preview) const
23 {
24  operation->set_scene(scene);
25  operation->set_layer_id(layer_id);
26  operation->set_render_data(context.get_render_data());
27  operation->set_view_name(context.get_view_name());
28 
29  converter.map_output_socket(output, operation->get_output_socket());
30  converter.add_operation(operation);
31 
32  if (is_preview) { /* only for image socket */
33  converter.add_preview(operation->get_output_socket());
34  }
35 }
36 
37 void RenderLayersNode::test_render_link(NodeConverter &converter,
38  const CompositorContext &context,
39  Render *re) const
40 {
41  Scene *scene = (Scene *)this->get_bnode()->id;
42  const short layer_id = this->get_bnode()->custom1;
44  if (rr == nullptr) {
45  missing_render_link(converter);
46  return;
47  }
48  ViewLayer *view_layer = (ViewLayer *)BLI_findlink(&scene->view_layers, layer_id);
49  if (view_layer == nullptr) {
50  missing_render_link(converter);
51  return;
52  }
53  RenderLayer *rl = RE_GetRenderLayer(rr, view_layer->name);
54  if (rl == nullptr) {
55  missing_render_link(converter);
56  return;
57  }
58 
59  for (NodeOutput *output : get_output_sockets()) {
60  NodeImageLayer *storage = (NodeImageLayer *)output->get_bnode_socket()->storage;
62  &rl->passes, storage->pass_name, offsetof(RenderPass, name));
63  if (rpass == nullptr) {
64  missing_socket_link(converter, output);
65  continue;
66  }
67  RenderLayersProg *operation;
68  bool is_preview;
69  if (STREQ(rpass->name, RE_PASSNAME_COMBINED) &&
70  STREQ(output->get_bnode_socket()->name, "Alpha")) {
71  operation = new RenderLayersAlphaProg(rpass->name, DataType::Value, rpass->channels);
72  is_preview = false;
73  }
74  else if (STREQ(rpass->name, RE_PASSNAME_Z)) {
75  operation = new RenderLayersDepthProg(rpass->name, DataType::Value, rpass->channels);
76  is_preview = false;
77  }
78  else {
79  DataType type;
80  switch (rpass->channels) {
81  case 4:
83  break;
84  case 3:
86  break;
87  case 1:
89  break;
90  default:
91  BLI_assert_msg(0, "Unexpected number of channels for pass");
93  break;
94  }
95  operation = new RenderLayersProg(rpass->name, type, rpass->channels);
96  is_preview = STREQ(output->get_bnode_socket()->name, "Image");
97  }
98  test_socket_link(converter, context, output, operation, scene, layer_id, is_preview);
99  }
100 }
101 
102 void RenderLayersNode::missing_socket_link(NodeConverter &converter, NodeOutput *output) const
103 {
104  NodeOperation *operation;
105  switch (output->get_data_type()) {
106  case DataType::Color: {
107  const float color[4] = {0.0f, 0.0f, 0.0f, 0.0f};
108  SetColorOperation *color_operation = new SetColorOperation();
109  color_operation->set_channels(color);
110  operation = color_operation;
111  break;
112  }
113  case DataType::Vector: {
114  const float vector[3] = {0.0f, 0.0f, 0.0f};
115  SetVectorOperation *vector_operation = new SetVectorOperation();
116  vector_operation->set_vector(vector);
117  operation = vector_operation;
118  break;
119  }
120  case DataType::Value: {
121  SetValueOperation *value_operation = new SetValueOperation();
122  value_operation->set_value(0.0f);
123  operation = value_operation;
124  break;
125  }
126  default: {
127  BLI_assert_msg(0, "Unexpected data type");
128  return;
129  }
130  }
131 
132  converter.map_output_socket(output, operation->get_output_socket());
133  converter.add_operation(operation);
134 }
135 
136 void RenderLayersNode::missing_render_link(NodeConverter &converter) const
137 {
138  for (NodeOutput *output : outputs_) {
139  missing_socket_link(converter, output);
140  }
141 }
142 
144  const CompositorContext &context) const
145 {
146  Scene *scene = (Scene *)this->get_bnode()->id;
147  Render *re = (scene) ? RE_GetSceneRender(scene) : nullptr;
148 
149  if (re != nullptr) {
150  test_render_link(converter, context, re);
151  RE_ReleaseResult(re);
152  }
153  else {
154  missing_render_link(converter);
155  }
156 }
157 
158 } // namespace blender::compositor
#define BLI_assert_msg(a, msg)
Definition: BLI_assert.h:53
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define STREQ(a, b)
#define RE_PASSNAME_COMBINED
#define RE_PASSNAME_Z
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
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 Bright Control the brightness and contrast of the input color Vector Map an input vectors to used to fine tune the interpolation of the input 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 a color
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:238
bNode * get_bnode() const
get the reference to the SDNA bNode struct
Definition: COM_Node.h:64
const Vector< NodeOutput * > & get_output_sockets() const
get access to the vector of input sockets
Definition: COM_Node.h:108
Vector< NodeOutput * > outputs_
the list of actual output-sockets
Definition: COM_Node.h:55
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)
Scene scene
@ Vector
Vector data type.
ccl_global KernelShaderEvalInput ccl_global float * output
RenderResult * RE_AcquireResultRead(Render *re)
Definition: pipeline.c:314
Render * RE_GetSceneRender(const Scene *scene)
Definition: pipeline.c:551
RenderLayer * RE_GetRenderLayer(RenderResult *rr, const char *name)
Definition: pipeline.c:244
void RE_ReleaseResult(Render *re)
Definition: pipeline.c:351
char pass_name[64]
ListBase passes
Definition: RE_pipeline.h:95
char name[64]
Definition: RE_pipeline.h:65
int channels
Definition: RE_pipeline.h:64
ListBase view_layers
char name[64]
short custom1
struct ID * id