Node merge: some forward compatibility code to avoid crash loading files with
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 6 Sep 2011 16:51:10 +0000 (16:51 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Tue, 6 Sep 2011 16:51:10 +0000 (16:51 +0000)
node groups in older version, and to keep unconnected/default socket values.

source/blender/blenloader/intern/writefile.c
source/blender/makesdna/DNA_node_types.h

index b982630ec41fd29dfe308942cfb1b387ca9a7042..5c2d3e0c4582d2b57183c4a507b82b574e8f4f88 100644 (file)
@@ -135,6 +135,7 @@ Any case: direct data is ALWAYS after the lib block
 #include "BLI_blenlib.h"
 #include "BLI_linklist.h"
 #include "BLI_bpath.h"
+#include "BLI_math.h"
 #include "BLI_utildefines.h"
 
 #include "BKE_action.h"
@@ -645,6 +646,38 @@ static void write_curvemapping(WriteData *wd, CurveMapping *cumap)
 static void write_node_socket(WriteData *wd, bNodeSocket *sock)
 {
        bNodeSocketType *stype= ntreeGetSocketType(sock->type);
+
+       /* forward compatibility code, so older blenders still open */
+       sock->stack_type = 1;
+
+       if(sock->default_value) {
+               bNodeSocketValueFloat *valfloat;
+               bNodeSocketValueVector *valvector;
+               bNodeSocketValueRGBA *valrgba;
+               
+               switch (sock->type) {
+               case SOCK_FLOAT:
+                       valfloat = sock->default_value;
+                       sock->ns.vec[0] = valfloat->value;
+                       sock->ns.min = valfloat->min;
+                       sock->ns.max = valfloat->max;
+                       break;
+               case SOCK_VECTOR:
+                       valvector = sock->default_value;
+                       copy_v3_v3(sock->ns.vec, valvector->value);
+                       sock->ns.min = valvector->min;
+                       sock->ns.max = valvector->max;
+                       break;
+               case SOCK_RGBA:
+                       valrgba = sock->default_value;
+                       copy_v4_v4(sock->ns.vec, valrgba->value);
+                       sock->ns.min = 0.0f;
+                       sock->ns.max = 1.0f;
+                       break;
+               }
+       }
+
+       /* actual socket writing */
        writestruct(wd, DATA, "bNodeSocket", 1, sock);
        if (sock->default_value)
                writestruct(wd, DATA, stype->value_structname, 1, sock->default_value);
index 3a51a6a56a423f22a5cfb735c29efc374e0bc5a4..bac1e3cd8cac594d847cd3958a84e73902667c34 100644 (file)
@@ -84,7 +84,7 @@ typedef struct bNodeSocket {
        
        /* execution data */
        short stack_index;                      /* local stack index */
-       short pad2;
+       short stack_type;                       /* deprecated, kept for forward compatibility */
        int pad3;
        void *cache;                            /* cached data from execution */
        
@@ -198,8 +198,8 @@ typedef struct bNodeLink {
 } bNodeLink;
 
 /* link->flag */
-#define NODE_LINK_VALID                        1               /* link has been successfully validated */
-#define NODE_LINKFLAG_HILITE   2
+#define NODE_LINKFLAG_HILITE   1               /* link has been successfully validated */
+#define NODE_LINK_VALID                        2
 
 /* the basis for a Node tree, all links and nodes reside internal here */
 /* only re-usable node trees are in the library though, materials and textures allocate own tree struct */