diff --git a/extern/bullet/BulletDynamics/Vehicle/RaycastVehicle.cpp b/extern/bullet/BulletDynamics/Vehicle/RaycastVehicle.cpp index 2099aa9b880..096ccfd85d2 100755 --- a/extern/bullet/BulletDynamics/Vehicle/RaycastVehicle.cpp +++ b/extern/bullet/BulletDynamics/Vehicle/RaycastVehicle.cpp @@ -587,7 +587,7 @@ void RaycastVehicle::UpdateFriction(SimdScalar timeStep) SimdVector3 sideImp = axle[wheel] * sideImpulse[wheel]; - rel_pos[2] *= 0.1; + rel_pos[2] *= wheelInfo.m_rollInfluence; m_chassisBody->applyImpulse(sideImp,rel_pos); //apply friction impulse on the ground diff --git a/extern/bullet/BulletDynamics/Vehicle/WheelInfo.h b/extern/bullet/BulletDynamics/Vehicle/WheelInfo.h index bd69a634597..61687f58b3a 100755 --- a/extern/bullet/BulletDynamics/Vehicle/WheelInfo.h +++ b/extern/bullet/BulletDynamics/Vehicle/WheelInfo.h @@ -67,6 +67,7 @@ struct WheelInfo SimdScalar m_steering; SimdScalar m_rotation; SimdScalar m_deltaRotation; + SimdScalar m_rollInfluence; SimdScalar m_engineForce; @@ -96,6 +97,7 @@ struct WheelInfo m_rotation = 0.f; m_deltaRotation = 0.f; m_brake = 0.f; + m_rollInfluence = 0.1f; m_bIsFrontWheel = ci.m_bIsFrontWheel; } diff --git a/source/gameengine/Ketsji/KX_VehicleWrapper.cpp b/source/gameengine/Ketsji/KX_VehicleWrapper.cpp index 9745af028d5..d92742d8799 100644 --- a/source/gameengine/Ketsji/KX_VehicleWrapper.cpp +++ b/source/gameengine/Ketsji/KX_VehicleWrapper.cpp @@ -158,6 +158,81 @@ PyObject* KX_VehicleWrapper::PyApplyEngineForce(PyObject* self, return Py_None; } +PyObject* KX_VehicleWrapper::PySetTyreFriction(PyObject* self, + PyObject* args, + PyObject* kwds) +{ + float wheelFriction; + int wheelIndex; + + if (PyArg_ParseTuple(args,"fi",&wheelFriction,&wheelIndex)) + { + m_vehicle->SetWheelFriction(wheelFriction,wheelIndex); + } + Py_INCREF(Py_None); + return Py_None; +} + +PyObject* KX_VehicleWrapper::PySetSuspensionStiffness(PyObject* self, + PyObject* args, + PyObject* kwds) +{ + float suspensionStiffness; + int wheelIndex; + + if (PyArg_ParseTuple(args,"fi",&suspensionStiffness,&wheelIndex)) + { + m_vehicle->SetSuspensionStiffness(suspensionStiffness,wheelIndex); + } + Py_INCREF(Py_None); + return Py_None; +} + +PyObject* KX_VehicleWrapper::PySetSuspensionDamping(PyObject* self, + PyObject* args, + PyObject* kwds) +{ + float suspensionDamping; + int wheelIndex; + + if (PyArg_ParseTuple(args,"fi",&suspensionDamping,&wheelIndex)) + { + m_vehicle->SetSuspensionDamping(suspensionDamping,wheelIndex); + } + Py_INCREF(Py_None); + return Py_None; +} + +PyObject* KX_VehicleWrapper::PySetSuspensionCompression(PyObject* self, + PyObject* args, + PyObject* kwds) +{ + float suspensionCompression; + int wheelIndex; + + if (PyArg_ParseTuple(args,"fi",&suspensionCompression,&wheelIndex)) + { + m_vehicle->SetSuspensionCompression(suspensionCompression,wheelIndex); + } + Py_INCREF(Py_None); + return Py_None; +} + +PyObject* KX_VehicleWrapper::PySetRollInfluence(PyObject* self, + PyObject* args, + PyObject* kwds) +{ + float rollInfluence; + int wheelIndex; + + if (PyArg_ParseTuple(args,"fi",&rollInfluence,&wheelIndex)) + { + m_vehicle->SetRollInfluence(rollInfluence,wheelIndex); + } + Py_INCREF(Py_None); + return Py_None; +} + PyObject* KX_VehicleWrapper::PyApplyBraking(PyObject* self, PyObject* args, @@ -275,8 +350,17 @@ PyMethodDef KX_VehicleWrapper::Methods[] = { {"setSteeringValue",(PyCFunction) KX_VehicleWrapper::sPySetSteeringValue, METH_VARARGS}, {"applyEngineForce",(PyCFunction) KX_VehicleWrapper::sPyApplyEngineForce, METH_VARARGS}, {"applyBraking",(PyCFunction) KX_VehicleWrapper::sPyApplyBraking, METH_VARARGS}, + + {"setTyreFriction",(PyCFunction) KX_VehicleWrapper::sPySetTyreFriction, METH_VARARGS}, + + {"setSuspensionStiffness",(PyCFunction) KX_VehicleWrapper::sPySetSuspensionStiffness, METH_VARARGS}, + + {"setSuspensionDamping",(PyCFunction) KX_VehicleWrapper::sPySetSuspensionDamping, METH_VARARGS}, + + {"setSuspensionCompression",(PyCFunction) KX_VehicleWrapper::sPySetSuspensionCompression, METH_VARARGS}, + + {"setRollInfluence",(PyCFunction) KX_VehicleWrapper::sPySetRollInfluence, METH_VARARGS}, + {NULL,NULL} //Sentinel }; - - diff --git a/source/gameengine/Ketsji/KX_VehicleWrapper.h b/source/gameengine/Ketsji/KX_VehicleWrapper.h index 22b8f186f4a..b98369d401a 100644 --- a/source/gameengine/Ketsji/KX_VehicleWrapper.h +++ b/source/gameengine/Ketsji/KX_VehicleWrapper.h @@ -39,7 +39,16 @@ public: KX_PYMETHOD(KX_VehicleWrapper,ApplyBraking); + KX_PYMETHOD(KX_VehicleWrapper,SetTyreFriction); + KX_PYMETHOD(KX_VehicleWrapper,SetSuspensionStiffness); + + KX_PYMETHOD(KX_VehicleWrapper,SetSuspensionDamping); + + KX_PYMETHOD(KX_VehicleWrapper,SetSuspensionCompression); + + KX_PYMETHOD(KX_VehicleWrapper,SetRollInfluence); + private: PHY_IVehicle* m_vehicle; diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index 9e175bdac27..b39591fc627 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp @@ -197,6 +197,57 @@ public: } } + virtual void SetWheelFriction(float friction,int wheelIndex) + { + if ((wheelIndex>=0) && (wheelIndex< m_vehicle->GetNumWheels())) + { + WheelInfo& info = m_vehicle->GetWheelInfo(wheelIndex); + info.m_frictionSlip = friction; + } + + } + + virtual void SetSuspensionStiffness(float suspensionStiffness,int wheelIndex) + { + if ((wheelIndex>=0) && (wheelIndex< m_vehicle->GetNumWheels())) + { + WheelInfo& info = m_vehicle->GetWheelInfo(wheelIndex); + info.m_suspensionStiffness = suspensionStiffness; + + } + } + + virtual void SetSuspensionDamping(float suspensionDamping,int wheelIndex) + { + if ((wheelIndex>=0) && (wheelIndex< m_vehicle->GetNumWheels())) + { + WheelInfo& info = m_vehicle->GetWheelInfo(wheelIndex); + info.m_wheelsDampingRelaxation = suspensionDamping; + } + } + + virtual void SetSuspensionCompression(float suspensionCompression,int wheelIndex) + { + if ((wheelIndex>=0) && (wheelIndex< m_vehicle->GetNumWheels())) + { + WheelInfo& info = m_vehicle->GetWheelInfo(wheelIndex); + info.m_wheelsDampingCompression = suspensionCompression; + } + } + + + + virtual void SetRollInfluence(float rollInfluence,int wheelIndex) + { + if ((wheelIndex>=0) && (wheelIndex< m_vehicle->GetNumWheels())) + { + WheelInfo& info = m_vehicle->GetWheelInfo(wheelIndex); + info.m_rollInfluence = rollInfluence; + } + } + + + }; #endif //NEW_BULLET_VEHICLE_SUPPORT diff --git a/source/gameengine/Physics/common/PHY_IVehicle.h b/source/gameengine/Physics/common/PHY_IVehicle.h index 0e6fe3379a2..d5566ff5bb3 100644 --- a/source/gameengine/Physics/common/PHY_IVehicle.h +++ b/source/gameengine/Physics/common/PHY_IVehicle.h @@ -40,6 +40,17 @@ public: virtual void ApplyBraking(float braking,int wheelIndex) = 0; + virtual void SetWheelFriction(float friction,int wheelIndex) = 0; + + virtual void SetSuspensionStiffness(float suspensionStiffness,int wheelIndex) = 0; + + virtual void SetSuspensionDamping(float suspensionStiffness,int wheelIndex) = 0; + + virtual void SetSuspensionCompression(float suspensionStiffness,int wheelIndex) = 0; + + virtual void SetRollInfluence(float rollInfluence,int wheelIndex) = 0; + + }; #endif //PHY_IVEHICLE_H