[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