[Bf-blender-cvs] [ada28d3c658] master: Fix T67712: cryptomatte sockets created in wrong order in some cases

Brecht Van Lommel noreply at git.blender.org
Sat Mar 21 15:05:38 CET 2020


Commit: ada28d3c658492c10091c5dddd3278503f43db4c
Author: Brecht Van Lommel
Date:   Sat Mar 21 01:30:31 2020 +0100
Branches: master
https://developer.blender.org/rBada28d3c658492c10091c5dddd3278503f43db4c

Fix T67712: cryptomatte sockets created in wrong order in some cases

Simplify the logic and always create node outputs in the order specified
by the render engine, I can't see a reason why built-in passes must be
first.

===================================================================

M	source/blender/nodes/composite/nodes/node_composite_image.c

===================================================================

diff --git a/source/blender/nodes/composite/nodes/node_composite_image.c b/source/blender/nodes/composite/nodes/node_composite_image.c
index cda142e1a8b..10de192277b 100644
--- a/source/blender/nodes/composite/nodes/node_composite_image.c
+++ b/source/blender/nodes/composite/nodes/node_composite_image.c
@@ -80,25 +80,14 @@ static void cmp_node_image_add_pass_output(bNodeTree *ntree,
                                            const char *passname,
                                            int rres_index,
                                            eNodeSocketDatatype type,
-                                           int is_rlayers,
+                                           int UNUSED(is_rlayers),
                                            LinkNodePair *available_sockets,
                                            int *prev_index)
 {
-  bNodeSocket *sock;
-  int sock_index = BLI_findstringindex(&node->outputs, name, offsetof(bNodeSocket, name));
-
-  if (sock_index < 0) {
-    /* The first 31 sockets always are the legacy hardcoded sockets.
-     * Any dynamically allocated sockets follow afterwards,
-     * and are sorted in the order in which they were stored in the RenderResult.
-     * Therefore, we remember the index of the last matched socket.
-     * New sockets are placed behind the previously traversed one,
-     * but always after the first 31. */
-    int after_index = *prev_index;
-    if (is_rlayers && after_index < MAX_LEGACY_SOCKET_INDEX) {
-      after_index = MAX_LEGACY_SOCKET_INDEX;
-    }
+  bNodeSocket *sock = BLI_findstring(&node->outputs, name, offsetof(bNodeSocket, name));
 
+  /* Create socket if it doesn't exist yet. */
+  if (sock == NULL) {
     if (rres_index >= 0) {
       sock = node_add_socket_from_template(
           ntree, node, &cmp_node_rlayers_out[rres_index], SOCK_OUT);
@@ -109,26 +98,20 @@ static void cmp_node_image_add_pass_output(bNodeTree *ntree,
     /* extra socket info */
     NodeImageLayer *sockdata = MEM_callocN(sizeof(NodeImageLayer), "node image layer");
     sock->storage = sockdata;
+  }
 
+  NodeImageLayer *sockdata = sock->storage;
+  if (sockdata) {
     BLI_strncpy(sockdata->pass_name, passname, sizeof(sockdata->pass_name));
-
-    sock_index = BLI_listbase_count(&node->outputs) - 1;
-    if (sock_index != after_index + 1) {
-      bNodeSocket *after_sock = BLI_findlink(&node->outputs, after_index);
-      BLI_remlink(&node->outputs, sock);
-      BLI_insertlinkafter(&node->outputs, after_sock, sock);
-    }
-  }
-  else {
-    sock = BLI_findlink(&node->outputs, sock_index);
-    NodeImageLayer *sockdata = sock->storage;
-    if (sockdata) {
-      BLI_strncpy(sockdata->pass_name, passname, sizeof(sockdata->pass_name));
-    }
   }
 
+  /* Reorder sockets according to order that passes are added. */
+  const int after_index = (*prev_index)++;
+  bNodeSocket *after_sock = BLI_findlink(&node->outputs, after_index);
+  BLI_remlink(&node->outputs, sock);
+  BLI_insertlinkafter(&node->outputs, after_sock, sock);
+
   BLI_linklist_append(available_sockets, sock);
-  *prev_index = sock_index;
 }
 
 static void cmp_node_image_create_outputs(bNodeTree *ntree,



More information about the Bf-blender-cvs mailing list