diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp index 5877df5f289..a0084662490 100644 --- a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp +++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp @@ -583,7 +583,7 @@ static PyObject *gPyRemoveConstraint(PyObject *self, { if (PHY_GetActiveEnvironment()) { - PHY_GetActiveEnvironment()->RemoveConstraint(constraintid); + PHY_GetActiveEnvironment()->RemoveConstraintById(constraintid); } } else { diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index 273e7323514..1d60f9afec3 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp @@ -511,7 +511,26 @@ void CcdPhysicsEnvironment::AddCcdPhysicsController(CcdPhysicsController* ctrl) assert(obj->getBroadphaseHandle()); } - +void CcdPhysicsEnvironment::RemoveConstraint(btTypedConstraint *con) +{ + btRigidBody rbA = con->getRigidBodyA(); + btRigidBody rbB = con->getRigidBodyA(); + rbA.activate(); + rbB.activate(); + m_dynamicsWorld->removeConstraint(con); + + if (rbA.getUserPointer()) { + ((CcdPhysicsController *)rbA.getUserPointer())->removeCcdConstraintRef(con); + } + + if (rbB.getUserPointer()) { + ((CcdPhysicsController *)rbB.getUserPointer())->removeCcdConstraintRef(con); + } + + /* Since we remove the constraint in the onwer and the target, we can delete it, + * KX_ConstraintWrapper keep the constraint id not the pointer, so no problems. */ + delete con; +} bool CcdPhysicsEnvironment::RemoveCcdPhysicsController(CcdPhysicsController* ctrl) { @@ -534,21 +553,7 @@ bool CcdPhysicsEnvironment::RemoveCcdPhysicsController(CcdPhysicsController* ctr for (int i = ctrl->getNumCcdConstraintRefs() - 1; i >= 0; i--) { btTypedConstraint* con = ctrl->getCcdConstraintRef(i); - con->getRigidBodyA().activate(); - con->getRigidBodyB().activate(); - m_dynamicsWorld->removeConstraint(con); - - // The other physics controller in the constraint, can't be NULL. - CcdPhysicsController *otherCtrl = (body == &con->getRigidBodyA()) ? - (CcdPhysicsController *)con->getRigidBodyB().getUserPointer() : - (CcdPhysicsController *)con->getRigidBodyA().getUserPointer(); - - otherCtrl->removeCcdConstraintRef(con); - ctrl->removeCcdConstraintRef(con); - /** Since we remove the constraint in the onwer and the target, we can delete it, - * KX_ConstraintWrapper keep the constraint id not the pointer, so no problems. - */ - delete con; + RemoveConstraint(con); } m_dynamicsWorld->removeRigidBody(ctrl->GetRigidBody()); @@ -563,7 +568,7 @@ bool CcdPhysicsEnvironment::RemoveCcdPhysicsController(CcdPhysicsController* ctr } if (vehicle_constraint > 0) - RemoveConstraint(vehicle_constraint); + RemoveConstraintById(vehicle_constraint); } else { //if a softbody @@ -1109,9 +1114,7 @@ int CcdPhysicsEnvironment::CreateUniversalD6Constraint( return 0; } - - -void CcdPhysicsEnvironment::RemoveConstraint(int constraintId) +void CcdPhysicsEnvironment::RemoveConstraintById(int constraintId) { // For soft body constraints if (constraintId == 0) @@ -1124,9 +1127,7 @@ void CcdPhysicsEnvironment::RemoveConstraint(int constraintId) btTypedConstraint* constraint = m_dynamicsWorld->getConstraint(i); if (constraint->getUserConstraintId() == constraintId) { - constraint->getRigidBodyA().activate(); - constraint->getRigidBodyB().activate(); - m_dynamicsWorld->removeConstraint(constraint); + RemoveConstraint(constraint); break; } } diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h index 3d7e3943f98..86f663959f1 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h @@ -67,6 +67,9 @@ class CcdPhysicsEnvironment : public PHY_IPhysicsEnvironment friend class CcdOverlapFilterCallBack; btVector3 m_gravity; + // Removes the constraint and his references from the owner and the target. + void RemoveConstraint(btTypedConstraint *con); + protected: btIDebugDraw* m_debugDrawer; @@ -185,7 +188,7 @@ protected: virtual float GetConstraintParam(int constraintId,int param); - virtual void RemoveConstraint(int constraintid); + virtual void RemoveConstraintById(int constraintid); virtual float getAppliedImpulse(int constraintid); diff --git a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp index 979128370ee..99db56bfcef 100644 --- a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp @@ -106,7 +106,7 @@ int DummyPhysicsEnvironment::CreateConstraint(class PHY_IPhysicsController* ct } -void DummyPhysicsEnvironment::RemoveConstraint(int constraintid) +void DummyPhysicsEnvironment::RemoveConstraintById(int constraintid) { if (constraintid) { diff --git a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h index cfc8841cac2..929345d7161 100644 --- a/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h +++ b/source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h @@ -68,7 +68,7 @@ public: float axis2X=0,float axis2Y=0,float axis2Z=0,int flag=0 ); - virtual void RemoveConstraint(int constraintid); + virtual void RemoveConstraintById(int constraintid); //complex constraint for vehicles virtual PHY_IVehicle* GetVehicleConstraint(int constraintId) diff --git a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h index 44b61136d3f..4b8d36285be 100644 --- a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h +++ b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h @@ -168,7 +168,7 @@ class PHY_IPhysicsEnvironment float axis1X=0,float axis1Y=0,float axis1Z=0, float axis2X=0,float axis2Y=0,float axis2Z=0,int flag=0 )=0; - virtual void RemoveConstraint(int constraintid)=0; + virtual void RemoveConstraintById(int constraintid) = 0; virtual float GetAppliedImpulse(int constraintid) { return 0.0f; }