Fix T46406: Cycles ignores default socket value associated with group socket
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 8 Oct 2015 11:03:13 +0000 (16:03 +0500)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 8 Oct 2015 11:05:51 +0000 (16:05 +0500)
intern/cycles/blender/blender_shader.cpp

index 17fcf03d8666764d50062b78dedb6ff7d21f3b99..fe6289018b2206d82e3d9bed7fc55b56db3e502b 100644 (file)
@@ -107,8 +107,15 @@ static ShaderSocketType convert_socket_type(BL::NodeSocket b_socket)
        }
 }
 
-static void set_default_value(ShaderInput *input, BL::NodeSocket b_sock, BL::BlendData b_data, BL::ID b_id)
+template <class SocketType>
+static void set_default_value(ShaderInput *input,
+                              SocketType b_sock,
+                              BL::BlendData b_data,
+                              BL::ID b_id)
 {
+       /* TODO(sergey): Use static assert to check SocketType is either BL::NodeSocket
+        * or BL::NodeSocketInterface.
+        */
        /* copy values for non linked inputs */
        switch(input->type) {
        case SHADER_SOCKET_FLOAT: {
@@ -911,7 +918,8 @@ static void add_nodes(Scene *scene,
                         * 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) {
+                       int input_index = 0;
+                       for(b_node->inputs.begin(b_input); b_input != b_node->inputs.end(); ++b_input, ++input_index) {
                                ProxyNode *proxy = new ProxyNode(convert_socket_type(*b_input));
                                graph->add(proxy);
 
@@ -920,7 +928,11 @@ static void add_nodes(Scene *scene,
 
                                input_map[b_input->ptr.data] = proxy->inputs[0];
 
-                               set_default_value(proxy->inputs[0], *b_input, b_data, b_ntree);
+                               /* Use default value from corresponding socket interface since it's
+                                * not copied from group to actual group node.
+                                */
+                               BL::NodeSocketInterface socket_interface = b_group_ntree.inputs[input_index];
+                               set_default_value(proxy->inputs[0], socket_interface, b_data, b_ntree);
                        }
                        for(b_node->outputs.begin(b_output); b_output != b_node->outputs.end(); ++b_output) {
                                ProxyNode *proxy = new ProxyNode(convert_socket_type(*b_output));