Fix #28914: crash loading file saved with cycles builds in trunk.
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Fri, 14 Oct 2011 12:20:58 +0000 (12:20 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Fri, 14 Oct 2011 12:20:58 +0000 (12:20 +0000)
The cause is an unknown node socket type in node groups. Ideally the node system
should handle this better and remove the unknown sockets from groups, but this
is a bit of a risky fix to do now, so instead the shader socket type has been
added, since this is a simple change and the code has been tested well.

source/blender/nodes/intern/node_socket.c

index aabaf5b86dee669f6abd5ae09394aacb0028f58c..51e48b84383193b9d1020da4c54c2c778763f45d 100644 (file)
@@ -128,6 +128,21 @@ static bNodeSocketType node_socket_type_boolean = {
        /* buttonfunc */                NULL,
 };
 
+/****************** SHADER ******************/
+
+static bNodeSocketType node_socket_type_shader = {
+       /* type */                              SOCK_SHADER,
+       /* ui_name */                   "Shader",
+       /* ui_description */    "Shader",
+       /* ui_icon */                   0,
+       /* ui_color */                  {100,200,100,255},
+
+       /* value_structname */  NULL,
+       /* value_structsize */  0,
+
+       /* buttonfunc */                NULL,
+};
+
 /****************** MESH ******************/
 
 static bNodeSocketType node_socket_type_mesh = {
@@ -153,6 +168,7 @@ void node_socket_type_init(bNodeSocketType *types[])
        INIT_TYPE(rgba);
        INIT_TYPE(int);
        INIT_TYPE(boolean);
+       INIT_TYPE(shader);
        INIT_TYPE(mesh);
        
        #undef INIT_TYPE
@@ -241,6 +257,17 @@ struct bNodeSocket *nodeAddOutputRGBA(struct bNodeTree *ntree, struct bNode *nod
        return sock;
 }
 
+struct bNodeSocket *nodeAddInputShader(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+       bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_SHADER);
+       return sock;
+}
+struct bNodeSocket *nodeAddOutputShader(struct bNodeTree *ntree, struct bNode *node, const char *name)
+{
+       bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_OUT, name, SOCK_SHADER);
+       return sock;
+}
+
 struct bNodeSocket *nodeAddInputMesh(struct bNodeTree *ntree, struct bNode *node, const char *name)
 {
        bNodeSocket *sock= nodeAddSocket(ntree, node, SOCK_IN, name, SOCK_MESH);
@@ -271,6 +298,9 @@ struct bNodeSocket *node_add_input_from_template(struct bNodeTree *ntree, struct
        case SOCK_RGBA:
                sock = nodeAddInputRGBA(ntree, node, stemp->name, stemp->val1, stemp->val2, stemp->val3, stemp->val4);
                break;
+       case SOCK_SHADER:
+               sock = nodeAddInputShader(ntree, node, stemp->name);
+               break;
        case SOCK_MESH:
                sock = nodeAddInputMesh(ntree, node, stemp->name);
                break;
@@ -299,6 +329,9 @@ struct bNodeSocket *node_add_output_from_template(struct bNodeTree *ntree, struc
        case SOCK_RGBA:
                sock = nodeAddOutputRGBA(ntree, node, stemp->name);
                break;
+       case SOCK_SHADER:
+               sock = nodeAddOutputShader(ntree, node, stemp->name);
+               break;
        case SOCK_MESH:
                sock = nodeAddOutputMesh(ntree, node, stemp->name);
                break;