[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21107] branches/blender2.5/blender: PyRNA API support for matrix types as Mathutils matrix (with callbacks) rather then a generic rna sequence of floats.

Campbell Barton ideasman42 at gmail.com
Tue Jun 23 15:34:45 CEST 2009


Revision: 21107
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21107
Author:   campbellbarton
Date:     2009-06-23 15:34:45 +0200 (Tue, 23 Jun 2009)

Log Message:
-----------
PyRNA API support for matrix types as Mathutils matrix (with callbacks) rather then a generic rna sequence of floats.

Any 3x3 or 4x4 rna matrix will automatically be returned as a Mathutils matrix.
This makes useful stuff like multiplying a vector location by an object matrix possible.
 ob = bpy.data.scenes[0].objects[0]
 print (ob.data.verts[0].co * ob.matrix)

Also added mathutils matrix types to the BGE GameObject.localOrientation, worldOrientation

* MT_Matrix3x3 added getValue3x3 and setValue3x3, assumed a 4x3 float array.
* KX_GameObject.cpp convenience functions NodeSetGlobalOrientation, NodeGetLocalOrientation, NodeGetLocalScaling, NodeGetLocalPosition.
* 2.5 python api now initializes modules BGL, Mathutils and Geometry
* modules py3 PyModuleDef's use PyModuleDef_HEAD_INIT, rather then {}, was making msvc fail to build.
* added macros for Vector_ReadCallback, Vector_WriteCallback etc. to check if the callback pointer is set before calling the function.

Modified Paths:
--------------
    branches/blender2.5/blender/intern/moto/include/MT_Matrix3x3.h
    branches/blender2.5/blender/source/blender/python/generic/BGL.c
    branches/blender2.5/blender/source/blender/python/generic/Geometry.c
    branches/blender2.5/blender/source/blender/python/generic/Mathutils.c
    branches/blender2.5/blender/source/blender/python/generic/Mathutils.h
    branches/blender2.5/blender/source/blender/python/generic/matrix.c
    branches/blender2.5/blender/source/blender/python/generic/matrix.h
    branches/blender2.5/blender/source/blender/python/generic/quat.c
    branches/blender2.5/blender/source/blender/python/generic/vector.c
    branches/blender2.5/blender/source/blender/python/generic/vector.h
    branches/blender2.5/blender/source/blender/python/intern/bpy_interface.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
    branches/blender2.5/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    branches/blender2.5/blender/source/gameengine/Ketsji/KX_GameObject.h

Modified: branches/blender2.5/blender/intern/moto/include/MT_Matrix3x3.h
===================================================================
--- branches/blender2.5/blender/intern/moto/include/MT_Matrix3x3.h	2009-06-23 13:25:31 UTC (rev 21106)
+++ branches/blender2.5/blender/intern/moto/include/MT_Matrix3x3.h	2009-06-23 13:34:45 UTC (rev 21107)
@@ -98,6 +98,18 @@
         m_el[0][2] = *m++; m_el[1][2] = *m++; m_el[2][2] = *m;
     }
 
+    void setValue3x3(const float *m) {
+        m_el[0][0] = *m++; m_el[1][0] = *m++; m_el[2][0] = *m++;
+        m_el[0][1] = *m++; m_el[1][1] = *m++; m_el[2][1] = *m++;
+        m_el[0][2] = *m++; m_el[1][2] = *m++; m_el[2][2] = *m;
+    }
+
+    void setValue3x3(const double *m) {
+        m_el[0][0] = *m++; m_el[1][0] = *m++; m_el[2][0] = *m++;
+        m_el[0][1] = *m++; m_el[1][1] = *m++; m_el[2][1] = *m++;
+        m_el[0][2] = *m++; m_el[1][2] = *m++; m_el[2][2] = *m;
+    }
+
     void setValue(MT_Scalar xx, MT_Scalar xy, MT_Scalar xz, 
                   MT_Scalar yx, MT_Scalar yy, MT_Scalar yz, 
                   MT_Scalar zx, MT_Scalar zy, MT_Scalar zz) {
@@ -194,6 +206,18 @@
         *m++ = m_el[0][2]; *m++ = m_el[1][2]; *m++ = m_el[2][2]; *m   = 0.0;
     }
 
+    void getValue3x3(float *m) const {
+        *m++ = (float) m_el[0][0]; *m++ = (float) m_el[1][0]; *m++ = (float) m_el[2][0];
+        *m++ = (float) m_el[0][1]; *m++ = (float) m_el[1][1]; *m++ = (float) m_el[2][1];
+        *m++ = (float) m_el[0][2]; *m++ = (float) m_el[1][2]; *m++ = (float) m_el[2][2];
+    }
+
+    void getValue3x3(double *m) const {
+        *m++ = m_el[0][0]; *m++ = m_el[1][0]; *m++ = m_el[2][0];
+        *m++ = m_el[0][1]; *m++ = m_el[1][1]; *m++ = m_el[2][1];
+        *m++ = m_el[0][2]; *m++ = m_el[1][2]; *m++ = m_el[2][2];
+    }
+
     MT_Quaternion getRotation() const;
 
     MT_Matrix3x3& operator*=(const MT_Matrix3x3& m); 

Modified: branches/blender2.5/blender/source/blender/python/generic/BGL.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/generic/BGL.c	2009-06-23 13:25:31 UTC (rev 21106)
+++ branches/blender2.5/blender/source/blender/python/generic/BGL.c	2009-06-23 13:34:45 UTC (rev 21107)
@@ -1087,7 +1087,7 @@
 
 #if (PY_VERSION_HEX >= 0x03000000)
 static struct PyModuleDef BGL_module_def = {
-	{}, /* m_base */
+	PyModuleDef_HEAD_INIT,
 	"BGL",  /* m_name */
 	0,  /* m_doc */
 	0,  /* m_size */

Modified: branches/blender2.5/blender/source/blender/python/generic/Geometry.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/generic/Geometry.c	2009-06-23 13:25:31 UTC (rev 21106)
+++ branches/blender2.5/blender/source/blender/python/generic/Geometry.c	2009-06-23 13:34:45 UTC (rev 21107)
@@ -80,7 +80,7 @@
 
 #if (PY_VERSION_HEX >= 0x03000000)
 static struct PyModuleDef M_Geometry_module_def = {
-	{}, /* m_base */
+	PyModuleDef_HEAD_INIT,
 	"Geometry",  /* m_name */
 	M_Geometry_doc,  /* m_doc */
 	0,  /* m_size */

Modified: branches/blender2.5/blender/source/blender/python/generic/Mathutils.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/generic/Mathutils.c	2009-06-23 13:25:31 UTC (rev 21106)
+++ branches/blender2.5/blender/source/blender/python/generic/Mathutils.c	2009-06-23 13:34:45 UTC (rev 21107)
@@ -96,7 +96,7 @@
 
 #if (PY_VERSION_HEX >= 0x03000000)
 static struct PyModuleDef M_Mathutils_module_def = {
-	{}, /* m_base */
+	PyModuleDef_HEAD_INIT,
 	"Mathutils",  /* m_name */
 	M_Mathutils_doc,  /* m_doc */
 	0,  /* m_size */
@@ -137,6 +137,8 @@
 	PyModule_AddObject( submodule, "Euler",			(PyObject *)&euler_Type );
 	PyModule_AddObject( submodule, "Quaternion",	(PyObject *)&quaternion_Type );
 	
+	mathutils_matrix_vector_cb_index= Mathutils_RegisterCallback(&mathutils_matrix_vector_cb);
+
 	return (submodule);
 }
 
@@ -1164,62 +1166,76 @@
 	return i;
 }
 
-int Vector_ReadCallback(VectorObject *self) {
-	if(self->user) {
-		Mathutils_Callback *cb= mathutils_callbacks[self->callback_type];
-		if(cb->get(self->user, self->subtype, self->vec)) {
-			return 1;
-		}
-		else {
-			PyErr_SetString(PyExc_SystemError, "Vector user has become invalid");
-			return 0;
-		}
+/* use macros to check for NULL */
+int _Vector_ReadCallback(VectorObject *self)
+{
+	Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
+	if(cb->get(self->cb_user, self->cb_subtype, self->vec)) {
+		return 1;
 	}
-	
-	return 1; /* no user continue silently */
+	else {
+		PyErr_SetString(PyExc_SystemError, "Vector user has become invalid");
+		return 0;
+	}
 }
 
-int Vector_WriteCallback(VectorObject *self) {
-	if(self->user) {
-		Mathutils_Callback *cb= mathutils_callbacks[self->callback_type];
-		if(cb->set(self->user, self->subtype, self->vec)) {
-			return 1;
-		}
-		else {
-			PyErr_SetString(PyExc_SystemError, "Vector user has become invalid");
-			return 0;
-		}
+int _Vector_WriteCallback(VectorObject *self)
+{
+	Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
+	if(cb->set(self->cb_user, self->cb_subtype, self->vec)) {
+		return 1;
 	}
-	
-	return 1; /* no user continue silently */
+	else {
+		PyErr_SetString(PyExc_SystemError, "Vector user has become invalid");
+		return 0;
+	}
 }
 
-int Vector_ReadIndexCallback(VectorObject *self, int index) {
-	if(self->user) {
-		Mathutils_Callback *cb= mathutils_callbacks[self->callback_type];
-		if(cb->get_index(self->user, self->subtype, self->vec, index)) {
-			return 1;
-		}
-		else {
-			PyErr_SetString(PyExc_SystemError, "Vector user has become invalid");
-			return 0;
-		}
+int _Vector_ReadIndexCallback(VectorObject *self, int index)
+{
+	Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
+	if(cb->get_index(self->cb_user, self->cb_subtype, self->vec, index)) {
+		return 1;
 	}
-	
-	return 1; /* no user continue silently */
+	else {
+		PyErr_SetString(PyExc_SystemError, "Vector user has become invalid");
+		return 0;
+	}
 }
 
-int Vector_WriteIndexCallback(VectorObject *self, int index) {
-	if(self->user) {
-		Mathutils_Callback *cb= mathutils_callbacks[self->callback_type];
-		if(cb->set_index(self->user, self->subtype, self->vec, index)) {
-			return 1;
-		}
-		else {
-			PyErr_SetString(PyExc_SystemError, "Vector user has become invalid");
-			return 0;
-		}
+int _Vector_WriteIndexCallback(VectorObject *self, int index)
+{
+	Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
+	if(cb->set_index(self->cb_user, self->cb_subtype, self->vec, index)) {
+		return 1;
 	}
-	
-	return 1; /* no user continue silently */
+	else {
+		PyErr_SetString(PyExc_SystemError, "Vector user has become invalid");
+		return 0;
+	}
 }
+
+/* matrix callbacks */
+int _Matrix_ReadCallback(MatrixObject *self)
+{
+	Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
+	if(cb->get(self->cb_user, self->cb_subtype, self->contigPtr)) {
+		return 1;
+	}
+	else {
+		PyErr_SetString(PyExc_SystemError, "Matrix user has become invalid");
+		return 0;
+	}
+}
+
+int _Matrix_WriteCallback(MatrixObject *self)
+{
+	Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
+	if(cb->set(self->cb_user, self->cb_subtype, self->contigPtr)) {
+		return 1;
+	}
+	else {
+		PyErr_SetString(PyExc_SystemError, "Matrix user has become invalid");
+		return 0;
+	}
+}

Modified: branches/blender2.5/blender/source/blender/python/generic/Mathutils.h
===================================================================
--- branches/blender2.5/blender/source/blender/python/generic/Mathutils.h	2009-06-23 13:25:31 UTC (rev 21106)
+++ branches/blender2.5/blender/source/blender/python/generic/Mathutils.h	2009-06-23 13:34:45 UTC (rev 21107)
@@ -67,17 +67,30 @@
 typedef struct Mathutils_Callback Mathutils_Callback;
 struct Mathutils_Callback {
 	int		(*check)(PyObject *user);					/* checks the user is still valid */
-	int		(*get)(PyObject *user, int subtype, float *vec_from);	/* gets the vector from the user */
-	int		(*set)(PyObject *user, int subtype, float *vec_to);	/* sets the users vector values once the vector is modified */
-	int		(*get_index)(PyObject *user, int subtype, float *vec_from,	int index);	/* same as above but only for an index */
-	int		(*set_index)(PyObject *user, int subtype, float *vec_to,	int index);	/* same as above but only for an index */
+	int		(*get)(PyObject *user, int subtype, float *from);	/* gets the vector from the user */
+	int		(*set)(PyObject *user, int subtype, float *to);	/* sets the users vector values once the vector is modified */
+	int		(*get_index)(PyObject *user, int subtype, float *from,int index);	/* same as above but only for an index */
+	int		(*set_index)(PyObject *user, int subtype, float *to,	int index);	/* same as above but only for an index */
 };
 
 int Mathutils_RegisterCallback(Mathutils_Callback *cb);
 
-int Vector_ReadCallback(VectorObject *self);
-int Vector_WriteCallback(VectorObject *self);
-int Vector_ReadIndexCallback(VectorObject *self, int index);
-int Vector_WriteIndexCallback(VectorObject *self, int index);
+int _Vector_ReadCallback(VectorObject *self);
+int _Vector_WriteCallback(VectorObject *self);
+int _Vector_ReadIndexCallback(VectorObject *self, int index);
+int _Vector_WriteIndexCallback(VectorObject *self, int index);
 
+/* since this is called so often avoid where possible */
+#define Vector_ReadCallback(_self) (((_self)->cb_user ?	_Vector_ReadCallback(_self):1))
+#define Vector_WriteCallback(_self) (((_self)->cb_user ?_Vector_WriteCallback(_self):1))
+#define Vector_ReadIndexCallback(_self, _index) (((_self)->cb_user ?	_Vector_ReadIndexCallback(_self, _index):1))
+#define Vector_WriteIndexCallback(_self, _index) (((_self)->cb_user ?	_Vector_WriteIndexCallback(_self, _index):1))
+
+
+int _Matrix_ReadCallback(MatrixObject *self);
+int _Matrix_WriteCallback(MatrixObject *self);
+
+#define Matrix_ReadCallback(_self) (((_self)->cb_user  ?_Matrix_ReadCallback(_self):1))
+#define Matrix_WriteCallback(_self) (((_self)->cb_user ?_Matrix_WriteCallback(_self):1))
+
 #endif				/* EXPP_Mathutils_H */

Modified: branches/blender2.5/blender/source/blender/python/generic/matrix.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/generic/matrix.c	2009-06-23 13:25:31 UTC (rev 21106)
+++ branches/blender2.5/blender/source/blender/python/generic/matrix.c	2009-06-23 13:34:45 UTC (rev 21107)
@@ -33,6 +33,69 @@
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list