From 12315f4d0e0ae993805f141f64cb8c73c5297311 Mon Sep 17 00:00:00 2001 From: Hans Lambermont Date: Sat, 12 Oct 2002 11:37:38 +0000 Subject: Initial revision --- .../gameengine/Ketsji/KX_PyConstraintBinding.cpp | 193 +++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 source/gameengine/Ketsji/KX_PyConstraintBinding.cpp (limited to 'source/gameengine/Ketsji/KX_PyConstraintBinding.cpp') diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp new file mode 100644 index 00000000000..67a40639a13 --- /dev/null +++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp @@ -0,0 +1,193 @@ +/** + * $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 ***** + */ +#include "KX_PyConstraintBinding.h" +#include "PHY_IPhysicsEnvironment.h" +#include "KX_ConstraintWrapper.h" +#include "KX_PhysicsObjectWrapper.h" +#include "PHY_IPhysicsController.h" + + +// nasty glob variable to connect scripting language +// if there is a better way (without global), please do so! +static PHY_IPhysicsEnvironment* g_physics_env = NULL; + +static char PhysicsConstraints_module_documentation[] = +"This is the Python API for the Physics Constraints"; + + +static char gPySetGravity__doc__[] = "setGravity(float x,float y,float z)"; +static char gPyCreateConstraint__doc__[] = "createConstraint(ob1,ob2,float restLength,float restitution,float damping)"; +static char gPyRemoveConstraint__doc__[] = "removeConstraint(constraint id)"; + +static PyObject* gPySetGravity(PyObject* self, + PyObject* args, + PyObject* kwds) +{ + float x,y,z; + int len = PyTuple_Size(args); + if ((len == 3) && PyArg_ParseTuple(args,"fff",&x,&y,&z)) + { + if (g_physics_env) + g_physics_env->setGravity(x,y,z); + } + Py_INCREF(Py_None); return Py_None; +} + + + + +static PyObject* gPyCreateConstraint(PyObject* self, + PyObject* args, + PyObject* kwds) +{ + int physicsid=0,physicsid2 = 0,constrainttype=0,extrainfo=0; + int len = PyTuple_Size(args); + int success = 1; + float pivotX=1,pivotY=1,pivotZ=1,axisX=0,axisY=0,axisZ=1; + if (len == 3) + { + success = PyArg_ParseTuple(args,"iii",&physicsid,&physicsid2,&constrainttype); + } + else + if (len ==6) + { + success = PyArg_ParseTuple(args,"iiifff",&physicsid,&physicsid2,&constrainttype, + &pivotX,&pivotY,&pivotZ); + } + else if (len == 9) + { + success = PyArg_ParseTuple(args,"iiiffffff",&physicsid,&physicsid2,&constrainttype, + &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ); + } + else if (len==4) + { + success = PyArg_ParseTuple(args,"iiii",&physicsid,&physicsid2,&constrainttype,&extrainfo); + pivotX=extrainfo; + } + + if (success) + { + if (g_physics_env) + { + + PHY_IPhysicsController* physctrl = (PHY_IPhysicsController*) physicsid; + PHY_IPhysicsController* physctrl2 = (PHY_IPhysicsController*) physicsid2; + if (physctrl) //TODO:check for existance of this pointer! + { + int constraintid = g_physics_env->createConstraint(physctrl,physctrl2,(enum PHY_ConstraintType)constrainttype,pivotX,pivotY,pivotZ,axisX,axisY,axisZ); + + KX_ConstraintWrapper* wrap = new KX_ConstraintWrapper((enum PHY_ConstraintType)constrainttype,constraintid,g_physics_env); + + + return wrap; + } + + + } + } + + Py_INCREF(Py_None); return Py_None; +} + + +static PyObject* gPyRemoveConstraint(PyObject* self, + PyObject* args, + PyObject* kwds) +{ + int constraintid; + + int len = PyTuple_Size(args); + if (PyArg_ParseTuple(args,"i",&constraintid)) + { + if (g_physics_env) + { + g_physics_env->removeConstraint(constraintid); + } + } + Py_INCREF(Py_None); return Py_None; +} + + + + + +static struct PyMethodDef physicsconstraints_methods[] = { + {"setGravity",(PyCFunction) gPySetGravity, + METH_VARARGS, gPySetGravity__doc__}, + + {"createConstraint",(PyCFunction) gPyCreateConstraint, + METH_VARARGS, gPyCreateConstraint__doc__}, + {"removeConstraint",(PyCFunction) gPyRemoveConstraint, + METH_VARARGS, gPyRemoveConstraint__doc__}, + + //sentinel + { NULL, (PyCFunction) NULL, 0, NULL } +}; + + + +PyObject* initPythonConstraintBinding() +{ + + PyObject* ErrorObject; + PyObject* m; + PyObject* d; + + m = Py_InitModule4("PhysicsConstraints", physicsconstraints_methods, + PhysicsConstraints_module_documentation, + (PyObject*)NULL,PYTHON_API_VERSION); + + // Add some symbolic constants to the module + d = PyModule_GetDict(m); + ErrorObject = PyString_FromString("PhysicsConstraints.error"); + PyDict_SetItemString(d, "error", ErrorObject); + + // XXXX Add constants here + + // Check for errors + if (PyErr_Occurred()) + { + Py_FatalError("can't initialize module PhysicsConstraints"); + } + + return d; +} + + +void KX_RemovePythonConstraintBinding() +{ +} + +void PHY_SetActiveEnvironment(class PHY_IPhysicsEnvironment* env) +{ + g_physics_env = env; +} -- cgit v1.2.3