Blender  V3.3
node_composite_image.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2006 Blender Foundation. All rights reserved. */
3 
8 #include "node_composite_util.hh"
9 
10 #include "BLI_linklist.h"
11 #include "BLI_utildefines.h"
12 
13 #include "BKE_context.h"
14 #include "BKE_global.h"
15 #include "BKE_image.h"
16 #include "BKE_lib_id.h"
17 #include "BKE_main.h"
18 #include "BKE_scene.h"
19 
20 #include "DNA_scene_types.h"
21 
22 #include "RE_engine.h"
23 #include "RE_pipeline.h"
24 
25 #include "RNA_access.h"
26 
27 #include "UI_interface.h"
28 #include "UI_resources.h"
29 
30 /* **************** IMAGE (and RenderResult, multilayer image) ******************** */
31 
33  {SOCK_RGBA, N_("Image"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
34  {SOCK_FLOAT, N_("Alpha"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
35  {SOCK_FLOAT, N_(RE_PASSNAME_Z), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
36  {SOCK_VECTOR, N_(RE_PASSNAME_NORMAL), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
37  {SOCK_VECTOR, N_(RE_PASSNAME_UV), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
38  {SOCK_VECTOR, N_(RE_PASSNAME_VECTOR), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
39  {SOCK_VECTOR, N_(RE_PASSNAME_POSITION), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
40  {SOCK_RGBA, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
41  {SOCK_RGBA, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
42  {SOCK_RGBA, N_(RE_PASSNAME_SHADOW), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
43  {SOCK_RGBA, N_(RE_PASSNAME_AO), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
44  {SOCK_RGBA, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
45  {SOCK_RGBA, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
46  {SOCK_RGBA, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
47  {SOCK_FLOAT, N_(RE_PASSNAME_INDEXOB), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
48  {SOCK_FLOAT, N_(RE_PASSNAME_INDEXMA), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
49  {SOCK_FLOAT, N_(RE_PASSNAME_MIST), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
50  {SOCK_RGBA, N_(RE_PASSNAME_EMIT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
51  {SOCK_RGBA, N_(RE_PASSNAME_ENVIRONMENT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
52  {SOCK_RGBA, N_(RE_PASSNAME_DIFFUSE_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
53  {SOCK_RGBA, N_(RE_PASSNAME_DIFFUSE_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
54  {SOCK_RGBA, N_(RE_PASSNAME_DIFFUSE_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
55  {SOCK_RGBA, N_(RE_PASSNAME_GLOSSY_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
56  {SOCK_RGBA, N_(RE_PASSNAME_GLOSSY_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
57  {SOCK_RGBA, N_(RE_PASSNAME_GLOSSY_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
58  {SOCK_RGBA, N_(RE_PASSNAME_TRANSM_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
59  {SOCK_RGBA, N_(RE_PASSNAME_TRANSM_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
60  {SOCK_RGBA, N_(RE_PASSNAME_TRANSM_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
61  {SOCK_RGBA, N_(RE_PASSNAME_SUBSURFACE_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
62  {SOCK_RGBA, N_(RE_PASSNAME_SUBSURFACE_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
63  {SOCK_RGBA, N_(RE_PASSNAME_SUBSURFACE_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
64  {-1, ""},
65 };
66 #define NUM_LEGACY_SOCKETS (ARRAY_SIZE(cmp_node_rlayers_out) - 1)
67 
69  bNode *node,
70  const char *name,
71  const char *passname,
72  int rres_index,
74  int UNUSED(is_rlayers),
75  LinkNodePair *available_sockets,
76  int *prev_index)
77 {
79  &node->outputs, name, offsetof(bNodeSocket, name));
80 
81  /* Replace if types don't match. */
82  if (sock && sock->type != type) {
83  nodeRemoveSocket(ntree, node, sock);
84  sock = nullptr;
85  }
86 
87  /* Create socket if it doesn't exist yet. */
88  if (sock == nullptr) {
89  if (rres_index >= 0) {
91  ntree, node, &cmp_node_rlayers_out[rres_index], SOCK_OUT);
92  }
93  else {
94  sock = nodeAddStaticSocket(ntree, node, SOCK_OUT, type, PROP_NONE, name, name);
95  }
96  /* extra socket info */
97  NodeImageLayer *sockdata = MEM_cnew<NodeImageLayer>(__func__);
98  sock->storage = sockdata;
99  }
100 
101  NodeImageLayer *sockdata = (NodeImageLayer *)sock->storage;
102  if (sockdata) {
103  BLI_strncpy(sockdata->pass_name, passname, sizeof(sockdata->pass_name));
104  }
105 
106  /* Reorder sockets according to order that passes are added. */
107  const int after_index = (*prev_index)++;
108  bNodeSocket *after_sock = (bNodeSocket *)BLI_findlink(&node->outputs, after_index);
109  BLI_remlink(&node->outputs, sock);
110  BLI_insertlinkafter(&node->outputs, after_sock, sock);
111 
112  BLI_linklist_append(available_sockets, sock);
113 }
114 
116  bNode *node,
117  LinkNodePair *available_sockets)
118 {
119  Image *ima = (Image *)node->id;
120  ImBuf *ibuf;
121  int prev_index = -1;
122  if (ima) {
123  ImageUser *iuser = (ImageUser *)node->storage;
124  ImageUser load_iuser = {nullptr};
126 
127  /* It is possible that image user in this node is not
128  * properly updated yet. In this case loading image will
129  * fail and sockets detection will go wrong.
130  *
131  * So we manually construct image user to be sure first
132  * image from sequence (that one which is set as filename
133  * for image data-block) is used for sockets detection. */
134  load_iuser.framenr = offset;
135 
136  /* make sure ima->type is correct */
137  ibuf = BKE_image_acquire_ibuf(ima, &load_iuser, nullptr);
138 
139  if (ima->rr) {
140  RenderLayer *rl = (RenderLayer *)BLI_findlink(&ima->rr->layers, iuser->layer);
141 
142  if (rl) {
143  LISTBASE_FOREACH (RenderPass *, rpass, &rl->passes) {
145  if (rpass->channels == 1) {
146  type = SOCK_FLOAT;
147  }
148  else {
149  type = SOCK_RGBA;
150  }
151 
153  node,
154  rpass->name,
155  rpass->name,
156  -1,
157  type,
158  false,
159  available_sockets,
160  &prev_index);
161  /* Special handling for the Combined pass to ensure compatibility. */
162  if (STREQ(rpass->name, RE_PASSNAME_COMBINED)) {
164  node,
165  "Alpha",
166  rpass->name,
167  -1,
168  SOCK_FLOAT,
169  false,
170  available_sockets,
171  &prev_index);
172  }
173  }
174  BKE_image_release_ibuf(ima, ibuf, nullptr);
175  return;
176  }
177  }
178  }
179 
181  node,
182  "Image",
184  -1,
185  SOCK_RGBA,
186  false,
187  available_sockets,
188  &prev_index);
190  node,
191  "Alpha",
193  -1,
194  SOCK_FLOAT,
195  false,
196  available_sockets,
197  &prev_index);
198 
199  if (ima) {
200  if (!ima->rr) {
202  node,
205  -1,
206  SOCK_FLOAT,
207  false,
208  available_sockets,
209  &prev_index);
210  }
211  BKE_image_release_ibuf(ima, ibuf, nullptr);
212  }
213 }
214 
218 };
219 
221  bNode *node,
222  Scene *scene,
223  ViewLayer *view_layer,
224  const char *name,
226 {
228 
229  if (scene == nullptr || view_layer == nullptr || data == nullptr || node->id != (ID *)scene) {
230  return;
231  }
232 
233  ViewLayer *node_view_layer = (ViewLayer *)BLI_findlink(&scene->view_layers, node->custom1);
234  if (node_view_layer != view_layer) {
235  return;
236  }
237 
238  /* Special handling for the Combined pass to ensure compatibility. */
239  if (STREQ(name, RE_PASSNAME_COMBINED)) {
241  ntree, node, "Image", name, -1, type, true, data->available_sockets, &data->prev_index);
243  node,
244  "Alpha",
245  name,
246  -1,
247  SOCK_FLOAT,
248  true,
249  data->available_sockets,
250  &data->prev_index);
251  }
252  else {
254  ntree, node, name, name, -1, type, true, data->available_sockets, &data->prev_index);
255  }
256 }
257 
261 };
262 
263 static void cmp_node_rlayer_create_outputs_cb(void *userdata,
264  Scene *scene,
265  ViewLayer *view_layer,
266  const char *name,
267  int UNUSED(channels),
268  const char *UNUSED(chanid),
270 {
272  node_cmp_rlayers_register_pass(&data.ntree, &data.node, scene, view_layer, name, type);
273 }
274 
276  bNode *node,
277  LinkNodePair *available_sockets)
278 {
279  Scene *scene = (Scene *)node->id;
280 
281  if (scene) {
282  RenderEngineType *engine_type = RE_engines_find(scene->r.engine);
283  if (engine_type && engine_type->update_render_passes) {
284  ViewLayer *view_layer = (ViewLayer *)BLI_findlink(&scene->view_layers, node->custom1);
285  if (view_layer) {
287  "render layer update data");
288  data->available_sockets = available_sockets;
289  data->prev_index = -1;
290  node->storage = data;
291 
292  CreateOutputUserData userdata = {*ntree, *node};
293 
294  RenderEngine *engine = RE_engine_create(engine_type);
296  engine, scene, view_layer, cmp_node_rlayer_create_outputs_cb, &userdata);
297  RE_engine_free(engine);
298 
299  if ((scene->r.mode & R_EDGE_FRS) &&
303  }
304 
305  MEM_freeN(data);
306  node->storage = nullptr;
307 
308  return;
309  }
310  }
311  }
312 
313  int prev_index = -1;
315  node,
316  "Image",
319  SOCK_RGBA,
320  true,
321  available_sockets,
322  &prev_index);
324  node,
325  "Alpha",
328  SOCK_FLOAT,
329  true,
330  available_sockets,
331  &prev_index);
332 }
333 
334 /* XXX make this into a generic socket verification function for dynamic socket replacement
335  * (multilayer, groups, static templates) */
337 {
338  bNodeSocket *sock, *sock_next;
339  LinkNodePair available_sockets = {nullptr, nullptr};
340 
341  /* XXX make callback */
342  if (rlayer) {
343  cmp_node_rlayer_create_outputs(ntree, node, &available_sockets);
344  }
345  else {
346  cmp_node_image_create_outputs(ntree, node, &available_sockets);
347  }
348 
349  /* Get rid of sockets whose passes are not available in the image.
350  * If sockets that are not available would be deleted, the connections to them would be lost
351  * when e.g. opening a file (since there's no render at all yet).
352  * Therefore, sockets with connected links will just be set as unavailable.
353  *
354  * Another important detail comes from compatibility with the older socket model, where there
355  * was a fixed socket per pass type that was just hidden or not. Therefore, older versions expect
356  * the first 31 passes to belong to a specific pass type.
357  * So, we keep those 31 always allocated before the others as well,
358  * even if they have no links attached. */
359  int sock_index = 0;
360  for (sock = (bNodeSocket *)node->outputs.first; sock; sock = sock_next, sock_index++) {
361  sock_next = sock->next;
362  if (BLI_linklist_index(available_sockets.list, sock) >= 0) {
363  sock->flag &= ~SOCK_HIDDEN;
364  nodeSetSocketAvailability(ntree, sock, true);
365  }
366  else {
367  bNodeLink *link;
368  for (link = (bNodeLink *)ntree->links.first; link; link = link->next) {
369  if (link->fromsock == sock) {
370  break;
371  }
372  }
373  if (!link && (!rlayer || sock_index >= NUM_LEGACY_SOCKETS)) {
374  MEM_freeN(sock->storage);
375  nodeRemoveSocket(ntree, node, sock);
376  }
377  else {
378  nodeSetSocketAvailability(ntree, sock, false);
379  }
380  }
381  }
382 
383  BLI_linklist_free(available_sockets.list, nullptr);
384 }
385 
387 
389 {
390  /* avoid unnecessary updates, only changes to the image/image user data are of interest */
391  if (node->update & NODE_UPDATE_ID) {
393  }
394 
396 }
397 
399 {
400  ImageUser *iuser = MEM_cnew<ImageUser>(__func__);
401  node->storage = iuser;
402  iuser->frames = 1;
403  iuser->sfra = 1;
404  iuser->flag |= IMA_ANIM_ALWAYS;
405 
406  /* setup initial outputs */
408 }
409 
411 {
412  /* free extra socket info */
413  LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
414  MEM_freeN(sock->storage);
415  }
416 
417  MEM_freeN(node->storage);
418 }
419 
420 static void node_composit_copy_image(bNodeTree *UNUSED(dest_ntree),
421  bNode *dest_node,
422  const bNode *src_node)
423 {
424  dest_node->storage = MEM_dupallocN(src_node->storage);
425 
426  const bNodeSocket *src_output_sock = (bNodeSocket *)src_node->outputs.first;
427  bNodeSocket *dest_output_sock = (bNodeSocket *)dest_node->outputs.first;
428  while (dest_output_sock != nullptr) {
429  dest_output_sock->storage = MEM_dupallocN(src_output_sock->storage);
430 
431  src_output_sock = src_output_sock->next;
432  dest_output_sock = dest_output_sock->next;
433  }
434 }
435 
436 } // namespace blender::nodes::node_composite_image_cc
437 
439 {
440  namespace file_ns = blender::nodes::node_composite_image_cc;
441 
442  static bNodeType ntype;
443 
449  ntype.labelfunc = node_image_label;
450  ntype.flag |= NODE_PREVIEW;
451 
452  nodeRegisterType(&ntype);
453 }
454 
455 /* **************** RENDER RESULT ******************** */
456 
458 {
460 }
461 
462 const char *node_cmp_rlayers_sock_to_pass(int sock_index)
463 {
464  if (sock_index >= NUM_LEGACY_SOCKETS) {
465  return nullptr;
466  }
467  const char *name = cmp_node_rlayers_out[sock_index].name;
468  /* Exception for alpha, which is derived from Combined. */
469  return (STREQ(name, "Alpha")) ? RE_PASSNAME_COMBINED : name;
470 }
471 
473 
475 {
477  bNode *node = (bNode *)ptr->data;
478  int sock_index = 0;
479 
480  node->id = &scene->id;
481  id_us_plus(node->id);
482 
483  for (bNodeSocket *sock = (bNodeSocket *)node->outputs.first; sock;
484  sock = sock->next, sock_index++) {
485  NodeImageLayer *sockdata = MEM_cnew<NodeImageLayer>(__func__);
486  sock->storage = sockdata;
487 
488  BLI_strncpy(sockdata->pass_name,
489  node_cmp_rlayers_sock_to_pass(sock_index),
490  sizeof(sockdata->pass_name));
491  }
492 }
493 
495  bNodeTree *ntree,
496  const char **r_disabled_hint)
497 {
498  if (!STREQ(ntree->idname, "CompositorNodeTree")) {
499  *r_disabled_hint = TIP_("Not a compositor node tree");
500  return false;
501  }
502 
503  Scene *scene;
504 
505  /* XXX ugly: check if ntree is a local scene node tree.
506  * Render layers node can only be used in local scene->nodetree,
507  * since it directly links to the scene.
508  */
509  for (scene = (Scene *)G.main->scenes.first; scene; scene = (Scene *)scene->id.next) {
510  if (scene->nodetree == ntree) {
511  break;
512  }
513  }
514 
515  if (scene == nullptr) {
516  *r_disabled_hint = TIP_(
517  "The node tree must be the compositing node tree of any scene in the file");
518  return false;
519  }
520  return true;
521 }
522 
524 {
525  /* free extra socket info */
526  LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
527  if (sock->storage) {
528  MEM_freeN(sock->storage);
529  }
530  }
531 }
532 
533 static void node_composit_copy_rlayers(bNodeTree *UNUSED(dest_ntree),
534  bNode *dest_node,
535  const bNode *src_node)
536 {
537  /* copy extra socket info */
538  const bNodeSocket *src_output_sock = (bNodeSocket *)src_node->outputs.first;
539  bNodeSocket *dest_output_sock = (bNodeSocket *)dest_node->outputs.first;
540  while (dest_output_sock != nullptr) {
541  dest_output_sock->storage = MEM_dupallocN(src_output_sock->storage);
542 
543  src_output_sock = src_output_sock->next;
544  dest_output_sock = dest_output_sock->next;
545  }
546 }
547 
549 {
551 
553 }
554 
556 {
557  bNode *node = (bNode *)ptr->data;
558  uiLayout *col, *row;
559 
560  uiTemplateID(layout,
561  C,
562  ptr,
563  "scene",
564  nullptr,
565  nullptr,
566  nullptr,
568  false,
569  nullptr);
570 
571  if (!node->id) {
572  return;
573  }
574 
575  col = uiLayoutColumn(layout, false);
576  row = uiLayoutRow(col, true);
577  uiItemR(row, ptr, "layer", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE);
578 
579  PropertyRNA *prop = RNA_struct_find_property(ptr, "layer");
580  const char *layer_name;
582  C, ptr, prop, RNA_property_enum_get(ptr, prop), &layer_name))) {
583  return;
584  }
585 
586  PointerRNA scn_ptr;
587  char scene_name[MAX_ID_NAME - 2];
588  scn_ptr = RNA_pointer_get(ptr, "scene");
589  RNA_string_get(&scn_ptr, "name", scene_name);
590 
591  PointerRNA op_ptr;
592  uiItemFullO(
593  row, "RENDER_OT_render", "", ICON_RENDER_STILL, nullptr, WM_OP_INVOKE_DEFAULT, 0, &op_ptr);
594  RNA_string_set(&op_ptr, "layer", layer_name);
595  RNA_string_set(&op_ptr, "scene", scene_name);
596 }
597 
598 } // namespace blender::nodes::node_composite_image_cc
599 
601 {
602  namespace file_ns = blender::nodes::node_composite_image_cc;
603 
604  static bNodeType ntype;
605 
606  cmp_node_type_base(&ntype, CMP_NODE_R_LAYERS, "Render Layers", NODE_CLASS_INPUT);
611  ntype.flag |= NODE_PREVIEW;
617 
618  nodeRegisterType(&ntype);
619 }
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1090
void BKE_image_release_ibuf(struct Image *ima, struct ImBuf *ibuf, void *lock)
struct ImBuf * BKE_image_acquire_ibuf(struct Image *ima, struct ImageUser *iuser, void **r_lock)
int BKE_image_sequence_guess_offset(struct Image *image)
void id_us_plus(struct ID *id)
Definition: lib_id.c:305
#define RRES_OUT_ALPHA
Definition: BKE_node.h:1193
void node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs)
Definition: node.cc:4358
void node_type_update(struct bNodeType *ntype, void(*updatefunc)(struct bNodeTree *ntree, struct bNode *node))
Definition: node.cc:4443
#define RRES_OUT_IMAGE
Definition: BKE_node.h:1192
void nodeSetSocketAvailability(struct bNodeTree *ntree, struct bNodeSocket *sock, bool is_available)
Definition: node.cc:3664
void node_type_init(struct bNodeType *ntype, void(*initfunc)(struct bNodeTree *ntree, struct bNode *node))
Definition: node.cc:4390
struct bNodeSocket * nodeAddStaticSocket(struct bNodeTree *ntree, struct bNode *node, eNodeSocketInOut in_out, int type, int subtype, const char *identifier, const char *name)
Definition: node.cc:1897
void node_type_size_preset(struct bNodeType *ntype, eNodeSizePreset size)
Definition: node.cc:4408
void node_type_storage(struct bNodeType *ntype, const char *storagename, void(*freefunc)(struct bNode *node), void(*copyfunc)(struct bNodeTree *dest_ntree, struct bNode *dest_node, const struct bNode *src_node))
Definition: node.cc:4426
void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock)
Definition: node.cc:1933
#define NODE_CLASS_INPUT
Definition: BKE_node.h:345
#define CMP_NODE_R_LAYERS
Definition: BKE_node.h:1216
#define CMP_NODE_IMAGE
Definition: BKE_node.h:1215
void nodeRegisterType(struct bNodeType *ntype)
Definition: node.cc:1357
@ NODE_SIZE_LARGE
Definition: BKE_node.h:367
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:336
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
Definition: listbase.c:301
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:100
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)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
Definition: string.c:64
#define UNUSED(x)
#define STREQ(a, b)
#define TIP_(msgid)
#define MAX_ID_NAME
Definition: DNA_ID.h:337
@ FREESTYLE_AS_RENDER_PASS
#define IMA_ANIM_ALWAYS
#define NODE_UPDATE_ID
@ SOCK_OUT
#define NODE_PREVIEW
@ SOCK_HIDDEN
eNodeSocketDatatype
@ SOCK_VECTOR
@ SOCK_FLOAT
@ SOCK_RGBA
#define RE_PASSNAME_COMBINED
#define RE_PASSNAME_UV
#define RE_PASSNAME_DIFFUSE_INDIRECT
#define RE_PASSNAME_INDEXMA
#define RE_PASSNAME_SUBSURFACE_DIRECT
#define RE_PASSNAME_NORMAL
#define RE_PASSNAME_TRANSM_DIRECT
#define RE_PASSNAME_VECTOR
#define RE_PASSNAME_TRANSM_COLOR
#define RE_PASSNAME_EMIT
#define RE_PASSNAME_SUBSURFACE_INDIRECT
#define RE_PASSNAME_GLOSSY_COLOR
#define RE_PASSNAME_SUBSURFACE_COLOR
#define RE_PASSNAME_TRANSM_INDIRECT
#define RE_PASSNAME_GLOSSY_DIRECT
#define RE_PASSNAME_SHADOW
#define RE_PASSNAME_MIST
#define RE_PASSNAME_ENVIRONMENT
#define RE_PASSNAME_POSITION
#define RE_PASSNAME_DIFFUSE_COLOR
#define RE_PASSNAME_GLOSSY_INDIRECT
#define RE_PASSNAME_AO
#define RE_PASSNAME_DEPRECATED
#define RE_PASSNAME_Z
#define RE_PASSNAME_FREESTYLE
#define R_EDGE_FRS
#define RE_PASSNAME_DIFFUSE_DIRECT
#define RE_PASSNAME_INDEXOB
_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 producing a negative Combine Generate a color from its and blue channels(Deprecated)") DefNode(ShaderNode
@ PROP_NONE
Definition: RNA_types.h:126
#define C
Definition: RandGen.cpp:25
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
@ UI_ITEM_R_SPLIT_EMPTY_NAME
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiItemFullO(uiLayout *layout, const char *opname, const char *name, int icon, struct IDProperty *properties, wmOperatorCallContext context, int flag, struct PointerRNA *r_opptr)
void uiTemplateID(uiLayout *layout, const struct bContext *C, struct PointerRNA *ptr, const char *propname, const char *newop, const char *openop, const char *unlinkop, int filter, bool live_icon, const char *text)
@ UI_TEMPLATE_ID_FILTER_ALL
@ WM_OP_INVOKE_DEFAULT
Definition: WM_types.h:201
struct RenderResult * rr
OperationNode * node
Scene scene
bNodeTree * ntree
RenderEngine * RE_engine_create(RenderEngineType *type)
Definition: engine.c:136
RenderEngineType * RE_engines_find(const char *idname)
Definition: engine.c:98
void RE_engine_update_render_passes(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer, update_render_passes_cb_t callback, void *callback_data)
Definition: engine.c:1150
void RE_engine_free(RenderEngine *engine)
Definition: engine.c:164
uint col
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_dupallocN)(const void *vmemh)
Definition: mallocn.c:28
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:33
#define G(x, y, z)
static void cmp_node_rlayers_update(bNodeTree *ntree, bNode *node)
static void node_composit_buts_viewlayers(uiLayout *layout, bContext *C, PointerRNA *ptr)
static bool node_composit_poll_rlayers(bNodeType *UNUSED(ntype), bNodeTree *ntree, const char **r_disabled_hint)
static void node_composit_init_rlayers(const bContext *C, PointerRNA *ptr)
static void node_composit_free_rlayers(bNode *node)
static void cmp_node_image_update(bNodeTree *ntree, bNode *node)
static void node_composit_copy_image(bNodeTree *UNUSED(dest_ntree), bNode *dest_node, const bNode *src_node)
static void node_composit_copy_rlayers(bNodeTree *UNUSED(dest_ntree), bNode *dest_node, const bNode *src_node)
static void node_composit_init_image(bNodeTree *ntree, bNode *node)
static void cmp_node_image_create_outputs(bNodeTree *ntree, bNode *node, LinkNodePair *available_sockets)
static void cmp_node_image_add_pass_output(bNodeTree *ntree, bNode *node, const char *name, const char *passname, int rres_index, eNodeSocketDatatype type, int UNUSED(is_rlayers), LinkNodePair *available_sockets, int *prev_index)
void register_node_type_cmp_image()
const char * node_cmp_rlayers_sock_to_pass(int sock_index)
void register_node_type_cmp_rlayers()
static bNodeSocketTemplate cmp_node_rlayers_out[]
void node_cmp_rlayers_register_pass(bNodeTree *ntree, bNode *node, Scene *scene, ViewLayer *view_layer, const char *name, eNodeSocketDatatype type)
static void cmp_node_rlayer_create_outputs(bNodeTree *ntree, bNode *node, LinkNodePair *available_sockets)
void node_cmp_rlayers_outputs(bNodeTree *ntree, bNode *node)
static void cmp_node_rlayer_create_outputs_cb(void *userdata, Scene *scene, ViewLayer *view_layer, const char *name, int UNUSED(channels), const char *UNUSED(chanid), eNodeSocketDatatype type)
static void cmp_node_image_verify_outputs(bNodeTree *ntree, bNode *node, bool rlayer)
#define NUM_LEGACY_SOCKETS
void cmp_node_type_base(bNodeType *ntype, int type, const char *name, short nclass)
void cmp_node_update_default(bNodeTree *UNUSED(ntree), bNode *node)
struct bNodeSocket * node_add_socket_from_template(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketTemplate *stemp, eNodeSocketInOut in_out)
Definition: node_socket.cc:41
void node_image_label(const bNodeTree *UNUSED(ntree), const bNode *node, char *label, int maxlen)
Definition: node_util.c:189
void RNA_string_set(PointerRNA *ptr, const char *name, const char *value)
Definition: rna_access.c:5155
PointerRNA RNA_pointer_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5167
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
Definition: rna_access.c:717
void RNA_string_get(PointerRNA *ptr, const char *name, char *value)
Definition: rna_access.c:5116
bool RNA_property_enum_identifier(bContext *C, PointerRNA *ptr, PropertyRNA *prop, const int value, const char **identifier)
Definition: rna_access.c:1759
int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
Definition: rna_access.c:3402
Definition: DNA_ID.h:368
void * next
Definition: DNA_ID.h:369
LinkNode * list
Definition: BLI_linklist.h:34
void * first
Definition: DNA_listBase.h:31
char pass_name[64]
void * data
Definition: RNA_types.h:38
LinkNodePair * available_sockets
char engine[32]
void(* update_render_passes)(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer)
Definition: RE_engine.h:109
ListBase passes
Definition: RE_pipeline.h:95
ListBase layers
Definition: RE_pipeline.h:122
struct bNodeTree * nodetree
struct RenderData r
ListBase view_layers
struct FreestyleConfig freestyle_config
Compact definition of a node socket.
Definition: BKE_node.h:84
struct bNodeSocket * next
char idname[64]
ListBase links
Defines a node type.
Definition: BKE_node.h:226
short flag
Definition: BKE_node.h:236
bool(* poll)(struct bNodeType *ntype, struct bNodeTree *nodetree, const char **r_disabled_hint)
Definition: BKE_node.h:292
void(* initfunc_api)(const struct bContext *C, struct PointerRNA *ptr)
Definition: BKE_node.h:279
void(* labelfunc)(const struct bNodeTree *ntree, const struct bNode *node, char *label, int maxlen)
Definition: BKE_node.h:256
void(* draw_buttons)(struct uiLayout *, struct bContext *C, struct PointerRNA *ptr)
Definition: BKE_node.h:244
void * storage
ListBase outputs
#define N_(msgid)
PointerRNA * ptr
Definition: wm_files.c:3480