Revision: 57676
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57676
Author:   blendix
Date:     2013-06-23 19:24:32 +0000 (Sun, 23 Jun 2013)
Log Message:
-----------
Fix #35847: cycles group nodes did not work well exposing inputs like normal or
texture coordinate that should automatically use the default normal or texture
coordinate appropriate for that node, rather than some fixed value specified by
the user.

Modified Paths:
--------------
    trunk/blender/intern/cycles/render/graph.cpp
    trunk/blender/intern/cycles/render/graph.h
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/intern/cycles/render/nodes.h
    trunk/blender/source/blender/nodes/intern/node_socket.c

Modified: trunk/blender/intern/cycles/render/graph.cpp
===================================================================
--- trunk/blender/intern/cycles/render/graph.cpp        2013-06-23 19:07:46 UTC 
(rev 57675)
+++ trunk/blender/intern/cycles/render/graph.cpp        2013-06-23 19:24:32 UTC 
(rev 57676)
@@ -199,7 +199,7 @@
                }
 
                /* add automatic conversion node in case of type mismatch */
-               ShaderNode *convert = add(new ConvertNode(from->type, 
to->type));
+               ShaderNode *convert = add(new ConvertNode(from->type, to->type, 
true));
 
                connect(from, convert->inputs[0]);
                connect(convert->outputs[0], to);
@@ -341,6 +341,24 @@
                        }
                        else {
                                foreach(ShaderInput *to, links) {
+                                       /* remove any autoconvert nodes too if 
they lead to
+                                        * sockets with an automatically set 
default value */
+                                       ShaderNode *tonode = to->parent;
+
+                                       if(tonode->special_type == 
SHADER_SPECIAL_TYPE_AUTOCONVERT) {
+                                               bool all_links_removed = true;
+
+                                               foreach(ShaderInput *autoin, 
tonode->outputs[0]->links) {
+                                                       
if(autoin->default_value == ShaderInput::NONE)
+                                                               
all_links_removed = false;
+                                                       else
+                                                               
disconnect(autoin);
+                                               }
+
+                                               if(all_links_removed)
+                                                       removed[tonode->id] = 
true;
+                                       }
+
                                        disconnect(to);
                                        
                                        /* transfer the default input value to 
the target socket */
@@ -352,10 +370,10 @@
                        removed[proxy->id] = true;
                        any_node_removed = true;
                }
+               else if(node->special_type == SHADER_SPECIAL_TYPE_MIX_CLOSURE) {
+                       MixClosureNode *mix = 
static_cast<MixClosureNode*>(node);
 
-               /* remove useless mix closures nodes */
-               if(node->special_type == SHADER_SPECIAL_TYPE_MIX_CLOSURE) {
-                       MixClosureNode *mix = 
static_cast<MixClosureNode*>(node);
+                       /* remove useless mix closures nodes */
                        if(mix->outputs[0]->links.size() && 
mix->inputs[1]->link == mix->inputs[2]->link) {
                                ShaderOutput *output = mix->inputs[1]->link;
                                vector<ShaderInput*> inputs = 
mix->outputs[0]->links;
@@ -370,15 +388,11 @@
                                                connect(output, input);
                                }
                        }
-               }
                
-               /* remove unused mix closure input when factor is 0.0 or 1.0 */
-               if(node->special_type == SHADER_SPECIAL_TYPE_MIX_CLOSURE) {
-                       MixClosureNode *mix = 
static_cast<MixClosureNode*>(node);
-                       /* Check for closure links and make sure factor link is 
disconnected */
+                       /* remove unused mix closure input when factor is 0.0 
or 1.0 */
+                       /* check for closure links and make sure factor link is 
disconnected */
                        if(mix->outputs[0]->links.size() && 
mix->inputs[1]->link && mix->inputs[2]->link && !mix->inputs[0]->link) {
-                       
-                               /* Factor 0.0 */
+                               /* factor 0.0 */
                                if(mix->inputs[0]->value.x == 0.0f) {
                                        ShaderOutput *output = 
mix->inputs[1]->link;
                                        vector<ShaderInput*> inputs = 
mix->outputs[0]->links;
@@ -393,7 +407,7 @@
                                                        connect(output, input);
                                        }
                                }
-                               /* Factor 1.0 */
+                               /* factor 1.0 */
                                else if(mix->inputs[0]->value.x == 1.0f) {
                                        ShaderOutput *output = 
mix->inputs[2]->link;
                                        vector<ShaderInput*> inputs = 
mix->outputs[0]->links;

Modified: trunk/blender/intern/cycles/render/graph.h
===================================================================
--- trunk/blender/intern/cycles/render/graph.h  2013-06-23 19:07:46 UTC (rev 
57675)
+++ trunk/blender/intern/cycles/render/graph.h  2013-06-23 19:24:32 UTC (rev 
57676)
@@ -75,7 +75,8 @@
 enum ShaderNodeSpecialType {
        SHADER_SPECIAL_TYPE_NONE,
        SHADER_SPECIAL_TYPE_PROXY,
-       SHADER_SPECIAL_TYPE_MIX_CLOSURE
+       SHADER_SPECIAL_TYPE_MIX_CLOSURE,
+       SHADER_SPECIAL_TYPE_AUTOCONVERT
 };
 
 /* Enum

Modified: trunk/blender/intern/cycles/render/nodes.cpp
===================================================================
--- trunk/blender/intern/cycles/render/nodes.cpp        2013-06-23 19:07:46 UTC 
(rev 57675)
+++ trunk/blender/intern/cycles/render/nodes.cpp        2013-06-23 19:24:32 UTC 
(rev 57676)
@@ -1121,12 +1121,15 @@
 
 /* Convert */
 
-ConvertNode::ConvertNode(ShaderSocketType from_, ShaderSocketType to_)
+ConvertNode::ConvertNode(ShaderSocketType from_, ShaderSocketType to_, bool 
autoconvert)
 : ShaderNode("convert")
 {
        from = from_;
        to = to_;
 
+       if(autoconvert)
+               special_type = SHADER_SPECIAL_TYPE_AUTOCONVERT;
+
        assert(from != to);
 
        if(from == SHADER_SOCKET_FLOAT)
@@ -1271,7 +1274,7 @@
 /* BSDF Closure */
 
 BsdfNode::BsdfNode(bool scattering_)
-: ShaderNode("subsurface_scattering"), scattering(scattering_)
+: ShaderNode("bsdf"), scattering(scattering_)
 {
        closure = ccl::CLOSURE_BSSRDF_ID;
 

Modified: trunk/blender/intern/cycles/render/nodes.h
===================================================================
--- trunk/blender/intern/cycles/render/nodes.h  2013-06-23 19:07:46 UTC (rev 
57675)
+++ trunk/blender/intern/cycles/render/nodes.h  2013-06-23 19:24:32 UTC (rev 
57676)
@@ -182,7 +182,7 @@
 
 class ConvertNode : public ShaderNode {
 public:
-       ConvertNode(ShaderSocketType from, ShaderSocketType to);
+       ConvertNode(ShaderSocketType from, ShaderSocketType to, bool 
autoconvert = false);
        SHADER_NODE_BASE_CLASS(ConvertNode)
 
        ShaderSocketType from, to;

Modified: trunk/blender/source/blender/nodes/intern/node_socket.c
===================================================================
--- trunk/blender/source/blender/nodes/intern/node_socket.c     2013-06-23 
19:07:46 UTC (rev 57675)
+++ trunk/blender/source/blender/nodes/intern/node_socket.c     2013-06-23 
19:24:32 UTC (rev 57676)
@@ -308,6 +308,8 @@
                        break;
                }
        }
+
+       to->flag |= (from->flag & SOCK_HIDE_VALUE);
 }
 
 static void standard_node_socket_interface_init_socket(bNodeTree 
*UNUSED(ntree), bNodeSocket *stemp, bNode *UNUSED(node), bNodeSocket *sock, 
const char *UNUSED(data_path))

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to