Commit: 9437acb7f337e00a422c24497e01973b5613aee5
Author: Thomas Szepe
Date:   Sun Aug 16 11:38:25 2015 +0200
Branches: master
https://developer.blender.org/rB9437acb7f337e00a422c24497e01973b5613aee5

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.

===================================================================

M       source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
M       source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
M       source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
M       source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.cpp
M       source/gameengine/Physics/Dummy/DummyPhysicsEnvironment.h
M       source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h

===================================================================

diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp 
b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
index 5877df5..a008466 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 273e732..1d60f9a 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 3d7e394..86f6639 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 9791283..99db56b 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 cfc8841..929345d 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 44b6113..4b8d362 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; }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to