diff options
author | Sybren A. Stüvel <sybren@stuvel.eu> | 2015-01-15 20:27:47 +0300 |
---|---|---|
committer | Sybren A. Stüvel <sybren@stuvel.eu> | 2015-01-15 20:37:22 +0300 |
commit | ed8dc78691063f37eb411d1b2e095183a0a94dd5 (patch) | |
tree | cbfb817125eb8c97fd1c0a8442af6f73e2b691ee /source/gameengine/Ketsji/KX_GameObject.cpp | |
parent | b675418d0143ada5638b8074f86939224d1f23d2 (diff) |
BGE physics: get/set linear and angular damping
This patch adds the following R/W properties and method to `KX_GameObject`:
- `linearDamping` -- get/set linear damping
- `angluarDamping` -- get/set angular damping
- `setDamping(linear, angular)` -- set both simultaneously
These allow runtime changes to the same properties that are accessible at design time in Blender's UI via `game.damping` and `game.rotation_damping`. The names of the properties were chosen to mirror the internal names of the BGE physics engine, as these are (AFAIK) also the commonly used names in physics literature.
Reviewers: campbellbarton
Projects: #game_physics
Differential Revision: https://developer.blender.org/D936
Diffstat (limited to 'source/gameengine/Ketsji/KX_GameObject.cpp')
-rw-r--r-- | source/gameengine/Ketsji/KX_GameObject.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index 4ac889b1927..e8b68d20e84 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -575,6 +575,39 @@ CValue* KX_GameObject::GetReplica() return replica; } +float KX_GameObject::getLinearDamping() const +{ + if (m_pPhysicsController) + return m_pPhysicsController->GetLinearDamping(); + return 0; +} + +float KX_GameObject::getAngularDamping() const +{ + if (m_pPhysicsController) + return m_pPhysicsController->GetAngularDamping(); + return 0; +} + +void KX_GameObject::setLinearDamping(float damping) +{ + if (m_pPhysicsController) + m_pPhysicsController->SetLinearDamping(damping); +} + + +void KX_GameObject::setAngularDamping(float damping) +{ + if (m_pPhysicsController) + m_pPhysicsController->SetAngularDamping(damping); +} + + +void KX_GameObject::setDamping(float linear, float angular) +{ + if (m_pPhysicsController) + m_pPhysicsController->SetDamping(linear, angular); +} void KX_GameObject::ApplyForce(const MT_Vector3& force,bool local) @@ -1822,6 +1855,7 @@ PyMethodDef KX_GameObject::Methods[] = { {"getAngularVelocity", (PyCFunction) KX_GameObject::sPyGetAngularVelocity, METH_VARARGS}, {"setAngularVelocity", (PyCFunction) KX_GameObject::sPySetAngularVelocity, METH_VARARGS}, {"getVelocity", (PyCFunction) KX_GameObject::sPyGetVelocity, METH_VARARGS}, + {"setDamping", (PyCFunction) KX_GameObject::sPySetDamping, METH_VARARGS}, {"getReactionForce", (PyCFunction) KX_GameObject::sPyGetReactionForce, METH_NOARGS}, {"alignAxisToVect",(PyCFunction) KX_GameObject::sPyAlignAxisToVect, METH_VARARGS}, {"getAxisVect",(PyCFunction) KX_GameObject::sPyGetAxisVect, METH_O}, @@ -1897,6 +1931,8 @@ PyAttributeDef KX_GameObject::Attributes[] = { KX_PYATTRIBUTE_RW_FUNCTION("angularVelocity", KX_GameObject, pyattr_get_localAngularVelocity, pyattr_set_worldAngularVelocity), KX_PYATTRIBUTE_RW_FUNCTION("localAngularVelocity", KX_GameObject, pyattr_get_localAngularVelocity, pyattr_set_localAngularVelocity), KX_PYATTRIBUTE_RW_FUNCTION("worldAngularVelocity", KX_GameObject, pyattr_get_worldAngularVelocity, pyattr_set_worldAngularVelocity), + KX_PYATTRIBUTE_RW_FUNCTION("linearDamping", KX_GameObject, pyattr_get_linearDamping, pyattr_set_linearDamping), + KX_PYATTRIBUTE_RW_FUNCTION("angularDamping", KX_GameObject, pyattr_get_angularDamping, pyattr_set_angularDamping), KX_PYATTRIBUTE_RO_FUNCTION("children", KX_GameObject, pyattr_get_children), KX_PYATTRIBUTE_RO_FUNCTION("childrenRecursive", KX_GameObject, pyattr_get_children_recursive), KX_PYATTRIBUTE_RO_FUNCTION("attrDict", KX_GameObject, pyattr_get_attrDict), @@ -2687,6 +2723,34 @@ int KX_GameObject::pyattr_set_localAngularVelocity(void *self_v, const KX_PYATTR return PY_SET_ATTR_SUCCESS; } +PyObject *KX_GameObject::pyattr_get_linearDamping(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_GameObject* self = static_cast<KX_GameObject*>(self_v); + return PyFloat_FromDouble(self->getLinearDamping()); +} + +int KX_GameObject::pyattr_set_linearDamping(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_GameObject* self = static_cast<KX_GameObject*>(self_v); + float val = PyFloat_AsDouble(value); + self->setLinearDamping(val); + return PY_SET_ATTR_SUCCESS; +} + +PyObject *KX_GameObject::pyattr_get_angularDamping(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_GameObject* self = static_cast<KX_GameObject*>(self_v); + return PyFloat_FromDouble(self->getAngularDamping()); +} + +int KX_GameObject::pyattr_set_angularDamping(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_GameObject* self = static_cast<KX_GameObject*>(self_v); + float val = PyFloat_AsDouble(value); + self->setAngularDamping(val); + return PY_SET_ATTR_SUCCESS; +} + PyObject *KX_GameObject::pyattr_get_timeOffset(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) { @@ -2983,6 +3047,18 @@ PyObject *KX_GameObject::PySetAngularVelocity(PyObject *args) return NULL; } +PyObject *KX_GameObject::PySetDamping(PyObject *args) +{ + float linear; + float angular; + + if (!PyArg_ParseTuple(args,"ff|i:setDamping", &linear, &angular)) + return NULL; + + setDamping(linear, angular); + Py_RETURN_NONE; +} + PyObject *KX_GameObject::PySetVisible(PyObject *args) { int visible, recursive = 0; |