forked from bartvdbraak/blender
bugfix/workaround for problem with hard-coded collision margins being too large.
This commit is contained in:
parent
dcbcc12582
commit
ec8448b88d
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user