[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31673] trunk/blender: rna support for passing dynamic sized arrays to rna functions

Campbell Barton ideasman42 at gmail.com
Tue Aug 31 13:31:22 CEST 2010


Revision: 31673
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31673
Author:   campbellbarton
Date:     2010-08-31 13:31:21 +0200 (Tue, 31 Aug 2010)

Log Message:
-----------
rna support for passing dynamic sized arrays to rna functions
using this for object.vertex_groups.assign([index list ...], group, weight, mode)

Modified Paths:
--------------
    trunk/blender/release/scripts/io/import_scene_obj.py
    trunk/blender/source/blender/editors/animation/anim_draw.c
    trunk/blender/source/blender/editors/animation/anim_ops.c
    trunk/blender/source/blender/editors/armature/armature_ops.c
    trunk/blender/source/blender/editors/gpencil/drawgpencil.c
    trunk/blender/source/blender/editors/gpencil/gpencil_ops.c
    trunk/blender/source/blender/makesrna/RNA_types.h
    trunk/blender/source/blender/makesrna/intern/makesrna.c
    trunk/blender/source/blender/makesrna/intern/rna_access.c
    trunk/blender/source/blender/makesrna/intern/rna_define.c
    trunk/blender/source/blender/makesrna/intern/rna_object.c
    trunk/blender/source/blender/python/intern/bpy_array.c
    trunk/blender/source/blender/python/intern/bpy_rna.c
    trunk/blender/source/blender/python/intern/bpy_rna.h
    trunk/blender/source/blender/windowmanager/intern/wm.c
    trunk/blender/source/blender/windowmanager/intern/wm_cursors.c

Modified: trunk/blender/release/scripts/io/import_scene_obj.py
===================================================================
--- trunk/blender/release/scripts/io/import_scene_obj.py	2010-08-31 11:30:13 UTC (rev 31672)
+++ trunk/blender/release/scripts/io/import_scene_obj.py	2010-08-31 11:31:21 UTC (rev 31673)
@@ -768,8 +768,7 @@
     # the following test will never run
     for group_name, group_indicies in vertex_groups.items():
         group= ob.vertex_groups.new(group_name)
-        for vertex_index in group_indicies:
-            ob.vertex_groups.assign(vertex_index, group, 1.0, 'REPLACE')
+        ob.vertex_groups.assign(group_indicies, group, 1.0, 'REPLACE')
 
 
 def create_nurbs(context_nurbs, vert_loc, new_objects):

Modified: trunk/blender/source/blender/editors/animation/anim_draw.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_draw.c	2010-08-31 11:30:13 UTC (rev 31672)
+++ trunk/blender/source/blender/editors/animation/anim_draw.c	2010-08-31 11:31:21 UTC (rev 31673)
@@ -25,6 +25,7 @@
  *
  * ***** END GPL LICENSE BLOCK *****
  */
+#include "BLO_sys_types.h"
 
 #include "DNA_anim_types.h"
 #include "DNA_object_types.h"

Modified: trunk/blender/source/blender/editors/animation/anim_ops.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_ops.c	2010-08-31 11:30:13 UTC (rev 31672)
+++ trunk/blender/source/blender/editors/animation/anim_ops.c	2010-08-31 11:31:21 UTC (rev 31673)
@@ -29,6 +29,8 @@
 #include <stdlib.h>
 #include <math.h>
 
+#include "BLO_sys_types.h"
+
 #include "DNA_anim_types.h"
 #include "DNA_scene_types.h"
 

Modified: trunk/blender/source/blender/editors/armature/armature_ops.c
===================================================================
--- trunk/blender/source/blender/editors/armature/armature_ops.c	2010-08-31 11:30:13 UTC (rev 31672)
+++ trunk/blender/source/blender/editors/armature/armature_ops.c	2010-08-31 11:31:21 UTC (rev 31673)
@@ -29,8 +29,8 @@
 #include <stdlib.h>
 #include <math.h>
 
+#include "BLO_sys_types.h"
 
-
 #include "BLI_math.h"
 #include "BLI_blenlib.h"
 

Modified: trunk/blender/source/blender/editors/gpencil/drawgpencil.c
===================================================================
--- trunk/blender/source/blender/editors/gpencil/drawgpencil.c	2010-08-31 11:30:13 UTC (rev 31672)
+++ trunk/blender/source/blender/editors/gpencil/drawgpencil.c	2010-08-31 11:31:21 UTC (rev 31673)
@@ -32,6 +32,7 @@
 #include <math.h>
 #include <float.h>
 
+#include "BLO_sys_types.h"
 
 #include "IMB_imbuf_types.h"
 

Modified: trunk/blender/source/blender/editors/gpencil/gpencil_ops.c
===================================================================
--- trunk/blender/source/blender/editors/gpencil/gpencil_ops.c	2010-08-31 11:30:13 UTC (rev 31672)
+++ trunk/blender/source/blender/editors/gpencil/gpencil_ops.c	2010-08-31 11:31:21 UTC (rev 31673)
@@ -29,9 +29,10 @@
 #include <stddef.h>
 #include <stdio.h>
 
+#include "BLO_sys_types.h"
+
 #include "BLI_blenlib.h"
 
-
 #include "WM_api.h"
 #include "WM_types.h"
 

Modified: trunk/blender/source/blender/makesrna/RNA_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_types.h	2010-08-31 11:30:13 UTC (rev 31672)
+++ trunk/blender/source/blender/makesrna/RNA_types.h	2010-08-31 11:31:21 UTC (rev 31673)
@@ -22,6 +22,8 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
+#include "BLO_sys_types.h"
+
 #ifndef RNA_TYPES
 #define RNA_TYPES
 
@@ -265,6 +267,12 @@
 	int valid;
 } ParameterIterator;
 
+/* mainly to avoid confusing casts */
+typedef struct ParameterDynAlloc {
+	intptr_t array_tot; /* important, this breaks when set to an int */
+	void *array;
+} ParameterDynAlloc;
+
 /* Function */
 
 typedef enum FunctionFlag {

Modified: trunk/blender/source/blender/makesrna/intern/makesrna.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/makesrna.c	2010-08-31 11:30:13 UTC (rev 31672)
+++ trunk/blender/source/blender/makesrna/intern/makesrna.c	2010-08-31 11:31:21 UTC (rev 31673)
@@ -49,6 +49,7 @@
 
 static int replace_if_different(char *tmpfile)
 {
+	// return 0; // use for testing had edited rna
 
 #define REN_IF_DIFF \
 	remove(orgfile); \
@@ -1441,11 +1442,11 @@
 		else
 			ptrstr= pout ? "*" : "";
 
-		fprintf(f, "\t%s%s %s%s;\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, dparm->prop->identifier);
-
 		/* for dynamic parameters we pass an additional int for the length of the parameter */
 		if (flag & PROP_DYNAMIC)
 			fprintf(f, "\tint %s%s_len;\n", pout ? "*" : "", dparm->prop->identifier);
+		
+		fprintf(f, "\t%s%s %s%s;\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, dparm->prop->identifier);
 	}
 
 	fprintf(f, "\tchar *_data");
@@ -1474,6 +1475,7 @@
 		if(dparm->prop==func->c_ret)
 			fprintf(f, "\t_retdata= _data;\n");
 		else  {
+			char *data_str;
 			if (cptr || (flag & PROP_DYNAMIC)) {
 				ptrstr= "**";
 				valstr= "*";
@@ -1491,16 +1493,20 @@
 				valstr= "*";
 			}
 
+			/* this must be kept in sync with RNA_parameter_length_get_data, we could just call the function directly, but this is faster */
+			if (flag & PROP_DYNAMIC) {
+				fprintf(f, "\t%s_len= %s((int *)_data);\n", dparm->prop->identifier, pout ? "" : "*");
+				data_str= "(&(((char *)_data)[sizeof(void *)]))";
+			}
+			else {
+				data_str= "_data";
+			}
 			fprintf(f, "\t%s= ", dparm->prop->identifier);
 
 			if (!pout)
 				fprintf(f, "%s", valstr);
 
-			fprintf(f, "((%s%s%s)_data);\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr);
-
-			/* this must be kept in sync with RNA_parameter_length_get_data, we could just call the function directly, but this is faster */
-			if (flag & PROP_DYNAMIC)
-				fprintf(f, "\t%s_len= %s((int *)(_data+%d));\n", dparm->prop->identifier, pout ? "" : "*", rna_parameter_size(dparm->prop));
+			fprintf(f, "((%s%s%s)%s);\n", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, data_str);
 		}
 
 		if(dparm->next)
@@ -1543,10 +1549,10 @@
 			if(!first) fprintf(f, ", ");
 			first= 0;
 
-			fprintf(f, "%s", dparm->prop->identifier);
-
 			if (dparm->prop->flag & PROP_DYNAMIC)
-				fprintf(f, ", %s_len", dparm->prop->identifier);
+				fprintf(f, "%s_len, %s", dparm->prop->identifier, dparm->prop->identifier);
+			else
+				fprintf(f, "%s", dparm->prop->identifier);
 		}
 
 		fprintf(f, ");\n");
@@ -1863,13 +1869,14 @@
 		if(!first) fprintf(f, ", ");
 		first= 0;
 
+		if (flag & PROP_DYNAMIC)
+			fprintf(f, "int %s%s_len, ", pout ? "*" : "", dparm->prop->identifier);
+
 		if(!(flag & PROP_DYNAMIC) && dparm->prop->arraydimension)
 			fprintf(f, "%s%s %s[%d]", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), dparm->prop->identifier, dparm->prop->totarraylength);
 		else
 			fprintf(f, "%s%s %s%s", rna_type_struct(dparm->prop), rna_parameter_type_name(dparm->prop), ptrstr, dparm->prop->identifier);
 
-		if (flag & PROP_DYNAMIC)
-			fprintf(f, ", int %s%s_len", pout ? "*" : "", dparm->prop->identifier);
 	}
 
 	fprintf(f, ");\n");

Modified: trunk/blender/source/blender/makesrna/intern/rna_access.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_access.c	2010-08-31 11:30:13 UTC (rev 31672)
+++ trunk/blender/source/blender/makesrna/intern/rna_access.c	2010-08-31 11:31:21 UTC (rev 31673)
@@ -3839,7 +3839,14 @@
 	for(parm= func->cont.properties.first; parm; parm= parm->next) {
 		size= rna_parameter_size(parm);
 
-		if(!(parm->flag & PROP_REQUIRED)) {
+		/* set length to 0, these need to be set later, see bpy_array.c's py_to_array */
+		if (parm->flag & PROP_DYNAMIC) {
+			ParameterDynAlloc *data_alloc= data;
+			data_alloc->array_tot= 0;
+			data_alloc->array= NULL;
+		}
+		
+		if(!(parm->flag & PROP_REQUIRED) && !(parm->flag & PROP_DYNAMIC)) {
 			switch(parm->type) {
 				case PROP_BOOLEAN:
 					if(parm->arraydimension) memcpy(data, &((BooleanPropertyRNA*)parm)->defaultarray, size);
@@ -3868,10 +3875,6 @@
 			}
 		}
 
-		/* set length to 0 */
-		if (parm->flag & PROP_DYNAMIC)
-			*((int *)(((char *)data) + size))= 0;
-
 		data= ((char*)data) + rna_parameter_size_alloc(parm);
 	}
 
@@ -3889,9 +3892,9 @@
 			BLI_freelistN((ListBase*)((char*)parms->data+tot));
 		else if (parm->flag & PROP_DYNAMIC) {
 			/* for dynamic arrays and strings, data is a pointer to an array */
-			char *array= *(char**)((char*)parms->data+tot);
-			if(array)
-				MEM_freeN(array);
+			ParameterDynAlloc *data_alloc= (void *)(((char *)parms->data) + tot);
+			if(data_alloc->array)
+				MEM_freeN(data_alloc->array);
 		}
 
 		tot+= rna_parameter_size_alloc(parm);
@@ -4053,12 +4056,12 @@
 
 int RNA_parameter_length_get_data(ParameterList *parms, PropertyRNA *parm, void *data)
 {
-	return *((int *)(((char *)data) + rna_parameter_size(parm)));
+	return *((int *)((char *)data));
 }
 
 void RNA_parameter_length_set_data(ParameterList *parms, PropertyRNA *parm, void *data, int length)
 {
-	*((int *)(((char *)data) + rna_parameter_size(parm)))= length;
+	*((int *)data)= length;
 }
 
 int RNA_function_call(bContext *C, ReportList *reports, PointerRNA *ptr, FunctionRNA *func, ParameterList *parms)

Modified: trunk/blender/source/blender/makesrna/intern/rna_define.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_define.c	2010-08-31 11:30:13 UTC (rev 31672)
+++ trunk/blender/source/blender/makesrna/intern/rna_define.c	2010-08-31 11:31:21 UTC (rev 31673)
@@ -2525,7 +2525,7 @@
 	int size = rna_parameter_size(parm);
 
 	if (parm->flag & PROP_DYNAMIC)
-		size+= sizeof(int);
+		size+= sizeof(((ParameterDynAlloc *)NULL)->array_tot);
 
 	return size;
 }

Modified: trunk/blender/source/blender/makesrna/intern/rna_object.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_object.c	2010-08-31 11:30:13 UTC (rev 31672)
+++ trunk/blender/source/blender/makesrna/intern/rna_object.c	2010-08-31 11:31:21 UTC (rev 31673)
@@ -1064,10 +1064,10 @@
 
 }
 
-static void rna_Object_add_vertex_to_group(Object *ob, int vertex_index, bDeformGroup *def, float weight, int assignmode)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list