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. @@

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

Reply via email to