diff options
-rw-r--r-- | source/blender/makesrna/RNA_types.h | 3 | ||||
-rw-r--r-- | source/blender/makesrna/intern/makesrna.c | 24 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_access.c | 7 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_action_api.c | 15 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_define.c | 2 | ||||
-rw-r--r-- | source/blender/python/SConscript | 2 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_rna.c | 6 |
7 files changed, 54 insertions, 5 deletions
diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h index dc2a2a1a1de..ed6f12681cc 100644 --- a/source/blender/makesrna/RNA_types.h +++ b/source/blender/makesrna/RNA_types.h @@ -106,6 +106,9 @@ typedef enum PropertyFlag { /* pointers */ PROP_ID_REFCOUNT = 64, + /* arrays */ + PROP_DYNAMIC_ARRAY = 32768, + /* internal flags */ PROP_BUILTIN = 128, PROP_EXPORT = 256, 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: diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript index 73dc171fc3e..0ef6689de7e 100644 --- a/source/blender/python/SConscript +++ b/source/blender/python/SConscript @@ -3,7 +3,7 @@ Import ('env') sources = env.Glob('intern/*.c') -incs = '. ../editors/include ../makesdna ../makesrna ../blenlib ../blenkernel ../nodes' +incs = '. ../editors/include ../makesdna ../makesrna ../makesrna/intern ../blenlib ../blenkernel ../nodes' incs += ' ../imbuf ../blenloader ../render/extern/include ../windowmanager' incs += ' #intern/guardedalloc #intern/memutil #extern/glew/include' incs += ' ' + env['BF_PYTHON_INC'] diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index 9619d6fbbbb..fe68436c07f 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -44,6 +44,8 @@ #include "DNA_scene_types.h" #include "ED_keyframing.h" +#include "rna_internal_types.h" /* PropertyRNA */ + #define USE_MATHUTILS #ifdef USE_MATHUTILS @@ -1792,6 +1794,10 @@ PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *data) /* resolve the array from a new pytype */ ret = PyTuple_New(len); + /* for return values, data is a pointer to an array, not first element pointer */ + if (prop->flag & PROP_DYNAMIC_ARRAY) + data = *((char**)data); + switch (type) { case PROP_BOOLEAN: for(a=0; a<len; a++) |