diff options
author | Kester Maddock <Christopher.Maddock.1@uni.massey.ac.nz> | 2004-05-26 16:09:17 +0400 |
---|---|---|
committer | Kester Maddock <Christopher.Maddock.1@uni.massey.ac.nz> | 2004-05-26 16:09:17 +0400 |
commit | 8253d3e0411276ca09995fcbd826abd2c0c8b930 (patch) | |
tree | 2d6ad13d242ee41e0ed3f1adcaf9bd12ae63b404 /source/gameengine/Ketsji | |
parent | 3dd18c5c34390316ac95b972aaa989455cf8ead6 (diff) |
Python fixes:
Reenabled the setScript/getScript methods for python controller bricks.
Set the ray source point to MouseFocusSensor.getRaySource works.
Added: Python -> MT_Quaternion
MT_Matrix4x4, MT_Matrix3x3, MT_Vector3, MT_Point3 -> Python
Correct transform of frustum bound sphere centre point to world coordinates
Diffstat (limited to 'source/gameengine/Ketsji')
-rw-r--r-- | source/gameengine/Ketsji/KX_Camera.cpp | 14 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_MouseFocusSensor.cpp | 1 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_PyMath.cpp | 139 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_PyMath.h | 27 |
4 files changed, 170 insertions, 11 deletions
diff --git a/source/gameengine/Ketsji/KX_Camera.cpp b/source/gameengine/Ketsji/KX_Camera.cpp index 715d7918647..ffab2c946a9 100644 --- a/source/gameengine/Ketsji/KX_Camera.cpp +++ b/source/gameengine/Ketsji/KX_Camera.cpp @@ -257,11 +257,11 @@ void KX_Camera::ExtractFrustumSphere() // Compute centre m_frustum_centre = MT_Point3(0., 0., - (nearpoint.dot(nearpoint) - farpoint.dot(farpoint))/(2.0*(m_camdata.m_clipend - m_camdata.m_clipstart))); + -(nearpoint.dot(nearpoint) - farpoint.dot(farpoint))/(2.0*(m_camdata.m_clipend - m_camdata.m_clipstart))); m_frustum_radius = m_frustum_centre.distance(farpoint); // Transform to world space. - m_frustum_centre = GetCameraToWorld()(m_frustum_centre); + m_frustum_centre = GetWorldToCamera()(m_frustum_centre); m_set_frustum_centre = true; } @@ -474,12 +474,14 @@ int KX_Camera::_setattr(const STR_String &attr, PyObject *pyvalue) } } - if (attr == "projection_matrix") + if (PyObject_IsMT_Matrix(pyvalue, 4)) { - PysetProjectionMatrix((PyObject*) this, pyvalue, NULL); - return 0; + if (attr == "projection_matrix") + { + SetProjectionMatrix(MT_Matrix4x4FromPyObject(pyvalue)); + return 0; + } } - return KX_GameObject::_setattr(attr, pyvalue); } diff --git a/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp b/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp index fc89bf5e042..84b08058ecc 100644 --- a/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp +++ b/source/gameengine/Ketsji/KX_MouseFocusSensor.cpp @@ -229,6 +229,7 @@ bool KX_MouseFocusSensor::ParentObjectHasFocus(void) topoint[1]/topoint[3], topoint[2]/topoint[3]); m_prevTargetPoint = topoint3; + m_prevSourcePoint = frompoint3; /* 2. Get the object from SuMO*/ /* Shoot! Beware that the first argument here is an diff --git a/source/gameengine/Ketsji/KX_PyMath.cpp b/source/gameengine/Ketsji/KX_PyMath.cpp index 287ae500ea5..11bc5d750ff 100644 --- a/source/gameengine/Ketsji/KX_PyMath.cpp +++ b/source/gameengine/Ketsji/KX_PyMath.cpp @@ -177,6 +177,49 @@ MT_Vector4 MT_Vector4FromPyList(PyObject* pylist) return vec; } +MT_Quaternion MT_QuaternionFromPyList(PyObject* pylist) +{ + MT_Quaternion vec(0., 0., 0., 1.); + bool error=false; + if (pylist->ob_type == &CListValue::Type) + { + CListValue* listval = (CListValue*) pylist; + unsigned int numitems = listval->GetCount(); + if (numitems <= 4) + { + for (unsigned index=0;index<numitems;index++) + { + vec[index] = listval->GetValue(index)->GetNumber(); + } + } else + { + error = true; + } + + } else + { + // assert the list is long enough... + unsigned int numitems = PySequence_Size(pylist); + if (numitems <= 4) + { + for (unsigned index=0;index<numitems;index++) + { + PyObject *item = PySequence_GetItem(pylist,index); /* new ref */ + vec[index] = PyFloat_AsDouble(item); + Py_DECREF(item); + } + } + else + { + error = true; + } + } + if (error) + PyErr_SetString(PyExc_TypeError, "Expected list of four items for Quaternion argument."); + return vec; +} + + MT_Matrix4x4 MT_Matrix4x4FromPyObject(PyObject *pymat) { MT_Matrix4x4 mat; @@ -205,12 +248,79 @@ MT_Matrix4x4 MT_Matrix4x4FromPyObject(PyObject *pymat) return mat; } +bool PyObject_IsMT_Matrix(PyObject *pymat, unsigned int rank) +{ + if (!pymat) + return false; + + unsigned int x, y; + if (pymat->ob_type == &CListValue::Type) + { + CListValue* listval = (CListValue*) pymat; + if (listval->GetCount() == rank) + { + for (y = 0; y < rank; y++) + { + CListValue* vecval = (CListValue*)listval->GetValue(y); + if (vecval->GetCount() != rank) + return false; + } + return true; + } + return false; + } else if (PySequence_Check(pymat)) + { + unsigned int rows = PySequence_Size(pymat); + if (rows != rank) + return false; + + for (y = 0; y < rank; y++) + { + PyObject *pyrow = PySequence_GetItem(pymat, y); /* new ref */ + if (PySequence_Check(pyrow)) + { + if (PySequence_Size(pyrow) != rank) + { + Py_DECREF(pyrow); + return false; + } + } + Py_DECREF(pyrow); + } + return true; + } + return false; +} + MT_Matrix3x3 MT_Matrix3x3FromPyObject(PyObject *pymat) { MT_Matrix3x3 mat; bool error = false; mat.setIdentity(); - if (PySequence_Check(pymat)) + if (pymat->ob_type == &CListValue::Type) + { + unsigned int row, col; + CListValue* listval = (CListValue*) pymat; + if (listval->GetCount() == 3) + { + for (row=0;row<3;row++) // each row has a 3-vector [x,y,z] + { + CListValue* vecval = (CListValue*)listval->GetValue(row); + for (col=0;col<3 && col < vecval->GetCount();col++) + { + mat[row][col] = vecval->GetValue(col)->GetNumber(); + + } + } + } + else + { + error = true; + if (error) + PyErr_SetString(PyExc_TypeError, "Expected list of three items for 3x3 matrix argument."); + + } + } else if (PySequence_Check(pymat)) { unsigned int rows = PySequence_Size(pymat); for (unsigned int y = 0; y < rows && y < 3; y++) @@ -236,9 +346,28 @@ MT_Matrix3x3 MT_Matrix3x3FromPyObject(PyObject *pymat) PyObject* PyObjectFromMT_Matrix4x4(const MT_Matrix4x4 &mat) { return Py_BuildValue("[[ffff][ffff][ffff][ffff]]", - PyFloat_FromDouble(mat[0][0]), PyFloat_FromDouble(mat[0][1]), PyFloat_FromDouble(mat[0][2]), PyFloat_FromDouble(mat[0][3]), - PyFloat_FromDouble(mat[1][0]), PyFloat_FromDouble(mat[1][1]), PyFloat_FromDouble(mat[1][2]), PyFloat_FromDouble(mat[1][3]), - PyFloat_FromDouble(mat[2][0]), PyFloat_FromDouble(mat[2][1]), PyFloat_FromDouble(mat[2][2]), PyFloat_FromDouble(mat[2][3]), - PyFloat_FromDouble(mat[3][0]), PyFloat_FromDouble(mat[3][1]), PyFloat_FromDouble(mat[3][2]), PyFloat_FromDouble(mat[3][3])); + mat[0][0], mat[0][1], mat[0][2], mat[0][3], + mat[1][0], mat[1][1], mat[1][2], mat[1][3], + mat[2][0], mat[2][1], mat[2][2], mat[2][3], + mat[3][0], mat[3][1], mat[3][2], mat[3][3]); +} + +PyObject* PyObjectFromMT_Matrix3x3(const MT_Matrix3x3 &mat) +{ + return Py_BuildValue("[[fff][fff][fff]]", + mat[0][0], mat[0][1], mat[0][2], + mat[1][0], mat[1][1], mat[1][2], + mat[2][0], mat[2][1], mat[2][2]); } +PyObject* PyObjectFromMT_Vector3(const MT_Vector3 &vec) +{ + return Py_BuildValue("[fff]", + vec[0], vec[1], vec[2]); +} + +PyObject* PyObjectFromMT_Point3(const MT_Point3 &pos) +{ + return Py_BuildValue("[fff]", + pos[0], pos[1], pos[2]); +} diff --git a/source/gameengine/Ketsji/KX_PyMath.h b/source/gameengine/Ketsji/KX_PyMath.h index 2496fd09635..7fdf207e435 100644 --- a/source/gameengine/Ketsji/KX_PyMath.h +++ b/source/gameengine/Ketsji/KX_PyMath.h @@ -56,6 +56,12 @@ MT_Point3 MT_Point3FromPyList(PyObject* pylist); * Converts a python list to an MT_Vector4 */ MT_Vector4 MT_Vector4FromPyList(PyObject* pylist); + +/** + * Converts a python list to an MT_Quaternion + */ +MT_Quaternion MT_QuaternionFromPyList(PyObject* pylist); + /** * Converts a python list of lists to an MT_Matrix4x4. * Any object that supports the sequence protocol will work. @@ -76,4 +82,25 @@ MT_Matrix3x3 MT_Matrix3x3FromPyObject(PyObject *pymat); */ PyObject* PyObjectFromMT_Matrix4x4(const MT_Matrix4x4 &mat); +/** + * Converts an MT_Matrix3x3 to a python object. + */ +PyObject* PyObjectFromMT_Matrix3x3(const MT_Matrix3x3 &mat); + +/** + * Converts an MT_Vector3 to a python object. + */ +PyObject* PyObjectFromMT_Vector3(const MT_Vector3 &vec); + +/** + * Converts an MT_Vector3 to a python object. + */ +PyObject* PyObjectFromMT_Point3(const MT_Point3 &pos); + +/** + * True if the given PyObject can be converted to an MT_Matrix + * @param rank = 3 (for MT_Matrix3x3) or 4 (for MT_Matrix4x4) + */ +bool PyObject_IsMT_Matrix(PyObject *pymat, unsigned int rank); + #endif |