constraints between bodies merge constraint simulations (this fixes problems with deactivation/sleeping)

This commit is contained in:
ejcoumans
2006-06-17 15:22:06 +00:00
parent f73244b36a
commit 51a645bb4a
5 changed files with 90 additions and 54 deletions

View File

@@ -80,8 +80,6 @@ RaycastVehicle::VehicleTuning gTuning;
#include "ConstraintSolver/Generic6DofConstraint.h"
//#include "BroadphaseCollision/QueryDispatcher.h"
//#include "BroadphaseCollision/QueryBox.h"
//todo: change this to allow dynamic registration of types!
@@ -506,6 +504,10 @@ void CcdPhysicsEnvironment::beginFrame()
bool CcdPhysicsEnvironment::proceedDeltaTime(double curTime,float timeStep)
{
//don't simulate without timesubsteps
if (m_numTimeSubSteps<1)
return true;
//printf("proceedDeltaTime\n");
@@ -686,6 +688,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
@@ -778,7 +801,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");