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++)


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to