diff options
author | Kester Maddock <Christopher.Maddock.1@uni.massey.ac.nz> | 2004-05-16 16:53:54 +0400 |
---|---|---|
committer | Kester Maddock <Christopher.Maddock.1@uni.massey.ac.nz> | 2004-05-16 16:53:54 +0400 |
commit | 3e6b05f60719f3e04e511c9d52a8f27d7ce3a1a4 (patch) | |
tree | 9c8adc370ddedfbccc6774439d95aa138087deb0 /source | |
parent | 0a27ae972e791590e19b3330ebbb487f35f50b84 (diff) |
Python utils for Python <-> MT_Vector, MT_Point & MT_Matrix
Diffstat (limited to 'source')
-rw-r--r-- | source/gameengine/Ketsji/KX_PyMath.cpp | 238 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_PyMath.h | 79 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_PythonInit.cpp | 80 |
3 files changed, 321 insertions, 76 deletions
diff --git a/source/gameengine/Ketsji/KX_PyMath.cpp b/source/gameengine/Ketsji/KX_PyMath.cpp new file mode 100644 index 00000000000..3fd1b7be69b --- /dev/null +++ b/source/gameengine/Ketsji/KX_PyMath.cpp @@ -0,0 +1,238 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + * Initialize Python thingies. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#ifdef WIN32 +#pragma warning (disable : 4786) +#endif //WIN32 + +#include "MT_Vector3.h" +#include "MT_Vector4.h" +#include "MT_Matrix4x4.h" + +#include "ListValue.h" + +#include "KX_Python.h" + +MT_Vector3 MT_Vector3FromPyList(PyObject* pylist) +{ + MT_Vector3 vec(0., 0., 0.); + bool error=false; + if (pylist->ob_type == &CListValue::Type) + { + CListValue* listval = (CListValue*) pylist; + unsigned int numitems = listval->GetCount(); + if (numitems <= 3) + { + for (unsigned int index=0;index<numitems;index++) + { + vec[index] = listval->GetValue(index)->GetNumber(); + } + } else + { + error = true; + } + + } else + { + // assert the list is long enough... + unsigned int numitems = PyList_Size(pylist); + if (numitems <= 3) + { + for (unsigned int index=0;index<numitems;index++) + { + vec[index] = PyFloat_AsDouble(PyList_GetItem(pylist,index)); + } + } + else + { + error = true; + } + + } + if (error) + PyErr_SetString(PyExc_TypeError, "Expected list of three items for vector argument."); + + return vec; +} + +MT_Point3 MT_Point3FromPyList(PyObject* pylist) +{ + MT_Point3 point(0., 0., 0.); + bool error=false; + if (pylist->ob_type == &CListValue::Type) + { + CListValue* listval = (CListValue*) pylist; + unsigned int numitems = listval->GetCount(); + if (numitems <= 3) + { + for (unsigned int index=0;index<numitems;index++) + { + point[index] = listval->GetValue(index)->GetNumber(); + } + } else + { + error = true; + } + + } else + { + // assert the list is long enough... + unsigned int numitems = PyList_Size(pylist); + if (numitems <= 3) + { + for (unsigned int index=0;index<numitems;index++) + { + point[index] = PyFloat_AsDouble(PyList_GetItem(pylist,index)); + } + } + else + { + error = true; + } + + } + if (error) + PyErr_SetString(PyExc_TypeError, "Expected list of three items for point argument."); + + return point; +} + +MT_Vector4 MT_Vector4FromPyList(PyObject* pylist) +{ + MT_Vector4 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 = PyList_Size(pylist); + if (numitems <= 4) + { + for (unsigned index=0;index<numitems;index++) + { + vec[index] = PyFloat_AsDouble(PyList_GetItem(pylist,index)); + } + } + else + { + error = true; + } + } + if (error) + PyErr_SetString(PyExc_TypeError, "Expected list of four items for Vector argument."); + return vec; +} + +MT_Matrix4x4 MT_Matrix4x4FromPyObject(PyObject *pymat) +{ + MT_Matrix4x4 mat; + bool error = false; + mat.setIdentity(); + if (PySequence_Check(pymat)) + { + unsigned int rows = PySequence_Size(pymat); + for (unsigned int y = 0; y < rows && y < 4; y++) + { + PyObject *pyrow = PySequence_GetItem(pymat, y); + if (PySequence_Check(pyrow)) + { + unsigned int cols = PySequence_Size(pyrow); + for( unsigned int x = 0; x < cols && x < 4; x++) + { + mat[y][x] = PyFloat_AsDouble(PySequence_GetItem(pyrow, x)); + } + } + } + } + + return mat; +} + +MT_Matrix3x3 MT_Matrix3x3FromPyObject(PyObject *pymat) +{ + MT_Matrix3x3 mat; + bool error = false; + mat.setIdentity(); + if (PySequence_Check(pymat)) + { + unsigned int rows = PySequence_Size(pymat); + for (unsigned int y = 0; y < rows && y < 3; y++) + { + PyObject *pyrow = PySequence_GetItem(pymat, y); + if (PySequence_Check(pyrow)) + { + unsigned int cols = PySequence_Size(pyrow); + for( unsigned int x = 0; x < cols && x < 3; x++) + { + mat[y][x] = PyFloat_AsDouble(PySequence_GetItem(pyrow, x)); + } + } + } + } + + return mat; +} + +PyObject* PyObjectFromMT_Matrix4x4(const MT_Matrix4x4 &mat) +{ + PyObject *pymat = PyList_New(0); + for (unsigned int y = 0; y < 4; y++) + { + PyObject *row = PyList_New(0); + for( unsigned int x = 0; x < 4; x++ ) + { + PyList_Append(row, PyFloat_FromDouble(mat[y][x])); + } + PyList_Append(pymat, row); + } + return pymat; +} + diff --git a/source/gameengine/Ketsji/KX_PyMath.h b/source/gameengine/Ketsji/KX_PyMath.h new file mode 100644 index 00000000000..2496fd09635 --- /dev/null +++ b/source/gameengine/Ketsji/KX_PyMath.h @@ -0,0 +1,79 @@ +/** + * $Id$ + * + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + * Initialize Python thingies. + */ + +#ifndef __KX_PYMATH_H__ +#define __KX_PYMATH_H__ + +#include "MT_Vector3.h" +#include "MT_Point3.h" +#include "MT_Vector4.h" +#include "MT_Matrix4x4.h" +#include "MT_Matrix3x3.h" + +#include "KX_Python.h" + +/** + * Converts a python list to an MT_Vector3 + */ +MT_Vector3 MT_Vector3FromPyList(PyObject* pylist); + +/** + * Converts a python list to an MT_Point3 + */ +MT_Point3 MT_Point3FromPyList(PyObject* pylist); + +/** + * Converts a python list to an MT_Vector4 + */ +MT_Vector4 MT_Vector4FromPyList(PyObject* pylist); +/** + * Converts a python list of lists to an MT_Matrix4x4. + * Any object that supports the sequence protocol will work. + * Only the first four rows and first four columns in each row will be converted. + * @example The python object [[1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0]] + */ +MT_Matrix4x4 MT_Matrix4x4FromPyObject(PyObject *pymat); +/** + * Converts a python list of lists to an MT_Matrix3x3 + * Any object that supports the sequence protocol will work. + * Only the first three rows and first three columns in each row will be converted. + * @example The python object [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]] + */ +MT_Matrix3x3 MT_Matrix3x3FromPyObject(PyObject *pymat); + +/** + * Converts an MT_Matrix4x4 to a python object. + */ +PyObject* PyObjectFromMT_Matrix4x4(const MT_Matrix4x4 &mat); + +#endif diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp index 36fdb696382..ee6a9f4a6cd 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.cpp +++ b/source/gameengine/Ketsji/KX_PythonInit.cpp @@ -54,6 +54,8 @@ #include "KX_Scene.h" #include "SND_DeviceManager.h" +#include "KX_PyMath.h" + // FIXME: Enable for access to blender python modules. This is disabled because // python has dependencies on a lot of other modules and is a pain to link. //#define USE_BLENDER_PYTHON @@ -93,80 +95,6 @@ static PyObject* gPyGetRandomFloat(PyObject* self, -void GlobalConvertPythonPylist(PyObject* pylist, MT_Vector3 &pos) -{ - bool error=false; - if (pylist->ob_type == &CListValue::Type) - { - CListValue* listval = (CListValue*) pylist; - unsigned int numitems = listval->GetCount(); - if (numitems <= 3) - { - for (unsigned int index=0;index<numitems;index++) - { - pos[index] = listval->GetValue(index)->GetNumber(); - } - } else - { - error = true; - } - - } else - { - - // assert the list is long enough... - unsigned int numitems = PyList_Size(pylist); - if (numitems <= 3) - { - for (unsigned int index=0;index<numitems;index++) - { - pos[index] = PyFloat_AsDouble(PyList_GetItem(pylist,index)); - } - } - else - { - error = true; - } - - } -} - -void GlobalConvertPythonPylist(PyObject* pylist, MT_Vector4 &vec) -{ - 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 = PyList_Size(pylist); - if (numitems <= 4) - { - for (unsigned index=0;index<numitems;index++) - { - vec[index] = PyFloat_AsDouble(PyList_GetItem(pylist,index)); - } - } - else - { - error = true; - } - - } -} void GlobalConvertPythonVectorArg(PyObject* args, MT_Vector3 &pos) @@ -174,7 +102,7 @@ void GlobalConvertPythonVectorArg(PyObject* args, MT_Vector3 &pos) PyObject* pylist; PyArg_ParseTuple(args,"O",&pylist); - GlobalConvertPythonPylist(pylist, pos); + pos = MT_Vector3FromPyList(pylist); } void GlobalConvertPythonVectorArg(PyObject* args, MT_Vector4 &vec) @@ -182,7 +110,7 @@ void GlobalConvertPythonVectorArg(PyObject* args, MT_Vector4 &vec) PyObject* pylist; PyArg_ParseTuple(args,"O",&pylist); - GlobalConvertPythonPylist(pylist, vec); + vec = MT_Vector4FromPyList(pylist); } |