GPencil: Cancel Fill if the filled area is not closed
[blender.git] / source / blender / nodes / intern / node_util.c
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
20 /** \file
21  * \ingroup nodes
22  */
23
24 #include <ctype.h>
25 #include <limits.h>
26 #include <string.h>
27
28 #include "DNA_node_types.h"
29
30 #include "BLI_listbase.h"
31 #include "BLI_string.h"
32 #include "BLI_utildefines.h"
33
34 #include "BLT_translation.h"
35
36 #include "BKE_colortools.h"
37 #include "BKE_node.h"
38
39 #include "RNA_access.h"
40 #include "RNA_enum_types.h"
41
42 #include "MEM_guardedalloc.h"
43
44 #include "node_util.h"
45
46 /* -------------------------------------------------------------------- */
47 /** \name Storage Data
48  * \{ */
49
50 void node_free_curves(bNode *node)
51 {
52   BKE_curvemapping_free(node->storage);
53 }
54
55 void node_free_standard_storage(bNode *node)
56 {
57   if (node->storage) {
58     MEM_freeN(node->storage);
59   }
60 }
61
62 void node_copy_curves(bNodeTree *UNUSED(dest_ntree), bNode *dest_node, const bNode *src_node)
63 {
64   dest_node->storage = BKE_curvemapping_copy(src_node->storage);
65 }
66
67 void node_copy_standard_storage(bNodeTree *UNUSED(dest_ntree),
68                                 bNode *dest_node,
69                                 const bNode *src_node)
70 {
71   dest_node->storage = MEM_dupallocN(src_node->storage);
72 }
73
74 void *node_initexec_curves(bNodeExecContext *UNUSED(context),
75                            bNode *node,
76                            bNodeInstanceKey UNUSED(key))
77 {
78   BKE_curvemapping_init(node->storage);
79   return NULL; /* unused return */
80 }
81
82 /** \} */
83
84 /* -------------------------------------------------------------------- */
85 /** \name Updates
86  * \{ */
87
88 void node_sock_label(bNodeSocket *sock, const char *name)
89 {
90   BLI_strncpy(sock->label, name, MAX_NAME);
91 }
92
93 void node_math_update(bNodeTree *UNUSED(ntree), bNode *node)
94 {
95   bNodeSocket *sock1 = BLI_findlink(&node->inputs, 0);
96   bNodeSocket *sock2 = BLI_findlink(&node->inputs, 1);
97   bNodeSocket *sock3 = BLI_findlink(&node->inputs, 2);
98   nodeSetSocketAvailability(sock2,
99                             !ELEM(node->custom1,
100                                   NODE_MATH_SQRT,
101                                   NODE_MATH_SIGN,
102                                   NODE_MATH_CEIL,
103                                   NODE_MATH_SINE,
104                                   NODE_MATH_ROUND,
105                                   NODE_MATH_FLOOR,
106                                   NODE_MATH_COSINE,
107                                   NODE_MATH_ARCSINE,
108                                   NODE_MATH_TANGENT,
109                                   NODE_MATH_ABSOLUTE,
110                                   NODE_MATH_RADIANS,
111                                   NODE_MATH_DEGREES,
112                                   NODE_MATH_FRACTION,
113                                   NODE_MATH_ARCCOSINE,
114                                   NODE_MATH_ARCTANGENT) &&
115                                 !ELEM(node->custom1,
116                                       NODE_MATH_INV_SQRT,
117                                       NODE_MATH_TRUNC,
118                                       NODE_MATH_EXPONENT,
119                                       NODE_MATH_COSH,
120                                       NODE_MATH_SINH,
121                                       NODE_MATH_TANH));
122   nodeSetSocketAvailability(sock3,
123                             ELEM(node->custom1,
124                                  NODE_MATH_COMPARE,
125                                  NODE_MATH_MULTIPLY_ADD,
126                                  NODE_MATH_WRAP,
127                                  NODE_MATH_SMOOTH_MIN,
128                                  NODE_MATH_SMOOTH_MAX));
129
130   if (sock1->label[0] != '\0') {
131     sock1->label[0] = '\0';
132   }
133   if (sock2->label[0] != '\0') {
134     sock2->label[0] = '\0';
135   }
136   if (sock3->label[0] != '\0') {
137     sock3->label[0] = '\0';
138   }
139
140   switch (node->custom1) {
141     case NODE_MATH_WRAP:
142       node_sock_label(sock2, "Min");
143       node_sock_label(sock3, "Max");
144       break;
145     case NODE_MATH_MULTIPLY_ADD:
146       node_sock_label(sock2, "Multiplier");
147       node_sock_label(sock3, "Addend");
148       break;
149     case NODE_MATH_LESS_THAN:
150     case NODE_MATH_GREATER_THAN:
151       node_sock_label(sock2, "Threshold");
152       break;
153     case NODE_MATH_PINGPONG:
154       node_sock_label(sock2, "Scale");
155       break;
156     case NODE_MATH_SNAP:
157       node_sock_label(sock2, "Increment");
158       break;
159     case NODE_MATH_POWER:
160       node_sock_label(sock1, "Base");
161       node_sock_label(sock2, "Exponent");
162       break;
163     case NODE_MATH_LOGARITHM:
164       node_sock_label(sock2, "Base");
165       break;
166     case NODE_MATH_DEGREES:
167       node_sock_label(sock1, "Radians");
168       break;
169     case NODE_MATH_RADIANS:
170       node_sock_label(sock1, "Degrees");
171       break;
172     case NODE_MATH_COMPARE:
173       node_sock_label(sock3, "Epsilon");
174       break;
175     case NODE_MATH_SMOOTH_MAX:
176     case NODE_MATH_SMOOTH_MIN:
177       node_sock_label(sock3, "Distance");
178       break;
179   }
180 }
181
182 /** \} */
183
184 /* -------------------------------------------------------------------- */
185 /** \name Labels
186  * \{ */
187
188 void node_blend_label(bNodeTree *UNUSED(ntree), bNode *node, char *label, int maxlen)
189 {
190   const char *name;
191   bool enum_label = RNA_enum_name(rna_enum_ramp_blend_items, node->custom1, &name);
192   if (!enum_label) {
193     name = "Unknown";
194   }
195   BLI_strncpy(label, IFACE_(name), maxlen);
196 }
197
198 void node_image_label(bNodeTree *UNUSED(ntree), bNode *node, char *label, int maxlen)
199 {
200   /* If there is no loaded image, return an empty string,
201    * and let nodeLabel() fill in the proper type translation. */
202   BLI_strncpy(label, (node->id) ? node->id->name + 2 : "", maxlen);
203 }
204
205 void node_math_label(bNodeTree *UNUSED(ntree), bNode *node, char *label, int maxlen)
206 {
207   const char *name;
208   bool enum_label = RNA_enum_name(rna_enum_node_math_items, node->custom1, &name);
209   if (!enum_label) {
210     name = "Unknown";
211   }
212   BLI_strncpy(label, IFACE_(name), maxlen);
213 }
214
215 void node_vector_math_label(bNodeTree *UNUSED(ntree), bNode *node, char *label, int maxlen)
216 {
217   const char *name;
218   bool enum_label = RNA_enum_name(rna_enum_node_vec_math_items, node->custom1, &name);
219   if (!enum_label) {
220     name = "Unknown";
221   }
222   BLI_strncpy(label, IFACE_(name), maxlen);
223 }
224
225 void node_filter_label(bNodeTree *UNUSED(ntree), bNode *node, char *label, int maxlen)
226 {
227   const char *name;
228   bool enum_label = RNA_enum_name(rna_enum_node_filter_items, node->custom1, &name);
229   if (!enum_label) {
230     name = "Unknown";
231   }
232   BLI_strncpy(label, IFACE_(name), maxlen);
233 }
234
235 /** \} */
236
237 /* -------------------------------------------------------------------- */
238 /** \name Link Insertion
239  * \{ */
240
241 /* test if two sockets are interchangeable */
242 static bool node_link_socket_match(bNodeSocket *a, bNodeSocket *b)
243 {
244   /* check if sockets are of the same type */
245   if (a->typeinfo != b->typeinfo) {
246     return false;
247   }
248
249   /* tests if alphabetic prefix matches
250    * this allows for imperfect matches, such as numeric suffixes,
251    * like Color1/Color2
252    */
253   int prefix_len = 0;
254   char *ca = a->name, *cb = b->name;
255   for (; *ca != '\0' && *cb != '\0'; ca++, cb++) {
256     /* end of common prefix? */
257     if (*ca != *cb) {
258       /* prefix delimited by non-alphabetic char */
259       if (isalpha(*ca) || isalpha(*cb)) {
260         return false;
261       }
262       break;
263     }
264     prefix_len++;
265   }
266   return prefix_len > 0;
267 }
268
269 static int node_count_links(bNodeTree *ntree, bNodeSocket *sock)
270 {
271   bNodeLink *link;
272   int count = 0;
273   for (link = ntree->links.first; link; link = link->next) {
274     if (link->fromsock == sock) {
275       count++;
276     }
277     if (link->tosock == sock) {
278       count++;
279     }
280   }
281   return count;
282 }
283
284 /* Find an eligible socket for linking. */
285 static bNodeSocket *node_find_linkable_socket(bNodeTree *ntree, bNode *node, bNodeSocket *cur)
286 {
287   bNodeSocket *first = cur->in_out == SOCK_IN ? node->inputs.first : node->outputs.first;
288   bNodeSocket *sock;
289
290   /* Iterate over all sockets of the target node, to find one that matches the same socket type.
291    * The idea behind this is: When a user connects an input to a socket that is
292    * already linked (and if its not an Multi Input Socket), we try to find a replacement socket for
293    * the link that we try to overwrite and connect that previous link to the new socket. */
294   sock = cur->next ? cur->next : first; /* Wrap around the list end. */
295   while (sock != cur) {
296     if (!nodeSocketIsHidden(sock) && node_link_socket_match(sock, cur)) {
297       break;
298     }
299     sock = sock->next ? sock->next : first; /* Wrap around the list end. */
300   }
301
302   if (!nodeSocketIsHidden(sock) && node_link_socket_match(sock, cur)) {
303     int link_count = node_count_links(ntree, sock);
304     /* Take +1 into account since we would add a new link. */
305     if (link_count + 1 <= nodeSocketLinkLimit(sock)) {
306       return sock; /* Found a valid free socket we can swap to. */
307     }
308   }
309   return NULL;
310 }
311
312 void node_insert_link_default(bNodeTree *ntree, bNode *node, bNodeLink *link)
313 {
314   bNodeSocket *sock = link->tosock;
315   bNodeLink *tlink, *tlink_next;
316
317   if (node != link->tonode) {
318     return;
319   }
320
321   for (tlink = ntree->links.first; tlink; tlink = tlink_next) {
322     bNodeSocket *new_sock;
323     tlink_next = tlink->next;
324
325     if (sock != tlink->tosock) {
326       continue;
327     }
328
329     new_sock = node_find_linkable_socket(ntree, node, sock);
330     if (new_sock && new_sock != sock) {
331       /* redirect existing link */
332       tlink->tosock = new_sock;
333     }
334     else if (!new_sock) {
335       /* no possible replacement, remove tlink */
336       nodeRemLink(ntree, tlink);
337       tlink = NULL;
338     }
339   }
340 }
341
342 /** \} */
343
344 /* -------------------------------------------------------------------- */
345 /** \name Internal Links (mute and disconnect)
346  * \{ */
347
348 /**
349  * Common datatype priorities, works for compositor, shader and texture nodes alike
350  * defines priority of datatype connection based on output type (to):
351  * `<  0`: never connect these types.
352  * `>= 0`: priority of connection (higher values chosen first).
353  */
354 static int node_datatype_priority(eNodeSocketDatatype from, eNodeSocketDatatype to)
355 {
356   switch (to) {
357     case SOCK_RGBA:
358       switch (from) {
359         case SOCK_RGBA:
360           return 4;
361         case SOCK_FLOAT:
362           return 3;
363         case SOCK_INT:
364           return 2;
365         case SOCK_BOOLEAN:
366           return 1;
367         default:
368           return -1;
369       }
370     case SOCK_VECTOR:
371       switch (from) {
372         case SOCK_VECTOR:
373           return 4;
374         case SOCK_FLOAT:
375           return 3;
376         case SOCK_INT:
377           return 2;
378         case SOCK_BOOLEAN:
379           return 1;
380         default:
381           return -1;
382       }
383     case SOCK_FLOAT:
384       switch (from) {
385         case SOCK_FLOAT:
386           return 5;
387         case SOCK_INT:
388           return 4;
389         case SOCK_BOOLEAN:
390           return 3;
391         case SOCK_RGBA:
392           return 2;
393         case SOCK_VECTOR:
394           return 1;
395         default:
396           return -1;
397       }
398     case SOCK_INT:
399       switch (from) {
400         case SOCK_INT:
401           return 5;
402         case SOCK_FLOAT:
403           return 4;
404         case SOCK_BOOLEAN:
405           return 3;
406         case SOCK_RGBA:
407           return 2;
408         case SOCK_VECTOR:
409           return 1;
410         default:
411           return -1;
412       }
413     case SOCK_BOOLEAN:
414       switch (from) {
415         case SOCK_BOOLEAN:
416           return 5;
417         case SOCK_INT:
418           return 4;
419         case SOCK_FLOAT:
420           return 3;
421         case SOCK_RGBA:
422           return 2;
423         case SOCK_VECTOR:
424           return 1;
425         default:
426           return -1;
427       }
428     case SOCK_SHADER:
429       switch (from) {
430         case SOCK_SHADER:
431           return 1;
432         default:
433           return -1;
434       }
435     case SOCK_STRING:
436       switch (from) {
437         case SOCK_STRING:
438           return 1;
439         default:
440           return -1;
441       }
442     case SOCK_OBJECT: {
443       switch (from) {
444         case SOCK_OBJECT:
445           return 1;
446         default:
447           return -1;
448       }
449     }
450     case SOCK_GEOMETRY: {
451       switch (from) {
452         case SOCK_GEOMETRY:
453           return 1;
454         default:
455           return -1;
456       }
457     }
458     case SOCK_COLLECTION: {
459       switch (from) {
460         case SOCK_COLLECTION:
461           return 1;
462         default:
463           return -1;
464       }
465     }
466     default:
467       return -1;
468   }
469 }
470
471 /* select a suitable input socket for an output */
472 static bNodeSocket *select_internal_link_input(bNode *node, bNodeSocket *output)
473 {
474   bNodeSocket *selected = NULL, *input;
475   int i;
476   int sel_priority = -1;
477   bool sel_is_linked = false;
478
479   for (input = node->inputs.first, i = 0; input; input = input->next, i++) {
480     int priority = node_datatype_priority(input->type, output->type);
481     bool is_linked = (input->link != NULL);
482     bool preferred;
483
484     if (nodeSocketIsHidden(input) || /* ignore hidden sockets */
485         input->flag &
486             SOCK_NO_INTERNAL_LINK || /* ignore if input is not allowed for internal connections */
487         priority < 0 ||              /* ignore incompatible types */
488         priority < sel_priority)     /* ignore if we already found a higher priority input */
489     {
490       continue;
491     }
492
493     /* determine if this input is preferred over the currently selected */
494     preferred = (priority > sel_priority) ||   /* prefer higher datatype priority */
495                 (is_linked && !sel_is_linked); /* prefer linked over unlinked */
496
497     if (preferred) {
498       selected = input;
499       sel_is_linked = is_linked;
500       sel_priority = priority;
501     }
502   }
503
504   return selected;
505 }
506
507 void node_update_internal_links_default(bNodeTree *ntree, bNode *node)
508 {
509   bNodeLink *link;
510   bNodeSocket *output, *input;
511
512   /* sanity check */
513   if (!ntree) {
514     return;
515   }
516
517   /* use link pointer as a tag for handled sockets (for outputs is unused anyway) */
518   for (output = node->outputs.first; output; output = output->next) {
519     output->link = NULL;
520   }
521
522   for (link = ntree->links.first; link; link = link->next) {
523     if (nodeLinkIsHidden(link)) {
524       continue;
525     }
526
527     output = link->fromsock;
528     if (link->fromnode != node || output->link) {
529       continue;
530     }
531     if (nodeSocketIsHidden(output) || output->flag & SOCK_NO_INTERNAL_LINK) {
532       continue;
533     }
534     output->link = link; /* not really used, just for tagging handled sockets */
535
536     /* look for suitable input */
537     input = select_internal_link_input(node, output);
538
539     if (input) {
540       bNodeLink *ilink = MEM_callocN(sizeof(bNodeLink), "internal node link");
541       ilink->fromnode = node;
542       ilink->fromsock = input;
543       ilink->tonode = node;
544       ilink->tosock = output;
545       /* internal link is always valid */
546       ilink->flag |= NODE_LINK_VALID;
547       BLI_addtail(&node->internal_links, ilink);
548     }
549   }
550
551   /* clean up */
552   for (output = node->outputs.first; output; output = output->next) {
553     output->link = NULL;
554   }
555 }
556
557 /** \} */
558
559 /* -------------------------------------------------------------------- */
560 /** \name Default value RNA access
561  * \{ */
562
563 float node_socket_get_float(bNodeTree *ntree, bNode *UNUSED(node), bNodeSocket *sock)
564 {
565   PointerRNA ptr;
566   RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
567   return RNA_float_get(&ptr, "default_value");
568 }
569
570 void node_socket_set_float(bNodeTree *ntree, bNode *UNUSED(node), bNodeSocket *sock, float value)
571 {
572   PointerRNA ptr;
573   RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
574   RNA_float_set(&ptr, "default_value", value);
575 }
576
577 void node_socket_get_color(bNodeTree *ntree, bNode *UNUSED(node), bNodeSocket *sock, float *value)
578 {
579   PointerRNA ptr;
580   RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
581   RNA_float_get_array(&ptr, "default_value", value);
582 }
583
584 void node_socket_set_color(bNodeTree *ntree,
585                            bNode *UNUSED(node),
586                            bNodeSocket *sock,
587                            const float *value)
588 {
589   PointerRNA ptr;
590   RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
591   RNA_float_set_array(&ptr, "default_value", value);
592 }
593
594 void node_socket_get_vector(bNodeTree *ntree, bNode *UNUSED(node), bNodeSocket *sock, float *value)
595 {
596   PointerRNA ptr;
597   RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
598   RNA_float_get_array(&ptr, "default_value", value);
599 }
600
601 void node_socket_set_vector(bNodeTree *ntree,
602                             bNode *UNUSED(node),
603                             bNodeSocket *sock,
604                             const float *value)
605 {
606   PointerRNA ptr;
607   RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
608   RNA_float_set_array(&ptr, "default_value", value);
609 }
610
611 /** \} */