From 34b8d22275280963cb89471346a211e069780cb9 Mon Sep 17 00:00:00 2001 From: Antony Riakiotakis Date: Wed, 18 Jun 2014 20:40:27 +0300 Subject: Fix T40585, group textures cannot be selected for painting. Issue here is that if there's a texture in the tree, chances are it has already been set as active texture so groups are never traversed. Now changed logic so that if a group node is active, its own active texture takes priority over the parent group active texture. --- source/blender/nodes/shader/node_shader_util.c | 42 ++++++++++++++++++++------ 1 file changed, 33 insertions(+), 9 deletions(-) (limited to 'source/blender/nodes') diff --git a/source/blender/nodes/shader/node_shader_util.c b/source/blender/nodes/shader/node_shader_util.c index b00d96de935..49881381253 100644 --- a/source/blender/nodes/shader/node_shader_util.c +++ b/source/blender/nodes/shader/node_shader_util.c @@ -195,24 +195,48 @@ static void data_from_gpu_stack_list(ListBase *sockets, bNodeStack **ns, GPUNode bNode *nodeGetActiveTexture(bNodeTree *ntree) { /* this is the node we texture paint and draw in textured draw */ - bNode *node, *tnode, *inactivenode = NULL; + bNode *node, *tnode, *inactivenode = NULL, *activetexnode = NULL, *activegroup = NULL; + bool hasgroup = false; if (!ntree) return NULL; for (node = ntree->nodes.first; node; node = node->next) { - if (node->flag & NODE_ACTIVE_TEXTURE) - return node; + if (node->flag & NODE_ACTIVE_TEXTURE) { + activetexnode = node; + /* if active we can return immediately */ + if (node->flag & NODE_ACTIVE) + return node; + } else if (!inactivenode && node->typeinfo->nclass == NODE_CLASS_TEXTURE) inactivenode = node; + else if (node->type == NODE_GROUP) { + if (node->flag & NODE_ACTIVE) + activegroup = node; + else + hasgroup = true; + } + } + + /* first, check active group for textures */ + if (activegroup) { + tnode = nodeGetActiveTexture((bNodeTree *)activegroup->id); + /* active node takes priority, so ignore any other possible nodes here */ + if (tnode) + return tnode; } + + if (activetexnode) + return activetexnode; - /* node active texture node in this tree, look inside groups */ - for (node = ntree->nodes.first; node; node = node->next) { - if (node->type == NODE_GROUP) { - tnode = nodeGetActiveTexture((bNodeTree *)node->id); - if (tnode && ((tnode->flag & NODE_ACTIVE_TEXTURE) || !inactivenode)) - return tnode; + if (hasgroup) { + /* node active texture node in this tree, look inside groups */ + for (node = ntree->nodes.first; node; node = node->next) { + if (node->type == NODE_GROUP) { + tnode = nodeGetActiveTexture((bNodeTree *)node->id); + if (tnode && ((tnode->flag & NODE_ACTIVE_TEXTURE) || !inactivenode)) + return tnode; + } } } -- cgit v1.2.3