Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErwin Coumans <blender@erwincoumans.com>2006-06-22 05:10:50 +0400
committerErwin Coumans <blender@erwincoumans.com>2006-06-22 05:10:50 +0400
commitcd5a7fbe84e0f75dbab446d9cdee7fcf4e705650 (patch)
tree8333b7fac76d8b1c6ffc985205880211cf5d8b11 /source/gameengine
parentc570e2dc0be8506bc21b7226023e079eca9bac02 (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.cpp2
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp38
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");
+ }
+
+ }
}
}