diff options
author | Erwin Coumans <blender@erwincoumans.com> | 2006-06-19 02:13:45 +0400 |
---|---|---|
committer | Erwin Coumans <blender@erwincoumans.com> | 2006-06-19 02:13:45 +0400 |
commit | a29ed091d6a0cf694d3e5e50c674f968f71b64b0 (patch) | |
tree | 549c0825d06ad7cd6788c8fa3eb0bb4916989ccb /extern | |
parent | ec8448b88d9285624d61ce9196c7ad3643dc921e (diff) |
bugfix/workaround for problem with hard-coded collision margins being too large. (part2)
Diffstat (limited to 'extern')
3 files changed, 46 insertions, 3 deletions
diff --git a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp index cddc780aff4..60b8dbbf862 100644 --- a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp +++ b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.cpp @@ -210,6 +210,28 @@ void CcdPhysicsController::PostProcessReplica(class PHY_IMotionState* motionsta } +void CcdPhysicsController::SetMargin(float margin) +{ + if (m_body && m_body->GetCollisionShape()) + { + m_body->GetCollisionShape()->SetMargin(margin); + } + + +} + +float CcdPhysicsController::GetMargin() const +{ + if (m_body && m_body->GetCollisionShape()) + { + return m_body->GetCollisionShape()->GetMargin(); + } + + return 0.f; + +} + + // kinematic methods void CcdPhysicsController::RelativeTranslate(float dlocX,float dlocY,float dlocZ,bool local) { diff --git a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.h b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.h index 056feba652c..7488e74db01 100644 --- a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.h +++ b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsController.h @@ -160,8 +160,8 @@ class CcdPhysicsController : public PHY_IPhysicsController virtual void calcXform() {} ; - virtual void SetMargin(float margin) {}; - virtual float GetMargin() const {return 0.f;}; + virtual void SetMargin(float margin); + virtual float GetMargin() const; bool wantsSleeping(); diff --git a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp index e4e7a998ad8..f6482e2c3e7 100644 --- a/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp +++ b/extern/bullet/Extras/PhysicsInterface/CcdPhysics/CcdPhysicsEnvironment.cpp @@ -687,6 +687,27 @@ bool CcdPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep) m_collisionWorld->UpdateActivationState(); + { + int i; + int numConstraints = m_constraints.size(); + for (i=0;i< numConstraints ; i++ ) + { + TypedConstraint* constraint = m_constraints[i]; + + const CollisionObject* colObj0 = &constraint->GetRigidBodyA(); + const CollisionObject* colObj1 = &constraint->GetRigidBodyB(); + + if (((colObj0) && ((colObj0)->mergesSimulationIslands())) && + ((colObj1) && ((colObj1)->mergesSimulationIslands()))) + { + GetDispatcher()->GetUnionFind().unite((colObj0)->m_islandTag1, + (colObj1)->m_islandTag1); + } + } + } + + m_collisionWorld->StoreIslandActivationState(); + //contacts @@ -779,7 +800,7 @@ bool CcdPhysicsEnvironment::proceedDeltaTimeOneStep(float timeStep) #endif //USE_QUICKPROF /// solve all the contact points and contact friction - GetDispatcher()->BuildAndProcessIslands(numRigidBodies,&solverCallback); + GetDispatcher()->BuildAndProcessIslands(m_collisionWorld->GetCollisionObjectArray(),&solverCallback); #ifdef USE_QUICKPROF Profiler::endBlock("BuildAndProcessIslands"); |