Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2020-03-21 03:30:31 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2020-03-21 17:04:02 +0300
commitada28d3c658492c10091c5dddd3278503f43db4c (patch)
tree3ae4deee8b8b7a3cee6213afb86d5163e41ee75d /source
parentc0544eedc6b6c18abb3ada3463fd0ee85cc81501 (diff)
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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_image.c43
1 files changed, 13 insertions, 30 deletions
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,