[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25701] trunk/blender/source/blender/ python/intern/bpy_rna.c: support for rna functions returning mathutils types - so object.rat_cast() returns Mathutils vectors rather then tuples

Campbell Barton ideasman42 at gmail.com
Mon Jan 4 14:29:55 CET 2010


Revision: 25701
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25701
Author:   campbellbarton
Date:     2010-01-04 14:29:55 +0100 (Mon, 04 Jan 2010)

Log Message:
-----------
support for rna functions returning mathutils types - so object.rat_cast() returns Mathutils vectors rather then tuples

Modified Paths:
--------------
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c	2010-01-04 08:24:24 UTC (rev 25700)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c	2010-01-04 13:29:55 UTC (rev 25701)
@@ -140,6 +140,8 @@
 	(BaseMathSetIndexFunc)	NULL
 };
 
+#define PROP_ALL_VECTOR_SUBTYPES PROP_TRANSLATION: case PROP_DIRECTION: case PROP_VELOCITY: case PROP_ACCELERATION: case PROP_XYZ: case PROP_XYZ|PROP_UNIT_LENGTH
+
 PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
 {
 	PyObject *ret= NULL;
@@ -148,28 +150,24 @@
 	int subtype, totdim;
 	int len;
 	int is_thick;
+	int flag= RNA_property_flag(prop);
 
 	/* disallow dynamic sized arrays to be wrapped since the size could change
 	 * to a size mathutils does not support */
-	if ((RNA_property_type(prop) != PROP_FLOAT) || (RNA_property_flag(prop) & PROP_DYNAMIC))
+	if ((RNA_property_type(prop) != PROP_FLOAT) || (flag & PROP_DYNAMIC))
 		return NULL;
 
 	len= RNA_property_array_length(ptr, prop);
 	subtype= RNA_property_subtype(prop);
 	totdim= RNA_property_array_dimension(ptr, prop, NULL);
-	is_thick = (RNA_property_flag(prop) & PROP_THICK_WRAP);
+	is_thick = (flag & PROP_THICK_WRAP);
 
 	if (totdim == 1 || (totdim == 2 && subtype == PROP_MATRIX)) {
 		if(!is_thick)
 			ret = pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */
 
 		switch(RNA_property_subtype(prop)) {
-		case PROP_TRANSLATION:
-		case PROP_DIRECTION:
-		case PROP_VELOCITY:
-		case PROP_ACCELERATION:
-		case PROP_XYZ:
-		case PROP_XYZ|PROP_UNIT_LENGTH:
+		case PROP_ALL_VECTOR_SUBTYPES:
 			if(len>=2 && len <= 4) {
 				if(is_thick) {
 					ret= newVectorObject(NULL, len, Py_NEW, NULL);
@@ -2573,22 +2571,41 @@
 		int len = RNA_property_array_length(ptr, prop);
 
 		/* resolve the array from a new pytype */
-		ret = PyTuple_New(len);
 
 		/* kazanbas: TODO make multidim sequences here */
 
 		switch (type) {
 		case PROP_BOOLEAN:
+			ret = PyTuple_New(len);
 			for(a=0; a<len; a++)
 				PyTuple_SET_ITEM(ret, a, PyBool_FromLong( ((int*)data)[a] ));
 			break;
 		case PROP_INT:
+			ret = PyTuple_New(len);
 			for(a=0; a<len; a++)
 				PyTuple_SET_ITEM(ret, a, PyLong_FromSsize_t( (Py_ssize_t)((int*)data)[a] ));
 			break;
 		case PROP_FLOAT:
-			for(a=0; a<len; a++)
-				PyTuple_SET_ITEM(ret, a, PyFloat_FromDouble( ((float*)data)[a] ));
+			switch(RNA_property_subtype(prop)) {
+				case PROP_ALL_VECTOR_SUBTYPES:
+					ret= newVectorObject(data, len, Py_NEW, NULL);
+					break;
+				case PROP_MATRIX:
+					if(len==16) {
+						ret= newMatrixObject(data, 4, 4, Py_NEW, NULL);
+						break;
+					}
+					else if (len==9) {
+						ret= newMatrixObject(data, 3, 3, Py_NEW, NULL);
+						break;
+					}
+					/* pass through */
+				default:
+					ret = PyTuple_New(len);
+					for(a=0; a<len; a++)
+						PyTuple_SET_ITEM(ret, a, PyFloat_FromDouble( ((float*)data)[a] ));
+
+			}
 			break;
 		default:
 			PyErr_Format(PyExc_TypeError, "RNA Error: unknown array type \"%d\" (pyrna_param_to_py)", type);





More information about the Bf-blender-cvs mailing list