Revision: 41735
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41735
Author:   blendix
Date:     2011-11-10 13:38:55 +0000 (Thu, 10 Nov 2011)
Log Message:
-----------
Nodes: fix crash loading old files that have node sockets changed, the version
patch for the default value storage needs to be done before lib linking,
otherwise this can crash. Fixes problem opening some old cycles files.

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c   2011-11-10 
13:28:58 UTC (rev 41734)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c   2011-11-10 
13:38:55 UTC (rev 41735)
@@ -2123,11 +2123,61 @@
        }
 }
 
+static void do_versions_socket_default_value(bNodeSocket *sock)
+{
+       bNodeSocketValueFloat *valfloat;
+       bNodeSocketValueVector *valvector;
+       bNodeSocketValueRGBA *valrgba;
+       
+       if (sock->default_value)
+               return;
+       
+       switch (sock->type) {
+       case SOCK_FLOAT:
+               valfloat = sock->default_value = 
MEM_callocN(sizeof(bNodeSocketValueFloat), "default socket value");
+               valfloat->value = sock->ns.vec[0];
+               valfloat->min = sock->ns.min;
+               valfloat->max = sock->ns.max;
+               valfloat->subtype = PROP_NONE;
+               break;
+       case SOCK_VECTOR:
+               valvector = sock->default_value = 
MEM_callocN(sizeof(bNodeSocketValueVector), "default socket value");
+               copy_v3_v3(valvector->value, sock->ns.vec);
+               valvector->min = sock->ns.min;
+               valvector->max = sock->ns.max;
+               valvector->subtype = PROP_NONE;
+               break;
+       case SOCK_RGBA:
+               valrgba = sock->default_value = 
MEM_callocN(sizeof(bNodeSocketValueRGBA), "default socket value");
+               copy_v4_v4(valrgba->value, sock->ns.vec);
+               break;
+       }
+}
+
+static void do_versions_nodetree_default_value(bNodeTree *ntree)
+{
+       bNode *node;
+       bNodeSocket *sock;
+       for (node=ntree->nodes.first; node; node=node->next) {
+               for (sock=node->inputs.first; sock; sock=sock->next)
+                       do_versions_socket_default_value(sock);
+               for (sock=node->outputs.first; sock; sock=sock->next)
+                       do_versions_socket_default_value(sock);
+       }
+       for (sock=ntree->inputs.first; sock; sock=sock->next)
+               do_versions_socket_default_value(sock);
+       for (sock=ntree->outputs.first; sock; sock=sock->next)
+               do_versions_socket_default_value(sock);
+}
+
 static void lib_nodetree_init_types_cb(void *UNUSED(data), ID *UNUSED(id), 
bNodeTree *ntree)
 {
        bNode *node;
        
        ntreeInitTypes(ntree);
+
+       /* need to do this here instead of in do_versions, otherwise next 
function can crash */
+       do_versions_nodetree_default_value(ntree);
        
        /* XXX could be replaced by do_versions for new nodes */
        for (node=ntree->nodes.first; node; node=node->next)
@@ -7181,53 +7231,6 @@
                do_version_bone_roll_256(child);
 }
 
-static void do_versions_socket_default_value(bNodeSocket *sock)
-{
-       bNodeSocketValueFloat *valfloat;
-       bNodeSocketValueVector *valvector;
-       bNodeSocketValueRGBA *valrgba;
-       
-       if (sock->default_value)
-               return;
-       
-       switch (sock->type) {
-       case SOCK_FLOAT:
-               valfloat = sock->default_value = 
MEM_callocN(sizeof(bNodeSocketValueFloat), "default socket value");
-               valfloat->value = sock->ns.vec[0];
-               valfloat->min = sock->ns.min;
-               valfloat->max = sock->ns.max;
-               valfloat->subtype = PROP_NONE;
-               break;
-       case SOCK_VECTOR:
-               valvector = sock->default_value = 
MEM_callocN(sizeof(bNodeSocketValueVector), "default socket value");
-               copy_v3_v3(valvector->value, sock->ns.vec);
-               valvector->min = sock->ns.min;
-               valvector->max = sock->ns.max;
-               valvector->subtype = PROP_NONE;
-               break;
-       case SOCK_RGBA:
-               valrgba = sock->default_value = 
MEM_callocN(sizeof(bNodeSocketValueRGBA), "default socket value");
-               copy_v4_v4(valrgba->value, sock->ns.vec);
-               break;
-       }
-}
-
-static void do_versions_nodetree_default_value(bNodeTree *ntree)
-{
-       bNode *node;
-       bNodeSocket *sock;
-       for (node=ntree->nodes.first; node; node=node->next) {
-               for (sock=node->inputs.first; sock; sock=sock->next)
-                       do_versions_socket_default_value(sock);
-               for (sock=node->outputs.first; sock; sock=sock->next)
-                       do_versions_socket_default_value(sock);
-       }
-       for (sock=ntree->inputs.first; sock; sock=sock->next)
-               do_versions_socket_default_value(sock);
-       for (sock=ntree->outputs.first; sock; sock=sock->next)
-               do_versions_socket_default_value(sock);
-}
-
 static void do_versions_nodetree_dynamic_sockets(bNodeTree *ntree)
 {
        bNodeSocket *sock;

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

Reply via email to