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 /source/gameengine | |
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 'source/gameengine')
-rw-r--r-- | source/gameengine/Ketsji/KX_BulletPhysicsController.cpp | 2 | ||||
-rw-r--r-- | source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp | 38 |
2 files changed, 32 insertions, 8 deletions
diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp index c974b9b6828..49e0e7953cb 100644 --- a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp +++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp @@ -144,10 +144,12 @@ void KX_BulletPhysicsController::setRigidBody(bool rigid) void KX_BulletPhysicsController::SuspendDynamics() { + GetRigidBody()->SetActivationState(DISABLE_SIMULATION); } void KX_BulletPhysicsController::RestoreDynamics() { + GetRigidBody()->SetActivationState(ACTIVE_TAG); } SG_Controller* KX_BulletPhysicsController::GetReplica(class SG_Node* destnode) diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index f169059cf37..d5fd194dd99 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/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"); + } + + } } } |