[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32415] branches/particles-2010/source/ blender: Added a new RNA access function "RNA_find_struct" that looks up a StructRNA from the main BLENDER_RNA list.

Lukas Toenne lukas.toenne at googlemail.com
Mon Oct 11 13:00:28 CEST 2010


Revision: 32415
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32415
Author:   lukastoenne
Date:     2010-10-11 13:00:28 +0200 (Mon, 11 Oct 2010)

Log Message:
-----------
Added a new RNA access function "RNA_find_struct" that looks up a StructRNA from the main BLENDER_RNA list. This is used for restoring rna struct pointers from id strings for saving and loading.
Few more math nodes updated.

Modified Paths:
--------------
    branches/particles-2010/source/blender/blenloader/intern/readfile.c
    branches/particles-2010/source/blender/blenloader/intern/writefile.c
    branches/particles-2010/source/blender/makesdna/DNA_node_types.h
    branches/particles-2010/source/blender/makesrna/RNA_access.h
    branches/particles-2010/source/blender/makesrna/intern/rna_access.c
    branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
    branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_math.c
    branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_vectormath.c

Modified: branches/particles-2010/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/particles-2010/source/blender/blenloader/intern/readfile.c	2010-10-11 10:47:20 UTC (rev 32414)
+++ branches/particles-2010/source/blender/blenloader/intern/readfile.c	2010-10-11 11:00:28 UTC (rev 32415)
@@ -2068,25 +2068,13 @@
 
 static void direct_link_node_rna_data(FileData *fd, bNodeTree *ntree, bNode *node)
 {
-	PointerRNA ptr;
 	NodeRNAData *rna_data= (NodeRNAData*)node->storage;
 	
 	/* restore the identifier string */
 	rna_data->save_type = newdataadr(fd, (void*)rna_data->save_type);
-	
-	RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr);
-	if (rna_data->save_type != NULL) {
-		/* note: using the rna property for setting the type.
-		 * the StructRNA is looked up using the internal RNA, which is not accessible here.
-		 */
-		RNA_string_set(&ptr, "typename", rna_data->save_type);
-		
-		/* save_type is only needed for restoring the type pointer */
+	rna_data->type = RNA_find_struct(rna_data->save_type);
+	if (rna_data->save_type)
 		MEM_freeN((void*)rna_data->save_type);
-		rna_data->save_type = NULL;
-	}
-	else
-		RNA_string_set(&ptr, "typename", "");
 }
 
 static void direct_link_node_socket_properties(FileData *fd, bNode *node)
@@ -2192,11 +2180,19 @@
 		node->lasty= 0;
 		for(sock= node->inputs.first; sock; sock= sock->next) {
 			sock->link= newdataadr(fd, sock->link);
+			sock->contexttype_name= newdataadr(fd, sock->contexttype_name);
+			sock->contexttype = RNA_find_struct(sock->contexttype_name);
+			if (sock->contexttype_name)
+				MEM_freeN(sock->contexttype_name);
 			sock->storage= newdataadr(fd, sock->storage);
 			sock->panel= newdataadr(fd, sock->panel);
 		}
 		for(sock= node->outputs.first; sock; sock= sock->next) {
 			sock->ns.data= NULL;
+			sock->contexttype_name= newdataadr(fd, sock->contexttype_name);
+			sock->contexttype = RNA_find_struct(sock->contexttype_name);
+			if (sock->contexttype_name)
+				MEM_freeN(sock->contexttype_name);
 			sock->storage= newdataadr(fd, sock->storage);
 			sock->panel= newdataadr(fd, sock->panel);
 		}

Modified: branches/particles-2010/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/particles-2010/source/blender/blenloader/intern/writefile.c	2010-10-11 10:47:20 UTC (rev 32414)
+++ branches/particles-2010/source/blender/blenloader/intern/writefile.c	2010-10-11 11:00:28 UTC (rev 32415)
@@ -494,11 +494,21 @@
 	for(node= ntree->nodes.first; node; node= node->next) {
 		for(sock= node->inputs.first; sock; sock= sock->next) {
 			writestruct(wd, DATA, "bNodeSocket", 1, sock);
+			if (sock->contexttype) {
+				/* save identifier string, to allow restoring the StructRNA pointer */
+				sock->contexttype_name= RNA_struct_identifier(sock->contexttype);
+				writedata(wd, DATA, strlen(sock->contexttype_name)+1, (void*)sock->contexttype_name);
+			}
 			if (sock->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 (sock->contexttype) {
+				/* save identifier string, to allow restoring the StructRNA pointer */
+				sock->contexttype_name= RNA_struct_identifier(sock->contexttype);
+				writedata(wd, DATA, strlen(sock->contexttype_name)+1, (void*)sock->contexttype_name);
+			}
 			if (sock->storage)
 				writestruct(wd, DATA, node->typeinfo->socketstoragename, 1, sock->storage);
 		}

Modified: branches/particles-2010/source/blender/makesdna/DNA_node_types.h
===================================================================
--- branches/particles-2010/source/blender/makesdna/DNA_node_types.h	2010-10-11 10:47:20 UTC (rev 32414)
+++ branches/particles-2010/source/blender/makesdna/DNA_node_types.h	2010-10-11 11:00:28 UTC (rev 32415)
@@ -83,7 +83,6 @@
 	
 	short type, flag;			/* data type, flags */
 	short limit, stack_index;	/* limit for dependency sort, stack_index for exec */
-	struct StructRNA *contexttype;	/* data context type (simulation nodes) */
 	struct bNodeSocketPanel *panel;	/* socket panel */
 	
 	short intern;				/* intern = tag for group nodes */
@@ -102,6 +101,8 @@
 	/* internal data to retrieve relations and groups */
 	int own_index, to_index;	/* group socket identifiers, to find matching pairs after reading files */
 	
+	struct StructRNA *contexttype;	/* data context type (simulation nodes) */
+	char *contexttype_name;			/* temporary name string, only used during save/load! */
 	int island;					/* used during island calculation, for finding shared socket groups */
 	int pad2;
 	

Modified: branches/particles-2010/source/blender/makesrna/RNA_access.h
===================================================================
--- branches/particles-2010/source/blender/makesrna/RNA_access.h	2010-10-11 10:47:20 UTC (rev 32414)
+++ branches/particles-2010/source/blender/makesrna/RNA_access.h	2010-10-11 11:00:28 UTC (rev 32415)
@@ -590,6 +590,8 @@
 
 /* Structs */
 
+StructRNA *RNA_find_struct(const char *identifier);
+
 const char *RNA_struct_identifier(StructRNA *type);
 const char *RNA_struct_ui_name(StructRNA *type);
 const char *RNA_struct_ui_description(StructRNA *type);

Modified: branches/particles-2010/source/blender/makesrna/intern/rna_access.c
===================================================================
--- branches/particles-2010/source/blender/makesrna/intern/rna_access.c	2010-10-11 10:47:20 UTC (rev 32414)
+++ branches/particles-2010/source/blender/makesrna/intern/rna_access.c	2010-10-11 11:00:28 UTC (rev 32415)
@@ -468,6 +468,17 @@
 
 /* Structs */
 
+StructRNA *RNA_find_struct(const char *identifier)
+{
+	StructRNA *type;
+	if (identifier) {
+		for (type = BLENDER_RNA.structs.first; type; type = type->cont.next)
+			if (strcmp(type->identifier, identifier)==0)
+				return type;
+	}
+	return NULL;
+}
+
 const char *RNA_struct_identifier(StructRNA *type)
 {
 	return type->identifier;

Modified: branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c
===================================================================
--- branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c	2010-10-11 10:47:20 UTC (rev 32414)
+++ branches/particles-2010/source/blender/makesrna/intern/rna_nodetree.c	2010-10-11 11:00:28 UTC (rev 32415)
@@ -461,14 +461,7 @@
 
 static void rna_Node_getdata_typename_set(PointerRNA *ptr, const char *value)
 {
-	BlenderRNA *brna= &BLENDER_RNA;
-	StructRNA *type;
-	
-	for (type = brna->structs.first; type; type = type->cont.next)
-		if (strcmp(type->identifier, value)==0)
-			break;
-	/* type==NULL if no struct type was found */
-	simnode_getdata_set_type((bNodeTree*)ptr->id.data, (bNode*)ptr->data, type);
+	simnode_getdata_set_type((bNodeTree*)ptr->id.data, (bNode*)ptr->data, RNA_find_struct(value));
 }
 
 static void rna_Node_setdata_typename_get(PointerRNA *ptr, char *value)

Modified: branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_math.c
===================================================================
--- branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_math.c	2010-10-11 10:47:20 UTC (rev 32414)
+++ branches/particles-2010/source/blender/nodes/intern/simulation/nodes/SIM_math.c	2010-10-11 11:00:28 UTC (rev 32415)
@@ -191,7 +191,6 @@
 
 static void enqueue_subtract(SimExecData *execdata, SimNodeStack *node, SimDataContext *self)
 {
-	SimDataContext ctx;
 	SimKernel *kernel;
 	char kernelname[64];
 	SimKernelFunction kernelfunc;
@@ -258,7 +257,6 @@
 
 static void enqueue_multiply(SimExecData *execdata, SimNodeStack *node, SimDataContext *self)
 {
-	SimDataContext ctx;
 	SimKernel *kernel;
 	char kernelname[64];
 	SimKernelFunction kernelfunc;
@@ -335,7 +333,6 @@
 
 static void enqueue_divide(SimExecData *execdata, SimNodeStack *node, SimDataContext *self)
 {
-	SimDataContext ctx;
 	SimKernel *kernel;
 	char kernelname[64];
 	SimKernelFunction kernelfunc;
@@ -481,7 +478,6 @@
 
 static void enqueue_sine(SimExecData *execdata, SimNodeStack *node, SimDataContext *self)
 {
-	SimDataContext ctx;
 	SimKernel *kernel;
 	char kernelname[64];
 	
@@ -491,6 +487,50 @@
 	sim_kernel_enqueue(execdata, kernel, node->outstack[0].context.size, &node->inputevents, &node->events);
 }
 
+static char *generate_source_cosine(struct SimNodeStack *node)
+{
+	DynStr *source= sim_kernel_source_begin(node, NULL, 0, NULL);
+	BLI_dynstr_append(source, "*OUTPUT0_FLOAT(get_global_id(0)) = cos(INPUT0_FLOAT(get_global_id(0)));\n");
+	return sim_kernel_source_end(source);
+}
+static void kernel_cosine(int global_id, void **args, SimNodeStack *node)
+{
+	*SIM_OUTPUT_FLOAT(0, global_id) = cos(SIM_INPUT_FLOAT(0, global_id));
+}
+
+static void enqueue_cosine(SimExecData *execdata, SimNodeStack *node, SimDataContext *self)
+{
+	SimKernel *kernel;
+	char kernelname[64];
+	
+	sim_kernel_source_name(node, NULL, kernelname);
+	kernel=MEM_callocN(sizeof(SimKernel), "SimKernel");
+	sim_kernel_init(execdata, kernel, node, kernel_cosine, kernelname, 0);
+	sim_kernel_enqueue(execdata, kernel, node->outstack[0].context.size, &node->inputevents, &node->events);
+}
+
+static char *generate_source_tangent(struct SimNodeStack *node)
+{
+	DynStr *source= sim_kernel_source_begin(node, NULL, 0, NULL);
+	BLI_dynstr_append(source, "*OUTPUT0_FLOAT(get_global_id(0)) = tan(INPUT0_FLOAT(get_global_id(0)));\n");
+	return sim_kernel_source_end(source);
+}
+static void kernel_tangent(int global_id, void **args, SimNodeStack *node)
+{
+	*SIM_OUTPUT_FLOAT(0, global_id) = tan(SIM_INPUT_FLOAT(0, global_id));
+}
+
+static void enqueue_tangent(SimExecData *execdata, SimNodeStack *node, SimDataContext *self)
+{
+	SimKernel *kernel;
+	char kernelname[64];
+	
+	sim_kernel_source_name(node, NULL, kernelname);
+	kernel=MEM_callocN(sizeof(SimKernel), "SimKernel");
+	sim_kernel_init(execdata, kernel, node, kernel_tangent, kernelname, 0);
+	sim_kernel_enqueue(execdata, kernel, node->outstack[0].context.size, &node->inputevents, &node->events);
+}
+
 bNodeType sim_node_sine = {
 	/* *next,*prev */	NULL, NULL,
 	/* type code   */	SIM_NODE_SINE, 
@@ -513,7 +553,7 @@
 	/* initsocketfunc  */		NULL,
 	/* copysocketstoragefunc */	NULL,
 	/* freesocketstoragefunc */	NULL,
-	/* prepare_outputs */	NULL,
+	/* prepare_outputs */		NULL,
 	/* generate_source */		generate_source_sine,
 	/* enqueue */				enqueue_sine
 };

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list