[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