[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31855] branches/particles-2010/source/ blender: fixed saving/loading of data node socket properties.

Lukas Toenne lukas.toenne at googlemail.com
Fri Sep 10 14:46:44 CEST 2010


Revision: 31855
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31855
Author:   lukastoenne
Date:     2010-09-10 14:46:43 +0200 (Fri, 10 Sep 2010)

Log Message:
-----------
fixed saving/loading of data node socket properties. similar to data node StructRNA types, these are saved and reconstructed from their PropertyRNA identifier strings.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenkernel/BKE_node.h
    branches/particles-2010/source/blender/blenloader/intern/readfile.c
    branches/particles-2010/source/blender/blenloader/intern/writefile.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_program.c
    branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_set_data.c

Modified: branches/particles-2010/source/blender/blenkernel/BKE_node.h
===================================================================
--- branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-09-10 08:36:14 UTC (rev 31854)
+++ branches/particles-2010/source/blender/blenkernel/BKE_node.h	2010-09-10 12:46:43 UTC (rev 31855)
@@ -115,6 +115,8 @@
 
 	/* called when the node is updated (e.g. linked) in the editor. */
 	void (*updatefunc)(struct bNodeTree *ntree, struct bNode *node);
+
+	char socketstoragename[64];		/* socket storage struct name for DNA */
 	void (*initsocketfunc)(struct bNodeSocket *sock);
 	void (*copysocketstoragefunc)(struct bNodeSocket *from, struct bNodeSocket *to);
 	void (*freesocketstoragefunc)(struct bNodeSocket *sock);

Modified: branches/particles-2010/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/particles-2010/source/blender/blenloader/intern/readfile.c	2010-09-10 08:36:14 UTC (rev 31854)
+++ branches/particles-2010/source/blender/blenloader/intern/readfile.c	2010-09-10 12:46:43 UTC (rev 31855)
@@ -2073,7 +2073,7 @@
 		 */
 		RNA_string_set(&ptr, "typename", rna_data->save_type);
 		
-		/* save_type is only needed for restoring the type */
+		/* save_type is only needed for restoring the type pointer */
 		MEM_freeN((void*)rna_data->save_type);
 		rna_data->save_type = NULL;
 	}
@@ -2081,6 +2081,49 @@
 		RNA_string_set(&ptr, "typename", "");
 }
 
+static void direct_link_node_socket_properties(FileData *fd, bNode *node)
+{
+	NodeRNAData *rna_data= (NodeRNAData*)node->storage;
+	bNodeSocket *sock;
+	
+	if (node->type==SIM_NODE_GETDATA)
+		sock= ((bNodeSocket*)node->outputs.first)->next;
+	else if (node->type==SIM_NODE_GETDATA)
+		sock= ((bNodeSocket*)node->inputs.first)->next;
+	else
+		sock= NULL;
+	
+	for (; sock; sock = sock->next) {
+		NodeSocketProperty *sockprop= (NodeSocketProperty*)sock->storage;
+		
+		/* restore the identifier string */
+		sockprop->save_prop = newdataadr(fd, (void*)sockprop->save_prop);
+		
+		if (sockprop->save_prop != NULL) {
+			if (rna_data->type != NULL) {
+				const ListBase *lb;
+				Link *link;
+				PropertyRNA *prop;
+				
+				lb = RNA_struct_defined_properties(rna_data->type);
+				for (link=lb->first; link; link = link->next) {
+					prop = (PropertyRNA *)link;
+					if (strcmp(RNA_property_ui_name(prop), sockprop->save_prop)==0) {
+						sockprop->prop = prop;
+						break;
+					}
+				}
+				
+				/* save_prop is only needed for restoring the property pointer */
+				MEM_freeN((void*)sockprop->save_prop);
+				sockprop->save_prop = NULL;
+			}
+		}
+		else
+			sockprop->prop = NULL;
+	}
+}
+
 extern StructRNA RNA_SimulationNodeGetData;
 extern StructRNA RNA_SimulationNodeSetData;
 /* ntree itself has been read! */
@@ -2143,6 +2186,9 @@
 			sock->ns.data= NULL;
 			sock->storage= newdataadr(fd, sock->storage);
 		}
+
+		if (node->type==SIM_NODE_GETDATA || node->type==SIM_NODE_SETDATA)
+			direct_link_node_socket_properties(fd, node);
 	}
 	for(link= ntree->links.first; link; link= link->next) {
 		link->fromnode= newdataadr(fd, link->fromnode);

Modified: branches/particles-2010/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/particles-2010/source/blender/blenloader/intern/writefile.c	2010-09-10 08:36:14 UTC (rev 31854)
+++ branches/particles-2010/source/blender/blenloader/intern/writefile.c	2010-09-10 12:46:43 UTC (rev 31855)
@@ -489,9 +489,13 @@
 		}
 		for(sock= node->inputs.first; sock; sock= sock->next) {
 			writestruct(wd, DATA, "bNodeSocket", 1, sock);
+			if (node->storage)
+				writestruct(wd, DATA, node->typeinfo->socketstoragename, 1, sock->storage);
 		}
 		for(sock= node->outputs.first; sock; sock= sock->next) {
 			writestruct(wd, DATA, "bNodeSocket", 1, sock);
+			if (node->storage)
+				writestruct(wd, DATA, node->typeinfo->socketstoragename, 1, sock->storage);
 		}
 	}
 	

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c	2010-09-10 08:36:14 UTC (rev 31854)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_get_data.c	2010-09-10 12:46:43 UTC (rev 31855)
@@ -345,6 +345,7 @@
 	/* pynode, pydict  */	NULL, NULL,
 	/* gpufunc         */	NULL,
 	/* updatefunc      */	update,
+	/* socketstoragename */	"NodeSocketProperty",
 	/* initsocketfunc  */	initsocket,
 	/* copysocketstoragefunc */	copysocketstorage,
 	/* freesocketstoragefunc */	freesocketstorage,

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c	2010-09-10 08:36:14 UTC (rev 31854)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_if.c	2010-09-10 12:46:43 UTC (rev 31855)
@@ -67,6 +67,7 @@
 	/* pynode, pydict  */	NULL, NULL,
 	/* gpufunc         */	NULL,
 	/* updatefunc      */	NULL,
+	/* socketstoragename */	"",
 	/* initsocketfunc  */	NULL,
 	/* copysocketstoragefunc */	NULL,
 	/* freesocketstoragefunc */	NULL,

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_program.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_program.c	2010-09-10 08:36:14 UTC (rev 31854)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_program.c	2010-09-10 12:46:43 UTC (rev 31855)
@@ -92,6 +92,7 @@
 	/* pynode, pydict  */	NULL, NULL,
 	/* gpufunc         */	NULL,
 	/* updatefunc      */	update,
+	/* socketstoragename */	"",
 	/* initsocketfunc  */	NULL,
 	/* copysocketstoragefunc */	NULL,
 	/* freesocketstoragefunc */	NULL,

Modified: branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_set_data.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_set_data.c	2010-09-10 08:36:14 UTC (rev 31854)
+++ branches/particles-2010/source/blender/nodes/intern/SIM_nodes/SIM_set_data.c	2010-09-10 12:46:43 UTC (rev 31855)
@@ -182,6 +182,7 @@
 static void enqueue_input(SimExecData *execdata, SimDataContext *ctx, SimSocketStack *in)
 {
 	int datasize = sim_get_data_size(in->type);
+	PropertyRNA *prop= ((NodeSocketProperty*)in->base->storage)->prop;
 	
 	if (sim_context_is_collection(ctx)) {
 		CollectionPropertyIterator iter;
@@ -212,8 +213,8 @@
 		switch (in->type) {
 		case SOCK_FLOAT:
 			while (iter.valid) {
-				RNA_property_float_set(&iter.ptr, (PropertyRNA*)in->base->storage, *(float*)cur);
-				RNA_property_update_main(G.main, ctx->scene, &iter.ptr, (PropertyRNA*)in->base->storage);
+				RNA_property_float_set(&iter.ptr, prop, *(float*)cur);
+				RNA_property_update_main(G.main, ctx->scene, &iter.ptr, prop);
 				RNA_property_collection_next(&iter);
 				++i;
 				if (i < in->context.size)
@@ -222,8 +223,8 @@
 			break;
 		case SOCK_INT:
 			while (iter.valid) {
-				RNA_property_int_set(&iter.ptr, (PropertyRNA*)in->base->storage, *(int*)cur);
-				RNA_property_update_main(G.main, ctx->scene, &iter.ptr, (PropertyRNA*)in->base->storage);
+				RNA_property_int_set(&iter.ptr, prop, *(int*)cur);
+				RNA_property_update_main(G.main, ctx->scene, &iter.ptr, prop);
 				RNA_property_collection_next(&iter);
 				++i;
 				if (i < in->context.size)
@@ -232,8 +233,8 @@
 			break;
 		case SOCK_BOOL:
 			while (iter.valid) {
-				RNA_property_boolean_set(&iter.ptr, (PropertyRNA*)in->base->storage, (int)(*(char*)cur));
-				RNA_property_update_main(G.main, ctx->scene, &iter.ptr, (PropertyRNA*)in->base->storage);
+				RNA_property_boolean_set(&iter.ptr, prop, (int)(*(char*)cur));
+				RNA_property_update_main(G.main, ctx->scene, &iter.ptr, prop);
 				RNA_property_collection_next(&iter);
 				++i;
 				if (i < in->context.size)
@@ -242,8 +243,8 @@
 			break;
 		case SOCK_VECTOR:
 			while (iter.valid) {
-				RNA_property_float_set_array(&iter.ptr, (PropertyRNA*)in->base->storage, (float*)cur);
-				RNA_property_update_main(G.main, ctx->scene, &iter.ptr, (PropertyRNA*)in->base->storage);
+				RNA_property_float_set_array(&iter.ptr, prop, (float*)cur);
+				RNA_property_update_main(G.main, ctx->scene, &iter.ptr, prop);
 				RNA_property_collection_next(&iter);
 				++i;
 				if (i < in->context.size)
@@ -252,8 +253,8 @@
 			break;
 		case SOCK_RGBA:
 			while (iter.valid) {
-				RNA_property_float_set_array(&iter.ptr, (PropertyRNA*)in->base->storage, (float*)cur);
-				RNA_property_update_main(G.main, ctx->scene, &iter.ptr, (PropertyRNA*)in->base->storage);
+				RNA_property_float_set_array(&iter.ptr, prop, (float*)cur);
+				RNA_property_update_main(G.main, ctx->scene, &iter.ptr, prop);
 				RNA_property_collection_next(&iter);
 				++i;
 				if (i < in->context.size)
@@ -262,8 +263,8 @@
 			break;
 		case SOCK_STRING:
 			while (iter.valid) {
-				RNA_property_string_set(&iter.ptr, (PropertyRNA*)in->base->storage, (char*)cur);
-				RNA_property_update_main(G.main, ctx->scene, &iter.ptr, (PropertyRNA*)in->base->storage);
+				RNA_property_string_set(&iter.ptr, prop, (char*)cur);
+				RNA_property_update_main(G.main, ctx->scene, &iter.ptr, prop);
 				RNA_property_collection_next(&iter);
 				++i;
 				if (i < in->context.size)
@@ -287,28 +288,28 @@
 		
 		switch (in->type) {
 		case SOCK_FLOAT:
-			RNA_property_float_set(&ctx->ptr, (PropertyRNA*)in->base->storage, *(float*)buf);
-			RNA_property_update_main(G.main, ctx->scene, &ctx->ptr, (PropertyRNA*)in->base->storage);
+			RNA_property_float_set(&ctx->ptr, prop, *(float*)buf);
+			RNA_property_update_main(G.main, ctx->scene, &ctx->ptr, prop);
 			break;
 		case SOCK_INT:
-			RNA_property_int_set(&ctx->ptr, (PropertyRNA*)in->base->storage, *(int*)buf);
-			RNA_property_update_main(G.main, ctx->scene, &ctx->ptr, (PropertyRNA*)in->base->storage);
+			RNA_property_int_set(&ctx->ptr, prop, *(int*)buf);
+			RNA_property_update_main(G.main, ctx->scene, &ctx->ptr, prop);
 			break;
 		case SOCK_BOOL:
-			RNA_property_boolean_set(&ctx->ptr, (PropertyRNA*)in->base->storage, (int)(*(char*)buf));
-			RNA_property_update_main(G.main, ctx->scene, &ctx->ptr, (PropertyRNA*)in->base->storage);
+			RNA_property_boolean_set(&ctx->ptr, prop, (int)(*(char*)buf));

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list