[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25600] trunk/blender/source/blender: flag to make rna props 'thick wrapped', so returning a property wont try maintain a reference to the original rna property with callbacks .

Campbell Barton ideasman42 at gmail.com
Mon Dec 28 23:59:09 CET 2009


Revision: 25600
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25600
Author:   campbellbarton
Date:     2009-12-28 23:59:09 +0100 (Mon, 28 Dec 2009)

Log Message:
-----------
flag to make rna props 'thick wrapped', so returning a property wont try maintain a reference to the original rna property with callbacks.
also needed for functions that return vectors/matrix's

Modified Paths:
--------------
    trunk/blender/source/blender/makesrna/RNA_types.h
    trunk/blender/source/blender/makesrna/intern/rna_armature.c
    trunk/blender/source/blender/python/generic/matrix.c
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/source/blender/makesrna/RNA_types.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_types.h	2009-12-28 22:49:22 UTC (rev 25599)
+++ trunk/blender/source/blender/makesrna/RNA_types.h	2009-12-28 22:59:09 UTC (rev 25600)
@@ -175,6 +175,10 @@
 	/* need context for update function */
 	PROP_CONTEXT_UPDATE = 1<<22,
 
+	/* Use for arrays or for any data that should not have a referene kept
+	 * most common case is functions that return arrays where the array */
+	PROP_THICK_WRAP = 1<<23,
+
 	/* internal flags */
 	PROP_BUILTIN = 1<<7,
 	PROP_EXPORT = 1<<8,

Modified: trunk/blender/source/blender/makesrna/intern/rna_armature.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_armature.c	2009-12-28 22:49:22 UTC (rev 25599)
+++ trunk/blender/source/blender/makesrna/intern/rna_armature.c	2009-12-28 22:59:09 UTC (rev 25600)
@@ -647,6 +647,7 @@
 	//RNA_def_property_float_sdna(prop, NULL, ""); // doesnt access any real data
 	RNA_def_property_array(prop, 16);
 	RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+	RNA_def_property_flag(prop, PROP_THICK_WRAP); /* no reference to original data */
 	RNA_def_property_ui_text(prop, "Editbone Matrix", "Read-only matrix calculated from the roll (armature space).");
 	RNA_def_property_float_funcs(prop, "rna_EditBone_matrix_get", NULL, NULL); // TODO - this could be made writable also
 

Modified: trunk/blender/source/blender/python/generic/matrix.c
===================================================================
--- trunk/blender/source/blender/python/generic/matrix.c	2009-12-28 22:49:22 UTC (rev 25599)
+++ trunk/blender/source/blender/python/generic/matrix.c	2009-12-28 22:59:09 UTC (rev 25600)
@@ -1136,7 +1136,7 @@
 	{"rowSize", (getter)Matrix_getRowSize, (setter)NULL, "", NULL},
 	{"colSize", (getter)Matrix_getColSize, (setter)NULL, "", NULL},
 	{"wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, "", NULL},
-	{"__owner__",(getter)BaseMathObject_getOwner, (setter)NULL, "",
+	{"_owner",(getter)BaseMathObject_getOwner, (setter)NULL, "",
 	 NULL},
 	{NULL,NULL,NULL,NULL,NULL}  /* Sentinel */
 };

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c	2009-12-28 22:49:22 UTC (rev 25599)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c	2009-12-28 22:59:09 UTC (rev 25600)
@@ -145,6 +145,7 @@
 #ifdef USE_MATHUTILS
 	int subtype, totdim;
 	int len;
+	int is_thick;
 
 	/* disallow dynamic sized arrays to be wrapped since the size could change
 	 * to a size mathutils does not support */
@@ -154,9 +155,11 @@
 	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);
 
 	if (totdim == 1 || (totdim == 2 && subtype == PROP_MATRIX)) {
-		ret = pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */
+		if(!is_thick)
+			ret = pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */
 
 		switch(RNA_property_subtype(prop)) {
 		case PROP_TRANSLATION:
@@ -166,40 +169,74 @@
 		case PROP_XYZ:
 		case PROP_XYZ|PROP_UNIT_LENGTH:
 			if(len>=2 && len <= 4) {
-				PyObject *vec_cb= newVectorObject_cb(ret, len, mathutils_rna_array_cb_index, FALSE);
-				Py_DECREF(ret); /* the vector owns now */
-				ret= vec_cb; /* return the vector instead */
+				if(is_thick) {
+					ret= newVectorObject(NULL, len, Py_NEW, NULL);
+					RNA_property_float_get_array(ptr, prop, ((VectorObject *)ret)->vec);
+				}
+				else {
+					PyObject *vec_cb= newVectorObject_cb(ret, len, mathutils_rna_array_cb_index, FALSE);
+					Py_DECREF(ret); /* the vector owns now */
+					ret= vec_cb; /* return the vector instead */
+				}
 			}
 			break;
 		case PROP_MATRIX:
 			if(len==16) {
-				PyObject *mat_cb= newMatrixObject_cb(ret, 4,4, mathutils_rna_matrix_cb_index, FALSE);
-				Py_DECREF(ret); /* the matrix owns now */
-				ret= mat_cb; /* return the matrix instead */
+				if(is_thick) {
+					ret= newMatrixObject(NULL, 4, 4, Py_NEW, NULL);
+					RNA_property_float_get_array(ptr, prop, ((MatrixObject *)ret)->contigPtr);
+				}
+				else {
+					PyObject *mat_cb= newMatrixObject_cb(ret, 4,4, mathutils_rna_matrix_cb_index, FALSE);
+					Py_DECREF(ret); /* the matrix owns now */
+					ret= mat_cb; /* return the matrix instead */
+				}
 			}
 			else if (len==9) {
-				PyObject *mat_cb= newMatrixObject_cb(ret, 3,3, mathutils_rna_matrix_cb_index, FALSE);
-				Py_DECREF(ret); /* the matrix owns now */
-				ret= mat_cb; /* return the matrix instead */
+				if(is_thick) {
+					ret= newMatrixObject(NULL, 3, 3, Py_NEW, NULL);
+					RNA_property_float_get_array(ptr, prop, ((MatrixObject *)ret)->contigPtr);
+				}
+				else {
+					PyObject *mat_cb= newMatrixObject_cb(ret, 3,3, mathutils_rna_matrix_cb_index, FALSE);
+					Py_DECREF(ret); /* the matrix owns now */
+					ret= mat_cb; /* return the matrix instead */
+				}
 			}
 			break;
 		case PROP_EULER:
 		case PROP_QUATERNION:
 			if(len==3) { /* euler */
-				PyObject *eul_cb= newEulerObject_cb(ret, mathutils_rna_array_cb_index, FALSE);
-				Py_DECREF(ret); /* the matrix owns now */
-				ret= eul_cb; /* return the matrix instead */
+				if(is_thick) {
+					ret= newEulerObject(NULL, Py_NEW, NULL);
+					RNA_property_float_get_array(ptr, prop, ((EulerObject *)ret)->eul);
+				}
+				else {
+					PyObject *eul_cb= newEulerObject_cb(ret, mathutils_rna_array_cb_index, FALSE);
+					Py_DECREF(ret); /* the matrix owns now */
+					ret= eul_cb; /* return the matrix instead */
+				}
 			}
 			else if (len==4) {
-				PyObject *quat_cb= newQuaternionObject_cb(ret, mathutils_rna_array_cb_index, FALSE);
-				Py_DECREF(ret); /* the matrix owns now */
-				ret= quat_cb; /* return the matrix instead */
+				if(is_thick) {
+					ret= newQuaternionObject(NULL, Py_NEW, NULL);
+					RNA_property_float_get_array(ptr, prop, ((QuaternionObject *)ret)->quat);
+				}
+				else {
+					PyObject *quat_cb= newQuaternionObject_cb(ret, mathutils_rna_array_cb_index, FALSE);
+					Py_DECREF(ret); /* the matrix owns now */
+					ret= quat_cb; /* return the matrix instead */
+				}
 			}
 			break;
 		default:
 			break;
 		}
 	}
+
+	if(ret==NULL)
+		ret = pyrna_prop_CreatePyObject(ptr, prop); /* TODO, convert to a python list */
+
 #endif
 
 	return ret;





More information about the Bf-blender-cvs mailing list