[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