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
path: root/extern
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 /extern
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 'extern')
-rw-r--r--extern/bullet/Bullet/CollisionDispatch/CollisionDispatcher.cpp8
-rw-r--r--extern/bullet/Bullet/CollisionDispatch/CollisionObject.cpp2
-rw-r--r--extern/bullet/Bullet/CollisionDispatch/CollisionObject.h5
-rw-r--r--extern/bullet/Bullet/CollisionDispatch/CollisionWorld.cpp1
-rw-r--r--extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp38
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");
+ }
+
+ }
}
}