diff options
author | Erwin Coumans <blender@erwincoumans.com> | 2006-06-22 05:10:50 +0400 |
---|---|---|
committer | Erwin Coumans <blender@erwincoumans.com> | 2006-06-22 05:10:50 +0400 |
commit | cd5a7fbe84e0f75dbab446d9cdee7fcf4e705650 (patch) | |
tree | 8333b7fac76d8b1c6ffc985205880211cf5d8b11 /extern | |
parent | c570e2dc0be8506bc21b7226023e079eca9bac02 (diff) |
workaround for a irregularity/bug in physics system (happens very seldom, just 1 report so far, linear velocity/AABB becomes NaN)
Diffstat (limited to 'extern')
5 files changed, 43 insertions, 11 deletions
diff --git a/extern/bullet/Bullet/CollisionDispatch/CollisionDispatcher.cpp b/extern/bullet/Bullet/CollisionDispatch/CollisionDispatcher.cpp index ba2859e77d8..5749db20a05 100644 --- a/extern/bullet/Bullet/CollisionDispatch/CollisionDispatcher.cpp +++ b/extern/bullet/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/extern/bullet/Bullet/CollisionDispatch/CollisionObject.cpp b/extern/bullet/Bullet/CollisionDispatch/CollisionObject.cpp index ab0fea21605..056dce59856 100644 --- a/extern/bullet/Bullet/CollisionDispatch/CollisionObject.cpp +++ b/extern/bullet/Bullet/CollisionDispatch/CollisionObject.cpp @@ -29,7 +29,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/extern/bullet/Bullet/CollisionDispatch/CollisionObject.h b/extern/bullet/Bullet/CollisionDispatch/CollisionObject.h index 9c4e3f14b4a..0c2d0be460c 100644 --- a/extern/bullet/Bullet/CollisionDispatch/CollisionObject.h +++ b/extern/bullet/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; @@ -85,6 +86,10 @@ struct CollisionObject void activate(); + inline bool IsActive() const + { + return ((GetActivationState() != ISLAND_SLEEPING) && (GetActivationState() != DISABLE_SIMULATION)); + } }; diff --git a/extern/bullet/Bullet/CollisionDispatch/CollisionWorld.cpp b/extern/bullet/Bullet/CollisionDispatch/CollisionWorld.cpp index fb905c31eb4..e8f73b2cc07 100644 --- a/extern/bullet/Bullet/CollisionDispatch/CollisionWorld.cpp +++ b/extern/bullet/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/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp index f169059cf37..d5fd194dd99 100644 --- a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp +++ b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp @@ -637,7 +637,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()) { @@ -694,14 +694,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); + } } } } @@ -862,7 +865,8 @@ bool CcdPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep) SimdTransform predictedTrans; RigidBody* body = ctrl->GetRigidBody(); - if (body->GetActivationState() != ISLAND_SLEEPING) + + if (body->IsActive()) { if (!body->IsStatic()) @@ -1659,9 +1663,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"); + } + + } } } |