[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21531] branches/soc-2009-kazanbas/source/ blender: RNA functions can now return dynamic arrays (float, int/boolean).
Arystanbek Dyussenov
arystan.d at gmail.com
Sat Jul 11 18:11:26 CEST 2009
Revision: 21531
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21531
Author: kazanbas
Date: 2009-07-11 18:11:26 +0200 (Sat, 11 Jul 2009)
Log Message:
-----------
RNA functions can now return dynamic arrays (float, int/boolean). RNA handles freeing memory.
Example code: http://pastebin.mozilla.org/662154.
Modified Paths:
--------------
branches/soc-2009-kazanbas/source/blender/makesrna/RNA_types.h
branches/soc-2009-kazanbas/source/blender/makesrna/intern/makesrna.c
branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_access.c
branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_action_api.c
branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_define.c
branches/soc-2009-kazanbas/source/blender/python/SConscript
branches/soc-2009-kazanbas/source/blender/python/intern/bpy_rna.c
Modified: branches/soc-2009-kazanbas/source/blender/makesrna/RNA_types.h
===================================================================
--- branches/soc-2009-kazanbas/source/blender/makesrna/RNA_types.h 2009-07-11 15:50:43 UTC (rev 21530)
+++ branches/soc-2009-kazanbas/source/blender/makesrna/RNA_types.h 2009-07-11 16:11:26 UTC (rev 21531)
@@ -106,6 +106,9 @@
/* pointers */
PROP_ID_REFCOUNT = 64,
+ /* arrays */
+ PROP_DYNAMIC_ARRAY = 32768,
+
/* internal flags */
PROP_BUILTIN = 128,
PROP_EXPORT = 256,
Modified: branches/soc-2009-kazanbas/source/blender/makesrna/intern/makesrna.c
===================================================================
--- branches/soc-2009-kazanbas/source/blender/makesrna/intern/makesrna.c 2009-07-11 15:50:43 UTC (rev 21530)
+++ branches/soc-2009-kazanbas/source/blender/makesrna/intern/makesrna.c 2009-07-11 16:11:26 UTC (rev 21531)
@@ -1200,6 +1200,7 @@
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 @@
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 @@
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 @@
/* 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 @@
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)
Modified: branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_access.c
===================================================================
--- branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_access.c 2009-07-11 15:50:43 UTC (rev 21530)
+++ branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_access.c 2009-07-11 16:11:26 UTC (rev 21531)
@@ -2799,8 +2799,13 @@
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);
}
Modified: branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_action_api.c
===================================================================
--- branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_action_api.c 2009-07-11 15:50:43 UTC (rev 21530)
+++ branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_action_api.c 2009-07-11 16:11:26 UTC (rev 21531)
@@ -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 @@
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
Modified: branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_define.c
===================================================================
--- branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_define.c 2009-07-11 15:50:43 UTC (rev 21530)
+++ branches/soc-2009-kazanbas/source/blender/makesrna/intern/rna_define.c 2009-07-11 16:11:26 UTC (rev 21531)
@@ -2220,6 +2220,8 @@
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:
Modified: branches/soc-2009-kazanbas/source/blender/python/SConscript
===================================================================
--- branches/soc-2009-kazanbas/source/blender/python/SConscript 2009-07-11 15:50:43 UTC (rev 21530)
+++ branches/soc-2009-kazanbas/source/blender/python/SConscript 2009-07-11 16:11:26 UTC (rev 21531)
@@ -3,7 +3,7 @@
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']
Modified: branches/soc-2009-kazanbas/source/blender/python/intern/bpy_rna.c
===================================================================
--- branches/soc-2009-kazanbas/source/blender/python/intern/bpy_rna.c 2009-07-11 15:50:43 UTC (rev 21530)
+++ branches/soc-2009-kazanbas/source/blender/python/intern/bpy_rna.c 2009-07-11 16:11:26 UTC (rev 21531)
@@ -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 @@
/* 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++)
More information about the Bf-blender-cvs
mailing list