Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArystanbek Dyussenov <arystan.d@gmail.com>2009-07-11 20:11:26 +0400
committerArystanbek Dyussenov <arystan.d@gmail.com>2009-07-11 20:11:26 +0400
commit870a9d61042d8badb02673678dd1ed32a6ee994d (patch)
tree1417a09c3ccf0091c972772bcde8f87140a95102 /source/blender/makesrna/intern
parentf221d9128ddf593f7977251ed4214cfe682d7c40 (diff)
RNA functions can now return dynamic arrays (float, int/boolean). RNA handles freeing memory.
Example code: http://pastebin.mozilla.org/662154.
Diffstat (limited to 'source/blender/makesrna/intern')
-rw-r--r--source/blender/makesrna/intern/makesrna.c24
-rw-r--r--source/blender/makesrna/intern/rna_access.c7
-rw-r--r--source/blender/makesrna/intern/rna_action_api.c15
-rw-r--r--source/blender/makesrna/intern/rna_define.c2
4 files changed, 44 insertions, 4 deletions
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 7a8dfe78ca1..5462c005bcf 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -1200,6 +1200,7 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
fprintf(f, "\tchar *_data");
if(func->ret) fprintf(f, ", *_retdata");
fprintf(f, ";\n");
+ if(func->ret && (func->ret->flag & PROP_DYNAMIC_ARRAY)) fprintf(f, "\tint _ret_array_length;\n");
fprintf(f, "\t\n");
/* assign self */
@@ -1254,6 +1255,12 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
fprintf(f, "reports");
}
+ if(func->ret && (func->ret->flag & PROP_DYNAMIC_ARRAY)) {
+ if(!first) fprintf(f, ", ");
+ first= 0;
+ fprintf(f, "&_ret_array_length");
+ }
+
dparm= dfunc->cont.properties.first;
for(; dparm; dparm= dparm->next) {
if(dparm->prop==func->ret)
@@ -1271,6 +1278,10 @@ static void rna_def_function_funcs(FILE *f, StructDefRNA *dsrna, FunctionDefRNA
dparm= rna_find_parameter_def(func->ret);
ptrstr= dparm->prop->type == PROP_POINTER || dparm->prop->arraylength > 0 ? "*" : "";
fprintf(f, "\t*((%s%s%s*)_retdata)= %s;\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, func->ret->identifier);
+
+ if(func->ret && (func->ret->flag & PROP_DYNAMIC_ARRAY)) {
+ fprintf(f, "\t_parms->func->ret->arraylength= _ret_array_length;\n");
+ }
}
}
@@ -1476,9 +1487,9 @@ static void rna_generate_static_parameter_prototypes(BlenderRNA *brna, StructRNA
/* return type */
for(dparm= dfunc->cont.properties.first; dparm; dparm= dparm->next) {
if(dparm->prop==func->ret) {
- if(dparm->prop->arraylength)
- fprintf(f, "XXX no array return types yet"); /* XXX not supported */
- else if(dparm->prop->type == PROP_POINTER)
+ if(dparm->prop->arraylength && !(dparm->prop->flag & PROP_DYNAMIC_ARRAY))
+ fprintf(f, "\"XXX array return types only allowed with PROP_DYNAMIC_ARRAY flag.\""); /* XXX not supported */
+ else if(dparm->prop->type == PROP_POINTER || (dparm->prop->flag & PROP_DYNAMIC_ARRAY))
fprintf(f, "%s%s *", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
else
fprintf(f, "%s%s ", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop));
@@ -1515,6 +1526,13 @@ static void rna_generate_static_parameter_prototypes(BlenderRNA *brna, StructRNA
fprintf(f, "ReportList *reports");
}
+ /* dynamic array length paramter */
+ if(func->ret && (func->ret->flag & PROP_DYNAMIC_ARRAY)) {
+ if(!first) fprintf(f, ", ");
+ first= 0;
+ fprintf(f, "int *array_length");
+ }
+
/* defined parameters */
for(dparm= dfunc->cont.properties.first; dparm; dparm= dparm->next) {
if(dparm->prop==func->ret)
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index f20df81d6ad..b312b0b8e51 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -2799,8 +2799,13 @@ void RNA_parameter_list_free(ParameterList *parms)
parm= parms->func->cont.properties.first;
for(tot= 0; parm; parm= parm->next) {
- if(parm->type == PROP_COLLECTION)
+ if(parm->type == PROP_COLLECTION) {
BLI_freelistN((ListBase*)((char*)parms->data+tot));
+ }
+ else if(parm->flag & PROP_DYNAMIC_ARRAY) {
+ /* for dynamic arrays, data is a pointer to an array */
+ MEM_freeN(*(char**)parms->data+tot);
+ }
tot+= rna_parameter_size(parm);
}
diff --git a/source/blender/makesrna/intern/rna_action_api.c b/source/blender/makesrna/intern/rna_action_api.c
index a758a2c56d0..b989d2d66a9 100644
--- a/source/blender/makesrna/intern/rna_action_api.c
+++ b/source/blender/makesrna/intern/rna_action_api.c
@@ -36,6 +36,16 @@
#ifdef RNA_RUNTIME
+int *rna_Action_get_frames(bAction *act, int *ret_length)
+{
+ *ret_length= 3;
+ int *ret= MEM_callocN(*ret_length * sizeof(int), "action frames");
+ ret[0] = 1;
+ ret[1] = 2;
+ ret[2] = 3;
+ return ret;
+}
+
#else
void RNA_api_action(StructRNA *srna)
@@ -43,6 +53,11 @@ void RNA_api_action(StructRNA *srna)
FunctionRNA *func;
PropertyRNA *parm;
+ func= RNA_def_function(srna, "get_frames", "rna_Action_get_frames");
+ RNA_def_function_ui_description(func, "Get action frames."); /* XXX describe better */
+ parm= RNA_def_int_array(func, "frames", 1, NULL, 0, 0, "", "", 0, 0);
+ RNA_def_property_flag(parm, PROP_DYNAMIC_ARRAY);
+ RNA_def_function_return(func, parm);
}
#endif
diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c
index 07515d3ad56..d0a2de515ed 100644
--- a/source/blender/makesrna/intern/rna_define.c
+++ b/source/blender/makesrna/intern/rna_define.c
@@ -2220,6 +2220,8 @@ int rna_parameter_size(PropertyRNA *parm)
PropertyType ptype= parm->type;
int len= parm->arraylength;
+ if (parm->flag & PROP_DYNAMIC_ARRAY) return sizeof(void*);
+
if(len > 0) {
switch (ptype) {
case PROP_BOOLEAN: