[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20187] trunk/blender/source/gameengine: BGE API cleanup: motion actuator.

Benoit Bolsee benoit.bolsee at online.be
Wed May 13 18:48:33 CEST 2009


Revision: 20187
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20187
Author:   ben2610
Date:     2009-05-13 18:48:33 +0200 (Wed, 13 May 2009)

Log Message:
-----------
BGE API cleanup: motion actuator. Apply patch from Moguri.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Ketsji/KX_ObjectActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ObjectActuator.h
    trunk/blender/source/gameengine/PyDoc/GameTypes.py

Modified: trunk/blender/source/gameengine/Ketsji/KX_ObjectActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_ObjectActuator.cpp	2009-05-13 15:41:33 UTC (rev 20186)
+++ trunk/blender/source/gameengine/Ketsji/KX_ObjectActuator.cpp	2009-05-13 16:48:33 UTC (rev 20187)
@@ -31,6 +31,7 @@
 
 #include "KX_ObjectActuator.h"
 #include "KX_GameObject.h"
+#include "KX_PyMath.h" // For PyVecTo - should this include be put in PyObjectPlus?
 #include "KX_IPhysicsController.h"
 
 #ifdef HAVE_CONFIG_H
@@ -76,7 +77,10 @@
 	{
 		// in servo motion, the force is local if the target velocity is local
 		m_bitLocalFlag.Force = m_bitLocalFlag.LinearVelocity;
+
+		m_pid = m_torque;
 	}
+
 	UpdateFuzzyFlags();
 }
 
@@ -132,7 +136,7 @@
 			MT_Vector3 dv = e - m_previous_error;
 			MT_Vector3 I = m_error_accumulator + e;
 
-			m_force = m_torque.x()*e+m_torque.y()*I+m_torque.z()*dv;
+			m_force = m_pid.x()*e+m_pid.y()*I+m_pid.z()*dv;
 			// to automatically adapt the PID coefficient to mass;
 			m_force *= mass;
 			if (m_bitLocalFlag.Torque) 
@@ -306,6 +310,7 @@
 };
 
 PyMethodDef KX_ObjectActuator::Methods[] = {
+	// Deprecated ----->
 	{"getForce", (PyCFunction) KX_ObjectActuator::sPyGetForce, METH_NOARGS},
 	{"setForce", (PyCFunction) KX_ObjectActuator::sPySetForce, METH_VARARGS},
 	{"getTorque", (PyCFunction) KX_ObjectActuator::sPyGetTorque, METH_NOARGS},
@@ -329,40 +334,163 @@
 	{"setPID", (PyCFunction) KX_ObjectActuator::sPyGetPID, METH_NOARGS},
 	{"getPID", (PyCFunction) KX_ObjectActuator::sPySetPID, METH_VARARGS},
 
+	// <----- Deprecated
 
-
 	{NULL,NULL} //Sentinel
 };
 
 PyAttributeDef KX_ObjectActuator::Attributes[] = {
-	//KX_PYATTRIBUTE_TODO("force"),
-	//KX_PYATTRIBUTE_TODO("torque"),
-	//KX_PYATTRIBUTE_TODO("dLoc"),
-	//KX_PYATTRIBUTE_TODO("dRot"),
-	//KX_PYATTRIBUTE_TODO("linV"),
-	//KX_PYATTRIBUTE_TODO("angV"),
-	//KX_PYATTRIBUTE_TODO("damping"),
-	//KX_PYATTRIBUTE_TODO("forceLimitX"),
-	//KX_PYATTRIBUTE_TODO("forceLimitY"),
-	//KX_PYATTRIBUTE_TODO("forceLimitZ"),
-	//KX_PYATTRIBUTE_TODO("pid"),
+	KX_PYATTRIBUTE_VECTOR_RW_CHECK("force", -1000, 1000, false, KX_ObjectActuator, m_force, PyUpdateFuzzyFlags),
+	KX_PYATTRIBUTE_BOOL_RW("useLocalForce", KX_ObjectActuator, m_bitLocalFlag.Force),
+	KX_PYATTRIBUTE_VECTOR_RW_CHECK("torque", -1000, 1000, false, KX_ObjectActuator, m_torque, PyUpdateFuzzyFlags),
+	KX_PYATTRIBUTE_BOOL_RW("useLocalTorque", KX_ObjectActuator, m_bitLocalFlag.Torque),
+	KX_PYATTRIBUTE_VECTOR_RW_CHECK("dLoc", -1000, 1000, false, KX_ObjectActuator, m_dloc, PyUpdateFuzzyFlags),
+	KX_PYATTRIBUTE_BOOL_RW("useLocalDLoc", KX_ObjectActuator, m_bitLocalFlag.DLoc),
+	KX_PYATTRIBUTE_VECTOR_RW_CHECK("dRot", -1000, 1000, false, KX_ObjectActuator, m_drot, PyUpdateFuzzyFlags),
+	KX_PYATTRIBUTE_BOOL_RW("useLocalDRot", KX_ObjectActuator, m_bitLocalFlag.DRot),
+	KX_PYATTRIBUTE_VECTOR_RW_CHECK("linV", -1000, 1000, false, KX_ObjectActuator, m_linear_velocity, PyUpdateFuzzyFlags),
+	KX_PYATTRIBUTE_BOOL_RW("useLocalLinV", KX_ObjectActuator, m_bitLocalFlag.LinearVelocity),
+	KX_PYATTRIBUTE_VECTOR_RW_CHECK("angV", -1000, 1000, false, KX_ObjectActuator, m_angular_velocity, PyUpdateFuzzyFlags),
+	KX_PYATTRIBUTE_BOOL_RW("useLocalAngV", KX_ObjectActuator, m_bitLocalFlag.AngularVelocity),
+	KX_PYATTRIBUTE_SHORT_RW("damping", 0, 1000, false, KX_ObjectActuator, m_damping),
+	KX_PYATTRIBUTE_RW_FUNCTION("forceLimitX", KX_ObjectActuator, pyattr_get_forceLimitX, pyattr_set_forceLimitX),
+	KX_PYATTRIBUTE_RW_FUNCTION("forceLimitY", KX_ObjectActuator, pyattr_get_forceLimitY, pyattr_set_forceLimitY),
+	KX_PYATTRIBUTE_RW_FUNCTION("forceLimitZ", KX_ObjectActuator, pyattr_get_forceLimitZ, pyattr_set_forceLimitZ),
+	KX_PYATTRIBUTE_VECTOR_RW_CHECK("pid", -100, 200, true, KX_ObjectActuator, m_pid, PyCheckPid),
 	{ NULL }	//Sentinel
 };
 
 PyObject* KX_ObjectActuator::py_getattro(PyObject *attr) {
 	py_getattro_up(SCA_IActuator);
-};
+}
 
+
 PyObject* KX_ObjectActuator::py_getattro_dict() {
 	py_getattro_dict_up(SCA_IActuator);
 }
 
+int KX_ObjectActuator::py_setattro(PyObject *attr, PyObject *value)
+{
+	py_setattro_up(SCA_IActuator);
+}
+
+/* Attribute get/set functions */
+
+PyObject* KX_ObjectActuator::pyattr_get_forceLimitX(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+	KX_ObjectActuator* self = reinterpret_cast<KX_ObjectActuator*>(self_v);
+	PyObject *retVal = PyList_New(3);
+
+	PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(self->m_drot[0]));
+	PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(self->m_dloc[0]));
+	PyList_SET_ITEM(retVal, 2, PyBool_FromLong(self->m_bitLocalFlag.Torque));
+	
+	return retVal;
+}
+
+int KX_ObjectActuator::pyattr_set_forceLimitX(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+	KX_ObjectActuator* self = reinterpret_cast<KX_ObjectActuator*>(self_v);
+
+	PyObject* seq = PySequence_Fast(value, "");
+	if (seq && PySequence_Fast_GET_SIZE(seq) == 3)
+	{
+		self->m_drot[0] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 0));
+		self->m_dloc[0] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 1));
+		self->m_bitLocalFlag.Torque = (PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 2)) != 0);
+
+		if (!PyErr_Occurred())
+		{
+			Py_DECREF(seq);
+			return PY_SET_ATTR_SUCCESS;
+		}
+	}
+
+	Py_XDECREF(seq);
+
+	PyErr_SetString(PyExc_ValueError, "expected a sequence of 2 floats and a bool");
+	return PY_SET_ATTR_FAIL;
+}
+
+PyObject* KX_ObjectActuator::pyattr_get_forceLimitY(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+	KX_ObjectActuator* self = reinterpret_cast<KX_ObjectActuator*>(self_v);
+	PyObject *retVal = PyList_New(3);
+
+	PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(self->m_drot[1]));
+	PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(self->m_dloc[1]));
+	PyList_SET_ITEM(retVal, 2, PyBool_FromLong(self->m_bitLocalFlag.DLoc));
+	
+	return retVal;
+}
+
+int	KX_ObjectActuator::pyattr_set_forceLimitY(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+	KX_ObjectActuator* self = reinterpret_cast<KX_ObjectActuator*>(self_v);
+
+	PyObject* seq = PySequence_Fast(value, "");
+	if (seq && PySequence_Fast_GET_SIZE(seq) == 3)
+	{
+		self->m_drot[1] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 0));
+		self->m_dloc[1] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 1));
+		self->m_bitLocalFlag.DLoc = (PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 2)) != 0);
+
+		if (!PyErr_Occurred())
+		{
+			Py_DECREF(seq);
+			return PY_SET_ATTR_SUCCESS;
+		}
+	}
+
+	Py_XDECREF(seq);
+
+	PyErr_SetString(PyExc_ValueError, "expected a sequence of 2 floats and a bool");
+	return PY_SET_ATTR_FAIL;
+}
+
+PyObject* KX_ObjectActuator::pyattr_get_forceLimitZ(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef)
+{
+	KX_ObjectActuator* self = reinterpret_cast<KX_ObjectActuator*>(self_v);
+	PyObject *retVal = PyList_New(3);
+
+	PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(self->m_drot[2]));
+	PyList_SET_ITEM(retVal, 1, PyFloat_FromDouble(self->m_dloc[2]));
+	PyList_SET_ITEM(retVal, 2, PyBool_FromLong(self->m_bitLocalFlag.DRot));
+	
+	return retVal;
+}
+
+int	KX_ObjectActuator::pyattr_set_forceLimitZ(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value)
+{
+	KX_ObjectActuator* self = reinterpret_cast<KX_ObjectActuator*>(self_v);
+
+	PyObject* seq = PySequence_Fast(value, "");
+	if (seq && PySequence_Fast_GET_SIZE(seq) == 3)
+	{
+		self->m_drot[2] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 0));
+		self->m_dloc[2] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, 1));
+		self->m_bitLocalFlag.DRot = (PyInt_AsLong(PySequence_Fast_GET_ITEM(value, 2)) != 0);
+
+		if (!PyErr_Occurred())
+		{
+			Py_DECREF(seq);
+			return PY_SET_ATTR_SUCCESS;
+		}
+	}
+
+	Py_XDECREF(seq);
+
+	PyErr_SetString(PyExc_ValueError, "expected a sequence of 2 floats and a bool");
+	return PY_SET_ATTR_FAIL;
+}
+
 /* 1. set ------------------------------------------------------------------ */
 /* Removed! */
 
 /* 2. getForce                                                               */
 PyObject* KX_ObjectActuator::PyGetForce()
 {
+	ShowDeprecationWarning("getForce()", "the force and the useLocalForce properties");
 	PyObject *retVal = PyList_New(4);
 
 	PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_force[0]));
@@ -375,6 +503,7 @@
 /* 3. setForce                                                               */
 PyObject* KX_ObjectActuator::PySetForce(PyObject* args)
 {
+	ShowDeprecationWarning("setForce()", "the force and the useLocalForce properties");
 	float vecArg[3];
 	int bToggle = 0;
 	if (!PyArg_ParseTuple(args, "fffi:setForce", &vecArg[0], &vecArg[1], 
@@ -390,6 +519,7 @@
 /* 4. getTorque                                                              */
 PyObject* KX_ObjectActuator::PyGetTorque()
 {
+	ShowDeprecationWarning("getTorque()", "the torque and the useLocalTorque properties");
 	PyObject *retVal = PyList_New(4);
 
 	PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_torque[0]));
@@ -402,6 +532,7 @@
 /* 5. setTorque                                                              */
 PyObject* KX_ObjectActuator::PySetTorque(PyObject* args)
 {
+	ShowDeprecationWarning("setTorque()", "the torque and the useLocalTorque properties");
 	float vecArg[3];
 	int bToggle = 0;
 	if (!PyArg_ParseTuple(args, "fffi:setTorque", &vecArg[0], &vecArg[1], 
@@ -417,6 +548,7 @@
 /* 6. getDLoc                                                                */
 PyObject* KX_ObjectActuator::PyGetDLoc()
 {
+	ShowDeprecationWarning("getDLoc()", "the dLoc and the useLocalDLoc properties");
 	PyObject *retVal = PyList_New(4);
 
 	PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_dloc[0]));
@@ -429,6 +561,7 @@
 /* 7. setDLoc                                                                */
 PyObject* KX_ObjectActuator::PySetDLoc(PyObject* args)
 {
+	ShowDeprecationWarning("setDLoc()", "the dLoc and the useLocalDLoc properties");
 	float vecArg[3];
 	int bToggle = 0;
 	if(!PyArg_ParseTuple(args, "fffi:setDLoc", &vecArg[0], &vecArg[1], 
@@ -444,6 +577,7 @@
 /* 8. getDRot                                                                */
 PyObject* KX_ObjectActuator::PyGetDRot()
 {
+	ShowDeprecationWarning("getDRot()", "the dRot and the useLocalDRot properties");
 	PyObject *retVal = PyList_New(4);
 
 	PyList_SET_ITEM(retVal, 0, PyFloat_FromDouble(m_drot[0]));
@@ -456,6 +590,7 @@
 /* 9. setDRot                                                                */
 PyObject* KX_ObjectActuator::PySetDRot(PyObject* args)
 {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list