diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp index 45a97f1d530..bf934147527 100644 --- a/intern/cycles/blender/blender_shader.cpp +++ b/intern/cycles/blender/blender_shader.cpp @@ -680,66 +680,63 @@ static void add_nodes(Scene *scene, BL::BlendData b_data, BL::Scene b_scene, Sha } } else if (b_node->is_a(&RNA_ShaderNodeGroup)) { + BL::NodeGroup b_gnode(*b_node); BL::ShaderNodeTree b_group_ntree(b_gnode.node_tree()); ProxyMap group_proxy_map; - if (!b_group_ntree) - continue; - - add_nodes(scene, b_data, b_scene, graph, b_group_ntree, group_proxy_map); - - /* map the outer socket to the internal proxy nodes */ + /* Add a proxy node for each socket + * Do this even if the node group has no internal tree, + * so that links have something to connect to and assert won't fail. + */ for(b_node->inputs.begin(b_input); b_input != b_node->inputs.end(); ++b_input) { + ProxyNode *proxy = new ProxyNode(convert_socket_type(*b_input)); + graph->add(proxy); - /* get internal proxy node from group proxy map */ - assert(group_proxy_map.find(b_input->identifier()) != group_proxy_map.end()); - assert(group_proxy_map[b_input->identifier()]->special_type == SHADER_SPECIAL_TYPE_PROXY); - ProxyNode *proxy = group_proxy_map[b_input->identifier()]; + /* register the proxy node for internal binding */ + group_proxy_map[b_input->identifier()] = proxy; input_map[b_input->ptr.data] = proxy->inputs[0]; - - /* input value for proxy inputs is defined by group node */ - set_default_value(proxy->inputs[0], *b_node, *b_input, b_data, b_ntree); } - - /* map the outer socket to the internal proxy nodes */ - for(b_node->outputs.begin(b_output); b_output != b_node->outputs.end(); ++b_output) { - - /* get internal proxy node from group node map */ - assert(group_proxy_map.find(b_output->identifier()) != group_proxy_map.end()); - assert(group_proxy_map[b_output->identifier()]->special_type == SHADER_SPECIAL_TYPE_PROXY); - ProxyNode *proxy = group_proxy_map[b_output->identifier()]; - - output_map[b_output->ptr.data] = proxy->outputs[0]; - } - } - else if (b_node->is_a(&RNA_NodeGroupInput)) { - /* add a proxy node for each socket */ for(b_node->outputs.begin(b_output); b_output != b_node->outputs.end(); ++b_output) { ProxyNode *proxy = new ProxyNode(convert_socket_type(*b_output)); + graph->add(proxy); + + /* register the proxy node for internal binding */ + group_proxy_map[b_output->identifier()] = proxy; output_map[b_output->ptr.data] = proxy->outputs[0]; - - /* register the proxy node for external binding */ - proxy_map[b_output->identifier()] = proxy; - - graph->add(proxy); + } + + if (b_group_ntree) + add_nodes(scene, b_data, b_scene, graph, b_group_ntree, group_proxy_map); + } + else if (b_node->is_a(&RNA_NodeGroupInput)) { + /* map each socket to a proxy node */ + for(b_node->outputs.begin(b_output); b_output != b_node->outputs.end(); ++b_output) { + ProxyMap::iterator proxy_it = proxy_map.find(b_output->identifier()); + if (proxy_it != proxy_map.end()) { + ProxyNode *proxy = proxy_it->second; + + output_map[b_output->ptr.data] = proxy->outputs[0]; + } } } else if (b_node->is_a(&RNA_NodeGroupOutput)) { - /* add a proxy node for each socket */ - for(b_node->inputs.begin(b_input); b_input != b_node->inputs.end(); ++b_input) { - ProxyNode *proxy = new ProxyNode(convert_socket_type(*b_input)); - - input_map[b_input->ptr.data] = proxy->inputs[0]; - - set_default_value(proxy->inputs[0], *b_node, *b_input, b_data, b_ntree); - - /* register the proxy node for external binding */ - proxy_map[b_input->identifier()] = proxy; - - graph->add(proxy); + BL::NodeGroupOutput b_output_node(*b_node); + /* only the active group output is used */ + if (b_output_node.is_active_output()) { + /* map each socket to a proxy node */ + for(b_node->inputs.begin(b_input); b_input != b_node->inputs.end(); ++b_input) { + ProxyMap::iterator proxy_it = proxy_map.find(b_input->identifier()); + if (proxy_it != proxy_map.end()) { + ProxyNode *proxy = proxy_it->second; + + input_map[b_input->ptr.data] = proxy->inputs[0]; + + set_default_value(proxy->inputs[0], *b_node, *b_input, b_data, b_ntree); + } + } } } else { diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index 45a81e1a2ab..6add49a5292 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -2843,6 +2843,11 @@ static void def_group_output(StructRNA *srna) RNA_def_property_struct_type(prop, "PropertyGroup"); RNA_def_property_flag(prop, PROP_IDPROPERTY); RNA_def_property_ui_text(prop, "Interface", "Interface socket data"); + + prop = RNA_def_property(srna, "is_active_output", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", NODE_DO_OUTPUT); + RNA_def_property_ui_text(prop, "Active Output", "True if this node is used as the active group output"); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); } static void def_group(StructRNA *srna)