Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Szepe <HG1_public@gmx.net>2015-08-16 12:38:25 +0300
committerThomas Szepe <HG1_public@gmx.net>2015-08-16 12:38:25 +0300
commit9437acb7f337e00a422c24497e01973b5613aee5 (patch)
tree14c33ca3f0031e1352aa1e6ab73d5200a7811fff
parent19cc75d642422f68af1f1aa87790914cad4e20b7 (diff)
BGE: Fix memory leak and crash with certain physic types
Fixing crash if the physic type is set sensor or character. Caused by a790e172d0281e64. Fixing memory leak, if the constraint is deleted with Python API removeConstraint(). Add RemoveConstraint() method to avoid code duplication. Rename old RemoveConstraint() to RemoveConstraintById() which is more suitable name for this method.
-rw-r--r--source/gameengine/Ketsji/KX_PyConstraintBinding.cpp2
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp47
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h5
-rw-r--r--source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp2
-rw-r--r--source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h2
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h2
6 files changed, 32 insertions, 28 deletions
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; }