Commit: 87572091fb73add461090f64f3b4bbaa42e3a093
Author: Thomas Szepe
Date:   Fri Feb 20 23:37:32 2015 +0100
Branches: master
https://developer.blender.org/rB87572091fb73add461090f64f3b4bbaa42e3a093

BGE: Fix T43215: Rigidbody constraints deletion.

Deleting an object was deleting all rigidbody constraints in the scene.
Bug was introduced with D701.

Reviewers: agoose77, sergof, moguri, lordloki, sybren

Reviewed By: lordloki, sybren

Subscribers: sybren, hbar, blueprintrandom, sergof, agoose77

Differential Revision: https://developer.blender.org/D1007

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

M       source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
M       source/gameengine/Physics/Bullet/CcdPhysicsController.h
M       source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp

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

diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp 
b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
index 08fcb24..44c4e28 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
@@ -154,6 +154,28 @@ CcdPhysicsController::CcdPhysicsController (const 
CcdConstructionInfo& ci)
        CreateRigidbody();
 }
 
+void CcdPhysicsController::addCcdConstraintRef(btTypedConstraint* c)
+{
+       int index = m_ccdConstraintRefs.findLinearSearch(c);
+       if (index == m_ccdConstraintRefs.size())
+               m_ccdConstraintRefs.push_back(c);
+}
+
+void CcdPhysicsController::removeCcdConstraintRef(btTypedConstraint* c)
+{
+       m_ccdConstraintRefs.remove(c);
+}
+
+btTypedConstraint* CcdPhysicsController::getCcdConstraintRef(int index)
+{
+       return m_ccdConstraintRefs[index];
+}
+
+int CcdPhysicsController::getNumCcdConstraintRefs() const
+{
+       return m_ccdConstraintRefs.size();
+}
+
 btTransform&   
CcdPhysicsController::GetTransformFromMotionState(PHY_IMotionState* motionState)
 {
        static btTransform trans;
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h 
b/source/gameengine/Physics/Bullet/CcdPhysicsController.h
index be393bb..de40624 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h
@@ -461,6 +461,7 @@ protected:
        class CcdShapeConstructionInfo* m_shapeInfo;
        btCollisionShape* m_bulletChildShape;
 
+       btAlignedObjectArray<btTypedConstraint*> m_ccdConstraintRefs; // keep 
track of typed constraints referencing this rigid body
        friend class CcdPhysicsEnvironment;     // needed when updating the 
controller
 
        //some book keeping for replication
@@ -497,6 +498,11 @@ protected:
                return (--m_registerCount == 0) ? true : false;
        }
 
+       void addCcdConstraintRef(btTypedConstraint* c);
+       void removeCcdConstraintRef(btTypedConstraint* c);
+       btTypedConstraint* getCcdConstraintRef(int index);
+       int getNumCcdConstraintRefs() const;
+
        void SetWorldOrientation(const btMatrix3x3& mat);
        void ForceWorldTransform(const btMatrix3x3& mat, const btVector3& pos);
 
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp 
b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
index ac132a5..557b529 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
@@ -509,11 +509,13 @@ bool      
CcdPhysicsEnvironment::RemoveCcdPhysicsController(CcdPhysicsController* ctr
        btRigidBody* body = ctrl->GetRigidBody();
        if (body)
        {
-               for (int i = m_dynamicsWorld->getNumConstraints()-1;i>=0;i--)
+               for (int i = ctrl->getNumCcdConstraintRefs() - 1; i >= 0; i--)
                {
-                       btTypedConstraint *con = 
m_dynamicsWorld->getConstraint(i);
+                       btTypedConstraint* con = ctrl->getCcdConstraintRef(i);
+                       con->getRigidBodyA().activate();
+                       con->getRigidBodyB().activate();
                        m_dynamicsWorld->removeConstraint(con);
-                       body->removeConstraintRef(con);
+                       ctrl->removeCcdConstraintRef(con);
                        //delete con; //might be kept by python 
KX_ConstraintWrapper
                }
                m_dynamicsWorld->removeRigidBody(ctrl->GetRigidBody());
@@ -2667,6 +2669,8 @@ int                       
CcdPhysicsEnvironment::CreateConstraint(class PHY_IPhysicsController* ctrl
                                        pivotInA);
                        }
 
+                       c0->addCcdConstraintRef(p2p);
+                       c1->addCcdConstraintRef(p2p);
                        
m_dynamicsWorld->addConstraint(p2p,disableCollisionBetweenLinkedBodies);
 //                     m_constraints.push_back(p2p);
 
@@ -2737,6 +2741,8 @@ int                       
CcdPhysicsEnvironment::CreateConstraint(class PHY_IPhysicsController* ctrl
                        if (genericConstraint)
                        {
                                //m_constraints.push_back(genericConstraint);
+                               c0->addCcdConstraintRef(genericConstraint);
+                               c1->addCcdConstraintRef(genericConstraint);
                                
m_dynamicsWorld->addConstraint(genericConstraint,disableCollisionBetweenLinkedBodies);
                                
genericConstraint->setUserConstraintId(gConstraintUid++);
                                genericConstraint->setUserConstraintType(type);
@@ -2803,6 +2809,8 @@ int                       
CcdPhysicsEnvironment::CreateConstraint(class PHY_IPhysicsController* ctrl
                        if (coneTwistContraint)
                        {
                                //m_constraints.push_back(genericConstraint);
+                               c0->addCcdConstraintRef(coneTwistContraint);
+                               c1->addCcdConstraintRef(coneTwistContraint);
                                
m_dynamicsWorld->addConstraint(coneTwistContraint,disableCollisionBetweenLinkedBodies);
                                
coneTwistContraint->setUserConstraintId(gConstraintUid++);
                                coneTwistContraint->setUserConstraintType(type);
@@ -2876,6 +2884,8 @@ int                       
CcdPhysicsEnvironment::CreateConstraint(class PHY_IPhysicsController* ctrl
                        hinge->setAngularOnly(angularOnly);
 
                        //m_constraints.push_back(hinge);
+                       c0->addCcdConstraintRef(hinge);
+                       c1->addCcdConstraintRef(hinge);
                        
m_dynamicsWorld->addConstraint(hinge,disableCollisionBetweenLinkedBodies);
                        hinge->setUserConstraintId(gConstraintUid++);
                        hinge->setUserConstraintType(type);

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

Reply via email to