workaround for a irregularity/bug in physics system (happens very seldom, just 1 report so far, linear velocity/AABB becomes NaN)

This commit is contained in:
2006-06-22 01:10:50 +00:00
parent c570e2dc0b
commit cd5a7fbe84
7 changed files with 75 additions and 19 deletions

View File

@@ -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 ;

View File

@@ -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;
}

View File

@@ -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));
}
};

View File

@@ -171,6 +171,7 @@ void CollisionWorld::RemoveCollisionObject(CollisionObject* collisionObject)
//
GetBroadphase()->CleanProxyFromPairs(bp);
GetBroadphase()->DestroyProxy(bp);
collisionObject->m_broadphaseHandle = 0;
}
}

View File

@@ -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");
}
}
}
}

View File

@@ -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)

View File

@@ -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");
}
}
}
}