bugfix/workaround for problem with hard-coded collision margins being too large.

This commit is contained in:
Erwin Coumans 2006-06-18 22:10:00 +00:00
parent dcbcc12582
commit ec8448b88d
9 changed files with 62 additions and 4 deletions

@ -15,6 +15,7 @@
#include "PHY_IPhysicsEnvironment.h"
KX_BulletPhysicsController::KX_BulletPhysicsController (const CcdConstructionInfo& ci, bool dyna)
: KX_IPhysicsController(dyna,(PHY_IPhysicsController*)this),
CcdPhysicsController(ci)
@ -58,6 +59,10 @@ void KX_BulletPhysicsController::SetObject (SG_IObject* object)
}
void KX_BulletPhysicsController::SetMargin (float collisionMargin)
{
CcdPhysicsController::SetMargin(collisionMargin);
}
void KX_BulletPhysicsController::RelativeTranslate(const MT_Vector3& dloc,bool local)
{
CcdPhysicsController::RelativeTranslate(dloc[0],dloc[1],dloc[2],local);

@ -19,7 +19,7 @@ public:
virtual void applyImpulse(const MT_Point3& attach, const MT_Vector3& impulse);
virtual void SetObject (SG_IObject* object);
virtual void SetMargin (float collisionMargin);
virtual void RelativeTranslate(const MT_Vector3& dloc,bool local);
virtual void RelativeRotate(const MT_Matrix3x3& drot,bool local);
virtual void ApplyTorque(const MT_Vector3& torque,bool local);

@ -627,6 +627,7 @@ PyMethodDef KX_GameObject::Methods[] = {
{"getMass", (PyCFunction) KX_GameObject::sPyGetMass, METH_VARARGS},
{"getReactionForce", (PyCFunction) KX_GameObject::sPyGetReactionForce, METH_VARARGS},
{"applyImpulse", (PyCFunction) KX_GameObject::sPyApplyImpulse, METH_VARARGS},
{"setCollisionMargin", (PyCFunction) KX_GameObject::sPySetCollisionMargin, METH_VARARGS},
{"suspendDynamics", (PyCFunction)KX_GameObject::sPySuspendDynamics,METH_VARARGS},
{"restoreDynamics", (PyCFunction)KX_GameObject::sPyRestoreDynamics,METH_VARARGS},
{"enableRigidBody", (PyCFunction)KX_GameObject::sPyEnableRigidBody,METH_VARARGS},
@ -979,6 +980,29 @@ PyObject* KX_GameObject::PyGetMesh(PyObject* self,
}
PyObject* KX_GameObject::PySetCollisionMargin(PyObject* self,
PyObject* args,
PyObject* kwds)
{
float collisionMargin;
if (PyArg_ParseTuple(args, "f", &collisionMargin))
{
if (m_pPhysicsController1)
{
m_pPhysicsController1->SetMargin(collisionMargin);
Py_Return;
}
}
return NULL;
}
PyObject* KX_GameObject::PyApplyImpulse(PyObject* self,
PyObject* args,
PyObject* kwds)

@ -604,6 +604,7 @@ public:
KX_PYMETHOD(KX_GameObject,EnableRigidBody);
KX_PYMETHOD(KX_GameObject,DisableRigidBody);
KX_PYMETHOD(KX_GameObject,ApplyImpulse);
KX_PYMETHOD(KX_GameObject,SetCollisionMargin);
KX_PYMETHOD(KX_GameObject,GetMesh);
KX_PYMETHOD(KX_GameObject,GetParent);
KX_PYMETHOD(KX_GameObject,GetPhysicsId);

@ -60,6 +60,7 @@ public:
virtual void applyImpulse(const MT_Point3& attach, const MT_Vector3& impulse)=0;
virtual void SetObject (SG_IObject* object)=0;
virtual void SetMargin (float collisionMargin)=0;
virtual void RelativeTranslate(const MT_Vector3& dloc,bool local)=0;
virtual void RelativeRotate(const MT_Matrix3x3& drot,bool local)=0;

@ -164,6 +164,11 @@ gameobj->SetPhysicsController(this,gameobj->IsDynamic());
GetSumoObject()->setClientObject(gameobj->getClientInfo());
}
void KX_SumoPhysicsController::SetMargin(float collisionMargin)
{
SumoPhysicsController::SetMargin(collisionMargin);
}
void KX_SumoPhysicsController::setOrientation(const MT_Quaternion& orn)
{

@ -64,7 +64,7 @@ public:
void applyImpulse(const MT_Point3& attach, const MT_Vector3& impulse);
virtual void SetObject (SG_IObject* object);
virtual void SetMargin (float collisionMargin);
void RelativeTranslate(const MT_Vector3& dloc,bool local);
void RelativeRotate(const MT_Matrix3x3& drot,bool local);

@ -210,6 +210,28 @@ void CcdPhysicsController::PostProcessReplica(class PHY_IMotionState* motionsta
}
void CcdPhysicsController::SetMargin(float margin)
{
if (m_body && m_body->GetCollisionShape())
{
m_body->GetCollisionShape()->SetMargin(margin);
}
}
float CcdPhysicsController::GetMargin() const
{
if (m_body && m_body->GetCollisionShape())
{
return m_body->GetCollisionShape()->GetMargin();
}
return 0.f;
}
// kinematic methods
void CcdPhysicsController::RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local)
{

@ -160,8 +160,8 @@ class CcdPhysicsController : public PHY_IPhysicsController
virtual void calcXform() {} ;
virtual void SetMargin(float margin) {};
virtual float GetMargin() const {return 0.f;};
virtual void SetMargin(float margin);
virtual float GetMargin() const;
bool wantsSleeping();