Blender  V2.93
node_composite_image.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2006 Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include "node_composite_util.h"
25 
26 #include "BLI_linklist.h"
27 #include "BLI_utildefines.h"
28 
29 #include "DNA_scene_types.h"
30 
31 #include "RE_engine.h"
32 
33 #include "BKE_context.h"
34 #include "BKE_global.h"
35 #include "BKE_lib_id.h"
36 #include "BKE_main.h"
37 #include "BKE_scene.h"
38 
39 /* **************** IMAGE (and RenderResult, multilayer image) ******************** */
40 
42  {SOCK_RGBA, N_("Image"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
43  {SOCK_FLOAT, N_("Alpha"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
44  {SOCK_FLOAT, N_(RE_PASSNAME_Z), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
45  {SOCK_VECTOR, N_(RE_PASSNAME_NORMAL), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
46  {SOCK_VECTOR, N_(RE_PASSNAME_UV), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
47  {SOCK_VECTOR, N_(RE_PASSNAME_VECTOR), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
48  {SOCK_RGBA, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
49  {SOCK_RGBA, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
50  {SOCK_RGBA, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
51  {SOCK_RGBA, N_(RE_PASSNAME_SHADOW), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
52  {SOCK_RGBA, N_(RE_PASSNAME_AO), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
53  {SOCK_RGBA, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
54  {SOCK_RGBA, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
55  {SOCK_RGBA, N_(RE_PASSNAME_DEPRECATED), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
56  {SOCK_FLOAT, N_(RE_PASSNAME_INDEXOB), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
57  {SOCK_FLOAT, N_(RE_PASSNAME_INDEXMA), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
58  {SOCK_FLOAT, N_(RE_PASSNAME_MIST), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
59  {SOCK_RGBA, N_(RE_PASSNAME_EMIT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
60  {SOCK_RGBA, N_(RE_PASSNAME_ENVIRONMENT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
61  {SOCK_RGBA, N_(RE_PASSNAME_DIFFUSE_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
62  {SOCK_RGBA, N_(RE_PASSNAME_DIFFUSE_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
63  {SOCK_RGBA, N_(RE_PASSNAME_DIFFUSE_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
64  {SOCK_RGBA, N_(RE_PASSNAME_GLOSSY_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
65  {SOCK_RGBA, N_(RE_PASSNAME_GLOSSY_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
66  {SOCK_RGBA, N_(RE_PASSNAME_GLOSSY_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
67  {SOCK_RGBA, N_(RE_PASSNAME_TRANSM_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
68  {SOCK_RGBA, N_(RE_PASSNAME_TRANSM_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
69  {SOCK_RGBA, N_(RE_PASSNAME_TRANSM_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
70  {SOCK_RGBA, N_(RE_PASSNAME_SUBSURFACE_DIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
71  {SOCK_RGBA, N_(RE_PASSNAME_SUBSURFACE_INDIRECT), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
72  {SOCK_RGBA, N_(RE_PASSNAME_SUBSURFACE_COLOR), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
73  {-1, ""},
74 };
75 #define MAX_LEGACY_SOCKET_INDEX 30
76 
78  bNode *node,
79  const char *name,
80  const char *passname,
81  int rres_index,
83  int UNUSED(is_rlayers),
84  LinkNodePair *available_sockets,
85  int *prev_index)
86 {
87  bNodeSocket *sock = BLI_findstring(&node->outputs, name, offsetof(bNodeSocket, name));
88 
89  /* Replace if types don't match. */
90  if (sock && sock->type != type) {
91  nodeRemoveSocket(ntree, node, sock);
92  sock = NULL;
93  }
94 
95  /* Create socket if it doesn't exist yet. */
96  if (sock == NULL) {
97  if (rres_index >= 0) {
99  ntree, node, &cmp_node_rlayers_out[rres_index], SOCK_OUT);
100  }
101  else {
102  sock = nodeAddStaticSocket(ntree, node, SOCK_OUT, type, PROP_NONE, name, name);
103  }
104  /* extra socket info */
105  NodeImageLayer *sockdata = MEM_callocN(sizeof(NodeImageLayer), "node image layer");
106  sock->storage = sockdata;
107  }
108 
109  NodeImageLayer *sockdata = sock->storage;
110  if (sockdata) {
111  BLI_strncpy(sockdata->pass_name, passname, sizeof(sockdata->pass_name));
112  }
113 
114  /* Reorder sockets according to order that passes are added. */
115  const int after_index = (*prev_index)++;
116  bNodeSocket *after_sock = BLI_findlink(&node->outputs, after_index);
117  BLI_remlink(&node->outputs, sock);
118  BLI_insertlinkafter(&node->outputs, after_sock, sock);
119 
120  BLI_linklist_append(available_sockets, sock);
121 }
122 
124  bNode *node,
125  LinkNodePair *available_sockets)
126 {
127  Image *ima = (Image *)node->id;
128  ImBuf *ibuf;
129  int prev_index = -1;
130  if (ima) {
131  ImageUser *iuser = node->storage;
132  ImageUser load_iuser = {NULL};
133  int offset = BKE_image_sequence_guess_offset(ima);
134 
135  /* It is possible that image user in this node is not
136  * properly updated yet. In this case loading image will
137  * fail and sockets detection will go wrong.
138  *
139  * So we manually construct image user to be sure first
140  * image from sequence (that one which is set as filename
141  * for image datablock) is used for sockets detection
142  */
143  load_iuser.ok = 1;
144  load_iuser.framenr = offset;
145 
146  /* make sure ima->type is correct */
147  ibuf = BKE_image_acquire_ibuf(ima, &load_iuser, NULL);
148 
149  if (ima->rr) {
150  RenderLayer *rl = BLI_findlink(&ima->rr->layers, iuser->layer);
151 
152  if (rl) {
153  RenderPass *rpass;
154  for (rpass = rl->passes.first; rpass; rpass = rpass->next) {
155  int type;
156  if (rpass->channels == 1) {
157  type = SOCK_FLOAT;
158  }
159  else {
160  type = SOCK_RGBA;
161  }
162 
164  node,
165  rpass->name,
166  rpass->name,
167  -1,
168  type,
169  false,
170  available_sockets,
171  &prev_index);
172  /* Special handling for the Combined pass to ensure compatibility. */
173  if (STREQ(rpass->name, RE_PASSNAME_COMBINED)) {
175  node,
176  "Alpha",
177  rpass->name,
178  -1,
179  SOCK_FLOAT,
180  false,
181  available_sockets,
182  &prev_index);
183  }
184  }
185  BKE_image_release_ibuf(ima, ibuf, NULL);
186  return;
187  }
188  }
189  }
190 
192  node,
193  "Image",
195  -1,
196  SOCK_RGBA,
197  false,
198  available_sockets,
199  &prev_index);
201  node,
202  "Alpha",
204  -1,
205  SOCK_FLOAT,
206  false,
207  available_sockets,
208  &prev_index);
209 
210  if (ima) {
211  if (!ima->rr) {
213  node,
216  -1,
217  SOCK_FLOAT,
218  false,
219  available_sockets,
220  &prev_index);
221  }
222  BKE_image_release_ibuf(ima, ibuf, NULL);
223  }
224 }
225 
226 typedef struct RLayerUpdateData {
230 
232  bNode *node,
233  Scene *scene,
234  ViewLayer *view_layer,
235  const char *name,
237 {
238  RLayerUpdateData *data = node->storage;
239 
240  if (scene == NULL || view_layer == NULL || data == NULL || node->id != (ID *)scene) {
241  return;
242  }
243 
244  ViewLayer *node_view_layer = BLI_findlink(&scene->view_layers, node->custom1);
245  if (node_view_layer != view_layer) {
246  return;
247  }
248 
249  /* Special handling for the Combined pass to ensure compatibility. */
250  if (STREQ(name, RE_PASSNAME_COMBINED)) {
252  ntree, node, "Image", name, -1, type, true, data->available_sockets, &data->prev_index);
254  node,
255  "Alpha",
256  name,
257  -1,
258  SOCK_FLOAT,
259  true,
260  data->available_sockets,
261  &data->prev_index);
262  }
263  else {
265  ntree, node, name, name, -1, type, true, data->available_sockets, &data->prev_index);
266  }
267 }
268 
269 static void cmp_node_rlayer_create_outputs_cb(void *UNUSED(userdata),
270  Scene *scene,
271  ViewLayer *view_layer,
272  const char *name,
273  int UNUSED(channels),
274  const char *UNUSED(chanid),
276 {
277  /* Register the pass in all scenes that have a render layer node for this layer.
278  * Since multiple scenes can be used in the compositor, the code must loop over all scenes
279  * and check whether their nodetree has a node that needs to be updated. */
280  /* NOTE: using G_MAIN seems valid here,
281  * unless we want to register that for every other temp Main we could generate??? */
282  ntreeCompositRegisterPass(scene->nodetree, scene, view_layer, name, type);
283 
284  for (Scene *sce = G_MAIN->scenes.first; sce; sce = sce->id.next) {
285  if (sce->nodetree && sce != scene) {
286  ntreeCompositRegisterPass(sce->nodetree, scene, view_layer, name, type);
287  }
288  }
289 }
290 
292  bNode *node,
293  LinkNodePair *available_sockets)
294 {
295  Scene *scene = (Scene *)node->id;
296 
297  if (scene) {
298  RenderEngineType *engine_type = RE_engines_find(scene->r.engine);
299  if (engine_type && engine_type->update_render_passes) {
300  ViewLayer *view_layer = BLI_findlink(&scene->view_layers, node->custom1);
301  if (view_layer) {
302  RLayerUpdateData *data = MEM_mallocN(sizeof(RLayerUpdateData), "render layer update data");
303  data->available_sockets = available_sockets;
304  data->prev_index = -1;
305  node->storage = data;
306 
307  RenderEngine *engine = RE_engine_create(engine_type);
309  engine, scene, view_layer, cmp_node_rlayer_create_outputs_cb, NULL);
310  RE_engine_free(engine);
311 
312  if ((scene->r.mode & R_EDGE_FRS) &&
315  }
316 
317  MEM_freeN(data);
318  node->storage = NULL;
319 
320  return;
321  }
322  }
323  }
324 
325  int prev_index = -1;
327  node,
328  "Image",
331  SOCK_RGBA,
332  true,
333  available_sockets,
334  &prev_index);
336  node,
337  "Alpha",
340  SOCK_FLOAT,
341  true,
342  available_sockets,
343  &prev_index);
344 }
345 
346 /* XXX make this into a generic socket verification function for dynamic socket replacement
347  * (multilayer, groups, static templates) */
349 {
350  bNodeSocket *sock, *sock_next;
351  LinkNodePair available_sockets = {NULL, NULL};
352  int sock_index;
353 
354  /* XXX make callback */
355  if (rlayer) {
356  cmp_node_rlayer_create_outputs(ntree, node, &available_sockets);
357  }
358  else {
359  cmp_node_image_create_outputs(ntree, node, &available_sockets);
360  }
361 
362  /* Get rid of sockets whose passes are not available in the image.
363  * If sockets that are not available would be deleted, the connections to them would be lost
364  * when e.g. opening a file (since there's no render at all yet).
365  * Therefore, sockets with connected links will just be set as unavailable.
366  *
367  * Another important detail comes from compatibility with the older socket model, where there
368  * was a fixed socket per pass type that was just hidden or not. Therefore, older versions expect
369  * the first 31 passes to belong to a specific pass type.
370  * So, we keep those 31 always allocated before the others as well,
371  * even if they have no links attached. */
372  sock_index = 0;
373  for (sock = node->outputs.first; sock; sock = sock_next, sock_index++) {
374  sock_next = sock->next;
375  if (BLI_linklist_index(available_sockets.list, sock) >= 0) {
376  sock->flag &= ~(SOCK_UNAVAIL | SOCK_HIDDEN);
377  }
378  else {
379  bNodeLink *link;
380  for (link = ntree->links.first; link; link = link->next) {
381  if (link->fromsock == sock) {
382  break;
383  }
384  }
385  if (!link && (!rlayer || sock_index > MAX_LEGACY_SOCKET_INDEX)) {
386  MEM_freeN(sock->storage);
387  nodeRemoveSocket(ntree, node, sock);
388  }
389  else {
390  sock->flag |= SOCK_UNAVAIL;
391  }
392  }
393  }
394 
395  BLI_linklist_free(available_sockets.list, NULL);
396 }
397 
399 {
400  /* avoid unnecessary updates, only changes to the image/image user data are of interest */
401  if (node->update & NODE_UPDATE_ID) {
403  }
404 
406 }
407 
409 {
410  ImageUser *iuser = MEM_callocN(sizeof(ImageUser), "node image user");
411  node->storage = iuser;
412  iuser->frames = 1;
413  iuser->sfra = 1;
414  iuser->ok = 1;
415  iuser->flag |= IMA_ANIM_ALWAYS;
416 
417  /* setup initial outputs */
419 }
420 
422 {
423  bNodeSocket *sock;
424 
425  /* free extra socket info */
426  for (sock = node->outputs.first; sock; sock = sock->next) {
427  MEM_freeN(sock->storage);
428  }
429 
430  MEM_freeN(node->storage);
431 }
432 
433 static void node_composit_copy_image(bNodeTree *UNUSED(dest_ntree),
434  bNode *dest_node,
435  const bNode *src_node)
436 {
437  dest_node->storage = MEM_dupallocN(src_node->storage);
438 
439  const bNodeSocket *src_output_sock = src_node->outputs.first;
440  bNodeSocket *dest_output_sock = dest_node->outputs.first;
441  while (dest_output_sock != NULL) {
442  dest_output_sock->storage = MEM_dupallocN(src_output_sock->storage);
443 
444  src_output_sock = src_output_sock->next;
445  dest_output_sock = dest_output_sock->next;
446  }
447 }
448 
450 {
451  static bNodeType ntype;
452 
458 
459  nodeRegisterType(&ntype);
460 }
461 
462 /* **************** RENDER RESULT ******************** */
463 
465 {
467 }
468 
469 const char *node_cmp_rlayers_sock_to_pass(int sock_index)
470 {
471  const char *sock_to_passname[] = {
503  };
504  if (sock_index > MAX_LEGACY_SOCKET_INDEX) {
505  return NULL;
506  }
507  return sock_to_passname[sock_index];
508 }
509 
511 {
513  bNode *node = ptr->data;
514  int sock_index = 0;
515 
516  node->id = &scene->id;
517  id_us_plus(node->id);
518 
519  for (bNodeSocket *sock = node->outputs.first; sock; sock = sock->next, sock_index++) {
520  NodeImageLayer *sockdata = MEM_callocN(sizeof(NodeImageLayer), "node image layer");
521  sock->storage = sockdata;
522 
523  BLI_strncpy(sockdata->pass_name,
524  node_cmp_rlayers_sock_to_pass(sock_index),
525  sizeof(sockdata->pass_name));
526  }
527 }
528 
530  bNodeTree *ntree,
531  const char **r_disabled_hint)
532 {
533  if (!STREQ(ntree->idname, "CompositorNodeTree")) {
534  *r_disabled_hint = "Not a compositor node tree";
535  return false;
536  }
537 
538  Scene *scene;
539 
540  /* XXX ugly: check if ntree is a local scene node tree.
541  * Render layers node can only be used in local scene->nodetree,
542  * since it directly links to the scene.
543  */
544  for (scene = G.main->scenes.first; scene; scene = scene->id.next) {
545  if (scene->nodetree == ntree) {
546  break;
547  }
548  }
549 
550  if (scene == NULL) {
551  *r_disabled_hint = "The node tree must be the compositing node tree of any scene in the file";
552  return false;
553  }
554  return true;
555 }
556 
558 {
559  bNodeSocket *sock;
560 
561  /* free extra socket info */
562  for (sock = node->outputs.first; sock; sock = sock->next) {
563  if (sock->storage) {
564  MEM_freeN(sock->storage);
565  }
566  }
567 }
568 
569 static void node_composit_copy_rlayers(bNodeTree *UNUSED(dest_ntree),
570  bNode *dest_node,
571  const bNode *src_node)
572 {
573  /* copy extra socket info */
574  const bNodeSocket *src_output_sock = src_node->outputs.first;
575  bNodeSocket *dest_output_sock = dest_node->outputs.first;
576  while (dest_output_sock != NULL) {
577  dest_output_sock->storage = MEM_dupallocN(src_output_sock->storage);
578 
579  src_output_sock = src_output_sock->next;
580  dest_output_sock = dest_output_sock->next;
581  }
582 }
583 
585 {
587 
589 }
590 
592 {
593  static bNodeType ntype;
594 
603 
604  nodeRegisterType(&ntype);
605 }
struct Scene * CTX_data_scene(const bContext *C)
Definition: context.c:1034
#define G_MAIN
Definition: BKE_global.h:232
void BKE_image_release_ibuf(struct Image *ima, struct ImBuf *ibuf, void *lock)
Definition: image.c:5113
struct ImBuf * BKE_image_acquire_ibuf(struct Image *ima, struct ImageUser *iuser, void **r_lock)
Definition: image.c:5100
int BKE_image_sequence_guess_offset(struct Image *image)
Definition: image.c:5617
void id_us_plus(struct ID *id)
Definition: lib_id.c:288
#define RRES_OUT_ALPHA
Definition: BKE_node.h:1099
void node_type_socket_templates(struct bNodeType *ntype, struct bNodeSocketTemplate *inputs, struct bNodeSocketTemplate *outputs)
Definition: node.cc:4527
void node_type_update(struct bNodeType *ntype, void(*updatefunc)(struct bNodeTree *ntree, struct bNode *node))
Definition: node.cc:4623
#define RRES_OUT_IMAGE
Definition: BKE_node.h:1098
void node_type_init(struct bNodeType *ntype, void(*initfunc)(struct bNodeTree *ntree, struct bNode *node))
Definition: node.cc:4559
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:1716
void node_type_size_preset(struct bNodeType *ntype, eNodeSizePreset size)
Definition: node.cc:4577
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:4599
void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock)
Definition: node.cc:1775
#define NODE_CLASS_INPUT
Definition: BKE_node.h:334
#define CMP_NODE_R_LAYERS
Definition: BKE_node.h:1152
void nodeRegisterType(struct bNodeType *ntype)
Definition: node.cc:1298
void node_type_label(struct bNodeType *ntype, void(*labelfunc)(struct bNodeTree *ntree, struct bNode *, char *label, int maxlen))
void ntreeCompositRegisterPass(struct bNodeTree *ntree, struct Scene *scene, struct ViewLayer *view_layer, const char *name, eNodeSocketDatatype type)
@ NODE_SIZE_LARGE
Definition: BKE_node.h:373
void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink) ATTR_NONNULL(1)
Definition: listbase.c:352
void * BLI_findstring(const struct ListBase *listbase, const char *id, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:133
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
Definition: string.c:108
#define UNUSED(x)
#define STREQ(a, b)
#define N_(msgid)
@ FREESTYLE_AS_RENDER_PASS
#define IMA_ANIM_ALWAYS
#define NODE_UPDATE_ID
@ SOCK_OUT
#define NODE_PREVIEW
@ SOCK_HIDDEN
@ SOCK_UNAVAIL
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_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 RGB to Bright Vector Camera Vector Combine Material Light Line Style Layer Add Ambient Diffuse Glossy Refraction Transparent Toon Principled Hair Volume Principled Light Particle Volume Image Sky Noise Wave Voronoi Brick Texture Vector Combine Vertex Separate Vector White RGB Map Separate Set CMP_NODE_IMAGE
@ PROP_NONE
Definition: RNA_types.h:113
#define C
Definition: RandGen.cpp:39
struct RenderResult * rr
OperationNode * node
Scene scene
bNodeTree * ntree
RenderEngine * RE_engine_create(RenderEngineType *type)
Definition: engine.c:133
RenderEngineType * RE_engines_find(const char *idname)
Definition: engine.c:108
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:1071
void RE_engine_free(RenderEngine *engine)
Definition: engine.c:161
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
void *(* MEM_dupallocN)(const void *vmemh)
Definition: mallocn.c:42
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:45
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:47
static void cmp_node_image_create_outputs(bNodeTree *ntree, bNode *node, LinkNodePair *available_sockets)
void register_node_type_cmp_rlayers(void)
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)
static void node_composit_free_image(bNode *node)
static void node_composit_copy_rlayers(bNodeTree *UNUSED(dest_ntree), bNode *dest_node, const bNode *src_node)
static void cmp_node_rlayer_create_outputs_cb(void *UNUSED(userdata), Scene *scene, ViewLayer *view_layer, const char *name, int UNUSED(channels), const char *UNUSED(chanid), eNodeSocketDatatype type)
static void cmp_node_rlayers_update(bNodeTree *ntree, bNode *node)
const char * node_cmp_rlayers_sock_to_pass(int sock_index)
static bNodeSocketTemplate cmp_node_rlayers_out[]
static void node_composit_copy_image(bNodeTree *UNUSED(dest_ntree), bNode *dest_node, const bNode *src_node)
static void node_composit_free_rlayers(bNode *node)
static void node_composit_init_rlayers(const bContext *C, PointerRNA *ptr)
void node_cmp_rlayers_register_pass(bNodeTree *ntree, bNode *node, Scene *scene, ViewLayer *view_layer, const char *name, eNodeSocketDatatype type)
void register_node_type_cmp_image(void)
static void cmp_node_rlayer_create_outputs(bNodeTree *ntree, bNode *node, LinkNodePair *available_sockets)
struct RLayerUpdateData RLayerUpdateData
static void node_composit_init_image(bNodeTree *ntree, bNode *node)
void node_cmp_rlayers_outputs(bNodeTree *ntree, bNode *node)
static bool node_composit_poll_rlayers(bNodeType *UNUSED(ntype), bNodeTree *ntree, const char **r_disabled_hint)
static void cmp_node_image_verify_outputs(bNodeTree *ntree, bNode *node, bool rlayer)
static void cmp_node_image_update(bNodeTree *ntree, bNode *node)
#define MAX_LEGACY_SOCKET_INDEX
void cmp_node_type_base(bNodeType *ntype, int type, const char *name, short nclass, short flag)
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:52
void node_image_label(bNodeTree *UNUSED(ntree), bNode *node, char *label, int maxlen)
Definition: node_util.c:199
Definition: DNA_ID.h:273
void * next
Definition: DNA_ID.h:274
LinkNode * list
Definition: BLI_linklist.h:50
void * first
Definition: DNA_listBase.h:47
char pass_name[64]
void * data
Definition: RNA_types.h:52
LinkNodePair * available_sockets
char engine[32]
void(* update_render_passes)(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer)
Definition: RE_engine.h:107
ListBase passes
Definition: RE_pipeline.h:108
char name[64]
Definition: RE_pipeline.h:80
int channels
Definition: RE_pipeline.h:79
struct RenderPass * next
Definition: RE_pipeline.h:78
ListBase layers
Definition: RE_pipeline.h:135
struct bNodeTree * nodetree
struct RenderData r
ListBase view_layers
struct FreestyleConfig freestyle_config
Compact definition of a node socket.
Definition: BKE_node.h:95
void * storage
struct bNodeSocket * next
char idname[64]
ListBase links
Defines a node type.
Definition: BKE_node.h:221
bool(* poll)(struct bNodeType *ntype, struct bNodeTree *nodetree, const char **r_disabled_hint)
Definition: BKE_node.h:301
void(* initfunc_api)(const struct bContext *C, struct PointerRNA *ptr)
Definition: BKE_node.h:288
void * storage
ListBase outputs
#define G(x, y, z)
PointerRNA * ptr
Definition: wm_files.c:3157