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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to