From 2eed545a70f851dac8497ada4636f0230ebba5f1 Mon Sep 17 00:00:00 2001 From: ejcoumans Date: Thu, 22 Jun 2006 03:00:43 +0000 Subject: [PATCH] enable to suspend and restore dynamics. also, catched the case where failed dynamics (resulting in infinite AABB sizes) doesn't mess up the entire simulation, it just get's deactivated (with a message that a simulation error happened) --- .../CollisionDispatch/CollisionDispatcher.cpp | 8 +++- Bullet/CollisionDispatch/CollisionObject.cpp | 2 +- Bullet/CollisionDispatch/CollisionObject.h | 5 +++ Bullet/CollisionDispatch/CollisionWorld.cpp | 1 + .../CcdPhysics/CcdPhysicsEnvironment.cpp | 38 +++++++++++++++---- 5 files changed, 43 insertions(+), 11 deletions(-) diff --git a/Bullet/CollisionDispatch/CollisionDispatcher.cpp b/Bullet/CollisionDispatch/CollisionDispatcher.cpp index ba2859e77..5749db20a 100644 --- a/Bullet/CollisionDispatch/CollisionDispatcher.cpp +++ b/Bullet/CollisionDispatch/CollisionDispatcher.cpp @@ -243,10 +243,14 @@ CollisionAlgorithm* CollisionDispatcher::InternalFindAlgorithm(BroadphaseProxy& bool CollisionDispatcher::NeedsResponse(const CollisionObject& colObj0,const CollisionObject& colObj1) { + + //here you can do filtering bool hasResponse = (!(colObj0.m_collisionFlags & CollisionObject::noContactResponse)) && (!(colObj1.m_collisionFlags & CollisionObject::noContactResponse)); + hasResponse = hasResponse && + (colObj0.IsActive() || colObj1.IsActive()); return hasResponse; } @@ -264,8 +268,8 @@ bool CollisionDispatcher::NeedsCollision(BroadphaseProxy& proxy0,BroadphaseProxy if ((body0->m_collisionFlags & CollisionObject::isStatic) && (body1->m_collisionFlags & CollisionObject::isStatic)) needsCollision = false; - - if ((body0->GetActivationState() == 2) &&(body1->GetActivationState() == 2)) + + if ((!body0->IsActive()) && (!body1->IsActive())) needsCollision = false; return needsCollision ; diff --git a/Bullet/CollisionDispatch/CollisionObject.cpp b/Bullet/CollisionDispatch/CollisionObject.cpp index 4b123ebe0..aec329184 100644 --- a/Bullet/CollisionDispatch/CollisionObject.cpp +++ b/Bullet/CollisionDispatch/CollisionObject.cpp @@ -31,7 +31,7 @@ CollisionObject::CollisionObject() void CollisionObject::SetActivationState(int newState) { - if (m_activationState1 != DISABLE_DEACTIVATION) + if ( (m_activationState1 != DISABLE_DEACTIVATION) && (m_activationState1 != DISABLE_SIMULATION)) m_activationState1 = newState; } diff --git a/Bullet/CollisionDispatch/CollisionObject.h b/Bullet/CollisionDispatch/CollisionObject.h index e8940a9b0..a6dfeb862 100644 --- a/Bullet/CollisionDispatch/CollisionObject.h +++ b/Bullet/CollisionDispatch/CollisionObject.h @@ -23,6 +23,7 @@ subject to the following restrictions: #define ISLAND_SLEEPING 2 #define WANTS_DEACTIVATION 3 #define DISABLE_DEACTIVATION 4 +#define DISABLE_SIMULATION 5 struct BroadphaseProxy; class CollisionShape; @@ -94,6 +95,10 @@ struct CollisionObject void activate(); + inline bool IsActive() const + { + return ((GetActivationState() != ISLAND_SLEEPING) && (GetActivationState() != DISABLE_SIMULATION)); + } }; diff --git a/Bullet/CollisionDispatch/CollisionWorld.cpp b/Bullet/CollisionDispatch/CollisionWorld.cpp index fb905c31e..e8f73b2cc 100644 --- a/Bullet/CollisionDispatch/CollisionWorld.cpp +++ b/Bullet/CollisionDispatch/CollisionWorld.cpp @@ -171,6 +171,7 @@ void CollisionWorld::RemoveCollisionObject(CollisionObject* collisionObject) // GetBroadphase()->CleanProxyFromPairs(bp); GetBroadphase()->DestroyProxy(bp); + collisionObject->m_broadphaseHandle = 0; } } diff --git a/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp b/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp index 2b525655f..972d38faa 100644 --- a/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp +++ b/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp @@ -638,7 +638,7 @@ bool CcdPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep) CcdPhysicsController* ctrl = m_controllers[k]; // SimdTransform predictedTrans; RigidBody* body = ctrl->GetRigidBody(); - if (body->GetActivationState() != ISLAND_SLEEPING) + if (body->IsActive()) { if (!body->IsStatic()) { @@ -695,14 +695,17 @@ bool CcdPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep) { TypedConstraint* constraint = m_constraints[i]; - const CollisionObject* colObj0 = &constraint->GetRigidBodyA(); - const CollisionObject* colObj1 = &constraint->GetRigidBodyB(); + const RigidBody* colObj0 = &constraint->GetRigidBodyA(); + const RigidBody* colObj1 = &constraint->GetRigidBodyB(); if (((colObj0) && ((colObj0)->mergesSimulationIslands())) && ((colObj1) && ((colObj1)->mergesSimulationIslands()))) { - GetDispatcher()->GetUnionFind().unite((colObj0)->m_islandTag1, - (colObj1)->m_islandTag1); + if (colObj0->IsActive() || colObj1->IsActive()) + { + GetDispatcher()->GetUnionFind().unite((colObj0)->m_islandTag1, + (colObj1)->m_islandTag1); + } } } } @@ -863,7 +866,8 @@ bool CcdPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep) SimdTransform predictedTrans; RigidBody* body = ctrl->GetRigidBody(); - if (body->GetActivationState() != ISLAND_SLEEPING) + + if (body->IsActive()) { if (!body->IsStatic()) @@ -1698,9 +1702,27 @@ void CcdPhysicsEnvironment::UpdateAabbs(float timeStep) } } - scene->SetAabb(bp,minAabb,maxAabb); - + + if ( (maxAabb-minAabb).length2() < 1e12f) + { + scene->SetAabb(bp,minAabb,maxAabb); + } else + { + //something went wrong, investigate + //removeCcdPhysicsController(ctrl); + body->SetActivationState(DISABLE_SIMULATION); + static bool reportMe = true; + if (reportMe) + { + reportMe = false; + printf("Overflow in AABB, object removed from simulation \n"); + printf("If you can reproduce this, please email bugs@continuousphysics.com\n"); + printf("Please include above information, your Platform, version of OS.\n"); + printf("Thanks.\n"); + } + + } } }