Revision: 25531
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25531
Author:   ben2610
Date:     2009-12-23 00:38:09 +0100 (Wed, 23 Dec 2009)

Log Message:
-----------
BGE: fix more matrix transpose bugs in assignement to game object matrices.

Assignment to KX_GameObject localOrientation and
worldOrientation matrices was assuming row-major matrix
although reading these matrices was returning a column-major
MathUtils object.

The faulty function (PyMatTo) is fixed and all matrices
in python are now assumed column-major.

This function is also used in the following methods:

BL_Shader.setUniformMatrix4()
BL_Shader.setUniformMatrix3()

(No change in scripts if you didn't specify the optional
transpose parameter: the default value is changed so
that column-major matrices are assumed as before.)

KX_Camera.projection_matrix

(assignement to this attribute now requires a column-major
matrix and you must fix your script if you were setting
a value to this attribute.)

Modified Paths:
--------------
    trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
    trunk/blender/source/gameengine/Ketsji/BL_Shader.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PyMath.h

Modified: trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp     
2009-12-22 22:03:57 UTC (rev 25530)
+++ trunk/blender/source/gameengine/Converter/BL_ActionActuator.cpp     
2009-12-22 23:38:09 UTC (rev 25531)
@@ -525,7 +525,7 @@
                if(!PyMatTo(pymat, mat))
                        return NULL;
                
-               mat.setValue((const float *)matrix);
+               mat.getValue((float*)matrix);
                
                BL_ArmatureObject *obj = (BL_ArmatureObject*)GetParent();
                

Modified: trunk/blender/source/gameengine/Ketsji/BL_Shader.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/BL_Shader.cpp        2009-12-22 
22:03:57 UTC (rev 25530)
+++ trunk/blender/source/gameengine/Ketsji/BL_Shader.cpp        2009-12-22 
23:38:09 UTC (rev 25531)
@@ -1276,7 +1276,7 @@
 
        const char *uniform="";
        PyObject *matrix=0;
-       int transp=1; // MT_ is row major so transpose by default....
+       int transp=0; // python use column major by default, so no transpose....
        
        if(!PyArg_ParseTuple(args, "sO|i:setUniformMatrix4",&uniform, 
&matrix,&transp))
                return NULL;
@@ -1322,7 +1322,7 @@
 
        const char *uniform="";
        PyObject *matrix=0;
-       int transp=1; // MT_ is row major so transpose by default....
+       int transp=0; // python use column major by default, so no transpose....
        if(!PyArg_ParseTuple(args, "sO|i:setUniformMatrix3",&uniform, 
&matrix,&transp))
                return NULL;
        

Modified: trunk/blender/source/gameengine/Ketsji/KX_PyMath.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PyMath.h  2009-12-22 22:03:57 UTC 
(rev 25530)
+++ trunk/blender/source/gameengine/Ketsji/KX_PyMath.h  2009-12-22 23:38:09 UTC 
(rev 25531)
@@ -56,7 +56,7 @@
 inline unsigned int Size(const MT_Tuple4&)                { return 4; }
 
 /**
- *  Converts the given python matrix to an MT class.
+ *  Converts the given python matrix (column-major) to an MT class (row-major).
  */
 template<class T>
 bool PyMatTo(PyObject* pymat, T& mat)
@@ -65,30 +65,30 @@
        mat.setIdentity();
        if (PySequence_Check(pymat))
        {
-               unsigned int rows = PySequence_Size(pymat);
-               if (rows != Size(mat))
+               unsigned int cols = PySequence_Size(pymat);
+               if (cols != Size(mat))
                        return false;
                        
-               for (unsigned int y = 0; noerror && y < Size(mat); y++)
+               for (unsigned int x = 0; noerror && x < cols; x++)
                {
-                       PyObject *pyrow = PySequence_GetItem(pymat, y); /* new 
ref */
-                       if (!PyErr_Occurred() && PySequence_Check(pyrow))
+                       PyObject *pycol = PySequence_GetItem(pymat, x); /* new 
ref */
+                       if (!PyErr_Occurred() && PySequence_Check(pycol))
                        {
-                               unsigned int cols = PySequence_Size(pyrow);
-                               if (cols != Size(mat))
+                               unsigned int rows = PySequence_Size(pycol);
+                               if (rows != Size(mat))
                                        noerror = false;
                                else
                                {
-                                       for( unsigned int x = 0; x < Size(mat); 
x++)
+                                       for( unsigned int y = 0; y < rows; y++)
                                        {
-                                               PyObject *item = 
PySequence_GetItem(pyrow, x); /* new ref */
+                                               PyObject *item = 
PySequence_GetItem(pycol, y); /* new ref */
                                                mat[y][x] = 
PyFloat_AsDouble(item);
                                                Py_DECREF(item);
                                        }
                                }
                        } else 
                                noerror = false;
-                       Py_DECREF(pyrow);
+                       Py_DECREF(pycol);
                }
        } else 
                noerror = false;


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to