Blender  V2.93
node_socket.cc
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) 2007 Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include <climits>
25 
26 #include "DNA_node_types.h"
27 
28 #include "BLI_color.hh"
29 #include "BLI_float3.hh"
30 #include "BLI_listbase.h"
31 #include "BLI_math.h"
32 #include "BLI_string.h"
33 #include "BLI_utildefines.h"
34 
35 #include "BKE_geometry_set.hh"
36 #include "BKE_lib_id.h"
37 #include "BKE_node.h"
39 
40 #include "DNA_collection_types.h"
41 
42 #include "RNA_access.h"
43 #include "RNA_types.h"
44 
45 #include "MEM_guardedalloc.h"
46 
48 #include "NOD_socket.h"
49 
50 #include "FN_cpp_type_make.hh"
51 
53  struct bNode *node,
54  struct bNodeSocketTemplate *stemp,
56 {
58  ntree, node, in_out, stemp->type, stemp->subtype, stemp->identifier, stemp->name);
59 
60  sock->flag |= stemp->flag;
61 
62  /* initialize default_value */
63  switch (stemp->type) {
64  case SOCK_FLOAT: {
66  dval->value = stemp->val1;
67  dval->min = stemp->min;
68  dval->max = stemp->max;
69  break;
70  }
71  case SOCK_INT: {
73  dval->value = (int)stemp->val1;
74  dval->min = (int)stemp->min;
75  dval->max = (int)stemp->max;
76  break;
77  }
78  case SOCK_BOOLEAN: {
80  dval->value = (int)stemp->val1;
81  break;
82  }
83  case SOCK_VECTOR: {
85  dval->value[0] = stemp->val1;
86  dval->value[1] = stemp->val2;
87  dval->value[2] = stemp->val3;
88  dval->min = stemp->min;
89  dval->max = stemp->max;
90  break;
91  }
92  case SOCK_RGBA: {
94  dval->value[0] = stemp->val1;
95  dval->value[1] = stemp->val2;
96  dval->value[2] = stemp->val3;
97  dval->value[3] = stemp->val4;
98  break;
99  }
100  }
101 
102  return sock;
103 }
104 
106  bNode *node,
108  ListBase *socklist,
109  bNodeSocketTemplate *stemp)
110 {
111  bNodeSocket *sock;
112 
113  for (sock = (bNodeSocket *)socklist->first; sock; sock = sock->next) {
114  if (STREQLEN(sock->name, stemp->name, NODE_MAXSTR)) {
115  break;
116  }
117  }
118  if (sock) {
119  if (sock->type != stemp->type) {
120  nodeModifySocketType(ntree, node, sock, stemp->type, stemp->subtype);
121  }
122  sock->flag |= stemp->flag;
123  }
124  else {
125  /* no socket for this template found, make a new one */
127  }
128 
129  /* remove the new socket from the node socket list first,
130  * will be added back after verification. */
131  BLI_remlink(socklist, sock);
132 
133  return sock;
134 }
135 
137  bNode *node,
139  ListBase *socklist,
140  bNodeSocketTemplate *stemp_first)
141 {
142  bNodeSocket *sock, *nextsock;
143  bNodeSocketTemplate *stemp;
144 
145  /* no inputs anymore? */
146  if (stemp_first == nullptr) {
147  for (sock = (bNodeSocket *)socklist->first; sock; sock = nextsock) {
148  nextsock = sock->next;
149  nodeRemoveSocket(ntree, node, sock);
150  }
151  }
152  else {
153  /* step by step compare */
154  stemp = stemp_first;
155  while (stemp->type != -1) {
156  stemp->sock = verify_socket_template(ntree, node, in_out, socklist, stemp);
157  stemp++;
158  }
159  /* leftovers are removed */
160  for (sock = (bNodeSocket *)socklist->first; sock; sock = nextsock) {
161  nextsock = sock->next;
162  nodeRemoveSocket(ntree, node, sock);
163  }
164 
165  /* and we put back the verified sockets */
166  stemp = stemp_first;
167  if (socklist->first) {
168  /* Some dynamic sockets left, store the list start
169  * so we can add static sockets in front of it. */
170  sock = (bNodeSocket *)socklist->first;
171  while (stemp->type != -1) {
172  /* Put static sockets in front of dynamic. */
173  BLI_insertlinkbefore(socklist, sock, stemp->sock);
174  stemp++;
175  }
176  }
177  else {
178  while (stemp->type != -1) {
179  BLI_addtail(socklist, stemp->sock);
180  stemp++;
181  }
182  }
183  }
184 }
185 
187 {
188  bNodeType *ntype = node->typeinfo;
189  /* Don't try to match socket lists when there are no templates.
190  * This prevents dynamically generated sockets to be removed, like for
191  * group, image or render layer nodes. We have an explicit check for the
192  * render layer node since it still has fixed sockets too.
193  */
194  if (ntype) {
195  if (ntype->inputs && ntype->inputs[0].type >= 0) {
197  }
198  if (ntype->outputs && ntype->outputs[0].type >= 0 && node->type != CMP_NODE_R_LAYERS) {
200  }
201  }
202 }
203 
205 {
206  int type = sock->typeinfo->type;
207  int subtype = sock->typeinfo->subtype;
208 
209  if (sock->default_value) {
210  return; /* already initialized */
211  }
212 
213  switch (type) {
214  case SOCK_FLOAT: {
216  sizeof(bNodeSocketValueFloat), "node socket value float");
217  dval->subtype = subtype;
218  dval->value = 0.0f;
219  dval->min = -FLT_MAX;
220  dval->max = FLT_MAX;
221 
222  sock->default_value = dval;
223  break;
224  }
225  case SOCK_INT: {
227  "node socket value int");
228  dval->subtype = subtype;
229  dval->value = 0;
230  dval->min = INT_MIN;
231  dval->max = INT_MAX;
232 
233  sock->default_value = dval;
234  break;
235  }
236  case SOCK_BOOLEAN: {
238  sizeof(bNodeSocketValueBoolean), "node socket value bool");
239  dval->value = false;
240 
241  sock->default_value = dval;
242  break;
243  }
244  case SOCK_VECTOR: {
245  static float default_value[] = {0.0f, 0.0f, 0.0f};
247  sizeof(bNodeSocketValueVector), "node socket value vector");
248  dval->subtype = subtype;
250  dval->min = -FLT_MAX;
251  dval->max = FLT_MAX;
252 
253  sock->default_value = dval;
254  break;
255  }
256  case SOCK_RGBA: {
257  static float default_value[] = {0.0f, 0.0f, 0.0f, 1.0f};
259  sizeof(bNodeSocketValueRGBA), "node socket value color");
261 
262  sock->default_value = dval;
263  break;
264  }
265  case SOCK_STRING: {
267  sizeof(bNodeSocketValueString), "node socket value string");
268  dval->subtype = subtype;
269  dval->value[0] = '\0';
270 
271  sock->default_value = dval;
272  break;
273  }
274  case SOCK_OBJECT: {
276  sizeof(bNodeSocketValueObject), "node socket value object");
277  dval->value = nullptr;
278 
279  sock->default_value = dval;
280  break;
281  }
282  case SOCK_IMAGE: {
284  sizeof(bNodeSocketValueImage), "node socket value image");
285  dval->value = nullptr;
286 
287  sock->default_value = dval;
288  break;
289  }
290  case SOCK_COLLECTION: {
292  sizeof(bNodeSocketValueCollection), "node socket value object");
293  dval->value = nullptr;
294 
295  sock->default_value = dval;
296  break;
297  break;
298  }
299  }
300 }
301 
303 {
304  /* sanity check */
305  if (to->type != from->type) {
306  return;
307  }
308 
309  /* make sure both exist */
310  if (!from->default_value) {
311  return;
312  }
314 
315  /* use label instead of name if it has been set */
316  if (from->label[0] != '\0') {
317  BLI_strncpy(to->name, from->label, NODE_MAXSTR);
318  }
319 
320  switch (from->typeinfo->type) {
321  case SOCK_FLOAT: {
323  bNodeSocketValueFloat *fromval = (bNodeSocketValueFloat *)from->default_value;
324  *toval = *fromval;
325  break;
326  }
327  case SOCK_INT: {
329  bNodeSocketValueInt *fromval = (bNodeSocketValueInt *)from->default_value;
330  *toval = *fromval;
331  break;
332  }
333  case SOCK_BOOLEAN: {
335  bNodeSocketValueBoolean *fromval = (bNodeSocketValueBoolean *)from->default_value;
336  *toval = *fromval;
337  break;
338  }
339  case SOCK_VECTOR: {
341  bNodeSocketValueVector *fromval = (bNodeSocketValueVector *)from->default_value;
342  *toval = *fromval;
343  break;
344  }
345  case SOCK_RGBA: {
347  bNodeSocketValueRGBA *fromval = (bNodeSocketValueRGBA *)from->default_value;
348  *toval = *fromval;
349  break;
350  }
351  case SOCK_STRING: {
353  bNodeSocketValueString *fromval = (bNodeSocketValueString *)from->default_value;
354  *toval = *fromval;
355  break;
356  }
357  case SOCK_OBJECT: {
359  bNodeSocketValueObject *fromval = (bNodeSocketValueObject *)from->default_value;
360  *toval = *fromval;
361  id_us_plus(&toval->value->id);
362  break;
363  }
364  case SOCK_IMAGE: {
366  bNodeSocketValueImage *fromval = (bNodeSocketValueImage *)from->default_value;
367  *toval = *fromval;
368  id_us_plus(&toval->value->id);
369  break;
370  }
371  case SOCK_COLLECTION: {
373  bNodeSocketValueCollection *fromval = (bNodeSocketValueCollection *)from->default_value;
374  *toval = *fromval;
375  id_us_plus(&toval->value->id);
376  break;
377  }
378  }
379 
380  to->flag |= (from->flag & SOCK_HIDE_VALUE);
381 }
382 
384  ListBase *links, bNode *node, bNodeSocket *socket, bNode **r_node, bNodeSocket **r_socket)
385 {
386  const int loop_limit = 100; /* Limit in case there is a connection cycle. */
387 
388  if (socket->in_out == SOCK_IN) {
389  bNodeLink *first_link = (bNodeLink *)links->first;
390 
391  for (int i = 0; node->type == NODE_REROUTE && i < loop_limit; i++) {
392  bNodeLink *link = first_link;
393 
394  for (; link; link = link->next) {
395  if (link->fromnode == node && link->tonode != node) {
396  break;
397  }
398  }
399 
400  if (link) {
401  node = link->tonode;
402  socket = link->tosock;
403  }
404  else {
405  break;
406  }
407  }
408  }
409  else {
410  for (int i = 0; node->type == NODE_REROUTE && i < loop_limit; i++) {
411  bNodeSocket *input = (bNodeSocket *)node->inputs.first;
412 
413  if (input && input->link) {
414  node = input->link->fromnode;
415  socket = input->link->fromsock;
416  }
417  else {
418  break;
419  }
420  }
421  }
422 
423  if (r_node) {
424  *r_node = node;
425  }
426  if (r_socket) {
427  *r_socket = socket;
428  }
429 }
430 
432  bNodeSocket *stemp,
433  bNode *UNUSED(node),
434  bNodeSocket *sock,
435  const char *UNUSED(data_path))
436 {
437  /* initialize the type value */
438  sock->type = sock->typeinfo->type;
439 
440  /* XXX socket interface 'type' value is not used really,
441  * but has to match or the copy function will bail out
442  */
443  stemp->type = stemp->typeinfo->type;
444  /* copy default_value settings */
445  node_socket_copy_default_value(sock, stemp);
446 }
447 
448 /* copies settings that are not changed for each socket instance */
450  bNodeSocket *stemp,
451  bNode *UNUSED(node),
452  bNodeSocket *sock,
453  const char *UNUSED(data_path))
454 {
455  /* sanity check */
456  if (sock->type != stemp->typeinfo->type) {
457  return;
458  }
459 
460  /* make sure both exist */
461  if (!stemp->default_value) {
462  return;
463  }
465 
466  switch (stemp->typeinfo->type) {
467  case SOCK_FLOAT: {
470  toval->min = fromval->min;
471  toval->max = fromval->max;
472  break;
473  }
474  case SOCK_INT: {
477  toval->min = fromval->min;
478  toval->max = fromval->max;
479  break;
480  }
481  case SOCK_VECTOR: {
484  toval->min = fromval->min;
485  toval->max = fromval->max;
486  break;
487  }
488  }
489 }
490 
492  bNodeSocket *stemp,
493  bNode *UNUSED(node),
494  bNodeSocket *sock)
495 {
496  /* initialize settings */
497  stemp->type = stemp->typeinfo->type;
498  node_socket_copy_default_value(stemp, sock);
499 }
500 
502 
504 {
505  const char *socket_idname = nodeStaticSocketType(type, subtype);
506  const char *interface_idname = nodeStaticSocketInterfaceType(type, subtype);
507  bNodeSocketType *stype;
508  StructRNA *srna;
509 
510  stype = (bNodeSocketType *)MEM_callocN(sizeof(bNodeSocketType), "node socket C type");
511  stype->free_self = (void (*)(bNodeSocketType * stype)) MEM_freeN;
512  BLI_strncpy(stype->idname, socket_idname, sizeof(stype->idname));
513 
514  /* set the RNA type
515  * uses the exact same identifier as the socket type idname */
516  srna = stype->ext_socket.srna = RNA_struct_find(socket_idname);
517  BLI_assert(srna != nullptr);
518  /* associate the RNA type with the socket type */
519  RNA_struct_blender_type_set(srna, stype);
520 
521  /* set the interface RNA type */
522  srna = stype->ext_interface.srna = RNA_struct_find(interface_idname);
523  BLI_assert(srna != nullptr);
524  /* associate the RNA type with the socket type */
525  RNA_struct_blender_type_set(srna, stype);
526 
527  /* extra type info for standard socket types */
528  stype->type = type;
529  stype->subtype = subtype;
530 
531  /* XXX bad-level call! needed for setting draw callbacks */
533 
537 
538  stype->use_link_limits_of_type = true;
539  stype->input_link_limit = 1;
540  stype->output_link_limit = 0xFFF;
541 
542  return stype;
543 }
544 
546 
548 {
549  const char *socket_idname = "NodeSocketVirtual";
550  bNodeSocketType *stype;
551  StructRNA *srna;
552 
553  stype = (bNodeSocketType *)MEM_callocN(sizeof(bNodeSocketType), "node socket C type");
554  stype->free_self = (void (*)(bNodeSocketType * stype)) MEM_freeN;
555  BLI_strncpy(stype->idname, socket_idname, sizeof(stype->idname));
556 
557  /* set the RNA type
558  * uses the exact same identifier as the socket type idname */
559  srna = stype->ext_socket.srna = RNA_struct_find(socket_idname);
560  BLI_assert(srna != nullptr);
561  /* associate the RNA type with the socket type */
562  RNA_struct_blender_type_set(srna, stype);
563 
564  /* extra type info for standard socket types */
565  stype->type = SOCK_CUSTOM;
566 
568 
569  stype->use_link_limits_of_type = true;
570  stype->input_link_limit = 0xFFF;
571  stype->output_link_limit = 0xFFF;
572 
573  return stype;
574 }
575 
577 {
579  socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<bool>(); };
580  socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) {
581  *(bool *)r_value = ((bNodeSocketValueBoolean *)socket.default_value)->value;
582  };
583  return socktype;
584 }
585 
587 {
589  socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<float>(); };
590  socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) {
591  *(float *)r_value = ((bNodeSocketValueFloat *)socket.default_value)->value;
592  };
593  return socktype;
594 }
595 
597 {
598  bNodeSocketType *socktype = make_standard_socket_type(SOCK_INT, subtype);
599  socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<int>(); };
600  socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) {
601  *(int *)r_value = ((bNodeSocketValueInt *)socket.default_value)->value;
602  };
603  return socktype;
604 }
605 
607 {
609  socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<blender::float3>(); };
610  socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) {
611  *(blender::float3 *)r_value = ((bNodeSocketValueVector *)socket.default_value)->value;
612  };
613  return socktype;
614 }
615 
617 {
619  socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<blender::Color4f>(); };
620  socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) {
621  *(blender::Color4f *)r_value = ((bNodeSocketValueRGBA *)socket.default_value)->value;
622  };
623  return socktype;
624 }
625 
627 {
629  socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<std::string>(); };
630  socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) {
631  new (r_value) std::string(((bNodeSocketValueString *)socket.default_value)->value);
632  };
633  return socktype;
634 }
635 
637  private:
638  Object *object_;
639 
640  public:
641  ObjectSocketMultiFunction(Object *object) : object_(object)
642  {
644  this->set_signature(&signature);
645  }
646 
648  {
651  signature.single_output<blender::bke::PersistentObjectHandle>("Object");
652  return signature.build();
653  }
654 
657  blender::fn::MFContext context) const override
658  {
660  params.uninitialized_single_output<blender::bke::PersistentObjectHandle>(0, "Object");
661 
662  /* Try to get a handle map, so that the object can be converted to a handle. */
663  const blender::bke::PersistentDataHandleMap *handle_map =
665  "PersistentDataHandleMap");
666 
667  if (handle_map == nullptr) {
668  /* Return empty handles when there is no handle map. */
670  return;
671  }
672 
673  blender::bke::PersistentObjectHandle handle = handle_map->lookup(object_);
674  for (int64_t i : mask) {
675  output[i] = handle;
676  }
677  }
678 };
679 
682 
684 {
686  socktype->get_cpp_type = []() {
687  /* Objects are not passed along as raw pointers, but as handles. */
688  return &blender::fn::CPPType::get<blender::bke::PersistentObjectHandle>();
689  };
691  Object *object = builder.socket_default_value<bNodeSocketValueObject>()->value;
692  builder.construct_generator_fn<ObjectSocketMultiFunction>(object);
693  };
694  return socktype;
695 }
696 
698 {
700  socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<GeometrySet>(); };
701  socktype->get_cpp_value = [](const bNodeSocket &UNUSED(socket), void *r_value) {
702  new (r_value) GeometrySet();
703  };
704  return socktype;
705 }
706 
708 {
710  socktype->get_cpp_type = []() {
711  /* Objects are not passed along as raw pointers, but as handles. */
712  return &blender::fn::CPPType::get<blender::bke::PersistentCollectionHandle>();
713  };
714  return socktype;
715 }
716 
718 {
719  /* draw callbacks are set in drawnode.c to avoid bad-level calls */
720 
728 
733 
735 
743 
745 
747 
749 
751 
753 
755 
757 
759 }
void id_us_plus(struct ID *id)
Definition: lib_id.c:288
#define NODE_REROUTE
Definition: BKE_node.h:873
void nodeRegisterSocketType(struct bNodeSocketType *stype)
Definition: node.cc:1352
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
const char * nodeStaticSocketType(int type, int subtype)
Definition: node.cc:1574
const char * nodeStaticSocketInterfaceType(int type, int subtype)
Definition: node.cc:1645
void nodeRemoveSocket(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock)
Definition: node.cc:1775
#define CMP_NODE_R_LAYERS
Definition: BKE_node.h:1152
void nodeModifySocketType(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocket *sock, int type, int subtype)
#define BLI_assert(a)
Definition: BLI_assert.h:58
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:110
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:133
void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink) ATTR_NONNULL(1)
Definition: listbase.c:395
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void copy_v3_v3(float r[3], const float a[3])
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
Definition: string.c:108
#define STREQLEN(a, b, n)
#define UNUSED(x)
Object groups, one object can be in many groups at once.
#define NODE_MAXSTR
eNodeSocketInOut
@ SOCK_OUT
@ SOCK_IN
@ SOCK_HIDE_VALUE
@ SOCK_INT
@ SOCK_VECTOR
@ SOCK_BOOLEAN
@ SOCK_SHADER
@ SOCK_FLOAT
@ SOCK_IMAGE
@ SOCK_COLLECTION
@ SOCK_CUSTOM
@ SOCK_GEOMETRY
@ SOCK_OBJECT
@ SOCK_STRING
@ SOCK_RGBA
_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
Read Guarded memory(de)allocation.
PropertySubType
Definition: RNA_types.h:112
@ PROP_TIME
Definition: RNA_types.h:133
@ PROP_DIRECTION
Definition: RNA_types.h:141
@ PROP_XYZ
Definition: RNA_types.h:148
@ PROP_DISTANCE
Definition: RNA_types.h:135
@ PROP_ACCELERATION
Definition: RNA_types.h:143
@ PROP_ANGLE
Definition: RNA_types.h:132
@ PROP_EULER
Definition: RNA_types.h:145
@ PROP_NONE
Definition: RNA_types.h:113
@ PROP_PERCENTAGE
Definition: RNA_types.h:130
@ PROP_FACTOR
Definition: RNA_types.h:131
@ PROP_TRANSLATION
Definition: RNA_types.h:140
@ PROP_UNSIGNED
Definition: RNA_types.h:129
@ PROP_VELOCITY
Definition: RNA_types.h:142
#define output
ObjectSocketMultiFunction(Object *object)
Definition: node_socket.cc:641
static blender::fn::MFSignature create_signature()
Definition: node_socket.cc:647
void call(blender::IndexMask mask, blender::fn::MFParams params, blender::fn::MFContext context) const override
Definition: node_socket.cc:655
void set_signature(const MFSignature *signature)
const MFSignature & signature() const
OperationNode * node
StackEntry * from
bNodeTree * ntree
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:45
void node_socket_init_default_value(bNodeSocket *sock)
Definition: node_socket.cc:204
void ED_init_node_socket_type_virtual(bNodeSocketType *)
Definition: drawnode.c:3542
void node_verify_socket_templates(bNodeTree *ntree, bNode *node)
Definition: node_socket.cc:186
static void standard_node_socket_interface_init_socket(bNodeTree *UNUSED(ntree), bNodeSocket *stemp, bNode *UNUSED(node), bNodeSocket *sock, const char *UNUSED(data_path))
Definition: node_socket.cc:431
static void standard_node_socket_interface_verify_socket(bNodeTree *UNUSED(ntree), bNodeSocket *stemp, bNode *UNUSED(node), bNodeSocket *sock, const char *UNUSED(data_path))
Definition: node_socket.cc:449
void node_socket_copy_default_value(bNodeSocket *to, const bNodeSocket *from)
Definition: node_socket.cc:302
static void standard_node_socket_interface_from_socket(bNodeTree *UNUSED(ntree), bNodeSocket *stemp, bNode *UNUSED(node), bNodeSocket *sock)
Definition: node_socket.cc:491
static void verify_socket_template_list(bNodeTree *ntree, bNode *node, eNodeSocketInOut in_out, ListBase *socklist, bNodeSocketTemplate *stemp_first)
Definition: node_socket.cc:136
void register_standard_node_socket_types(void)
Definition: node_socket.cc:717
MAKE_CPP_TYPE(PersistentObjectHandle, blender::bke::PersistentObjectHandle)
static bNodeSocketType * make_socket_type_geometry()
Definition: node_socket.cc:697
static bNodeSocketType * make_socket_type_string()
Definition: node_socket.cc:626
static bNodeSocketType * make_socket_type_vector(PropertySubType subtype)
Definition: node_socket.cc:606
static bNodeSocketType * make_standard_socket_type(int type, int subtype)
Definition: node_socket.cc:503
static bNodeSocketType * make_socket_type_int(PropertySubType subtype)
Definition: node_socket.cc:596
static bNodeSocketType * make_socket_type_virtual()
Definition: node_socket.cc:547
static bNodeSocketType * make_socket_type_object()
Definition: node_socket.cc:683
void ED_init_standard_node_socket_type(bNodeSocketType *)
Definition: drawnode.c:3526
struct bNodeSocket * node_add_socket_from_template(struct bNodeTree *ntree, struct bNode *node, struct bNodeSocketTemplate *stemp, eNodeSocketInOut in_out)
Definition: node_socket.cc:52
static bNodeSocketType * make_socket_type_rgba()
Definition: node_socket.cc:616
static bNodeSocketType * make_socket_type_collection()
Definition: node_socket.cc:707
void node_socket_skip_reroutes(ListBase *links, bNode *node, bNodeSocket *socket, bNode **r_node, bNodeSocket **r_socket)
Definition: node_socket.cc:383
static bNodeSocket * verify_socket_template(bNodeTree *ntree, bNode *node, eNodeSocketInOut in_out, ListBase *socklist, bNodeSocketTemplate *stemp)
Definition: node_socket.cc:105
static bNodeSocketType * make_socket_type_float(PropertySubType subtype)
Definition: node_socket.cc:586
static bNodeSocketType * make_socket_type_bool()
Definition: node_socket.cc:576
void RNA_struct_blender_type_set(StructRNA *srna, void *blender_type)
Definition: rna_access.c:1044
StructRNA * RNA_struct_find(const char *identifier)
Definition: rna_access.c:718
struct SELECTID_Context context
Definition: select_engine.c:47
__int64 int64_t
Definition: stdint.h:92
StructRNA * srna
Definition: RNA_types.h:681
void * first
Definition: DNA_listBase.h:47
Compact definition of a node socket.
Definition: BKE_node.h:95
struct bNodeSocket * sock
Definition: BKE_node.h:104
char identifier[64]
Definition: BKE_node.h:105
Defines a socket type.
Definition: BKE_node.h:143
void(* interface_init_socket)(struct bNodeTree *ntree, struct bNodeSocket *stemp, struct bNode *node, struct bNodeSocket *sock, const char *data_path)
Definition: BKE_node.h:161
int input_link_limit
Definition: BKE_node.h:185
ExtensionRNA ext_interface
Definition: BKE_node.h:178
ExtensionRNA ext_socket
Definition: BKE_node.h:177
int output_link_limit
Definition: BKE_node.h:186
void(* interface_verify_socket)(struct bNodeTree *ntree, struct bNodeSocket *stemp, struct bNode *node, struct bNodeSocket *sock, const char *data_path)
Definition: BKE_node.h:166
bool use_link_limits_of_type
Definition: BKE_node.h:184
void(* free_self)(struct bNodeSocketType *stype)
Definition: BKE_node.h:189
SocketGetCPPTypeFunction get_cpp_type
Definition: BKE_node.h:194
SocketExpandInMFNetworkFunction expand_in_mf_network
Definition: BKE_node.h:192
SocketGetCPPValueFunction get_cpp_value
Definition: BKE_node.h:196
char idname[64]
Definition: BKE_node.h:144
void(* interface_from_socket)(struct bNodeTree *ntree, struct bNodeSocket *stemp, struct bNode *node, struct bNodeSocket *sock)
Definition: BKE_node.h:171
struct Collection * value
struct Image * value
struct Object * value
char name[64]
struct bNodeLink * link
struct bNodeSocket * next
void * default_value
struct bNodeSocketType * typeinfo
Defines a node type.
Definition: BKE_node.h:221
bNodeSocketTemplate * outputs
Definition: BKE_node.h:236
bNodeSocketTemplate * inputs
Definition: BKE_node.h:236
ccl_device_inline float4 mask(const int4 &mask, const float4 &a)