build islands once and process islands arbitrary number of times in update constraints
This commit is contained in:
@@ -338,13 +338,17 @@ void btSimulationIslandManager::buildIslands(btDispatcher* dispatcher, btCollisi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///@todo: this is random access, it can be walked 'cache friendly'!
|
///@todo: this is random access, it can be walked 'cache friendly'!
|
||||||
void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback)
|
void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback)
|
||||||
{
|
{
|
||||||
btCollisionObjectArray& collisionObjects = collisionWorld->getCollisionObjectArray();
|
|
||||||
|
|
||||||
buildIslands(dispatcher, collisionWorld);
|
buildIslands(dispatcher, collisionWorld);
|
||||||
|
processIslands(dispatcher, collisionWorld, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
void btSimulationIslandManager::processIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback)
|
||||||
|
{
|
||||||
|
btCollisionObjectArray& collisionObjects = collisionWorld->getCollisionObjectArray();
|
||||||
int endIslandIndex = 1;
|
int endIslandIndex = 1;
|
||||||
int startIslandIndex;
|
int startIslandIndex;
|
||||||
int numElem = getUnionFind().getNumElements();
|
int numElem = getUnionFind().getNumElements();
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
void buildAndProcessIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback);
|
void buildAndProcessIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback);
|
||||||
|
void processIslands(btDispatcher* dispatcher, btCollisionWorld* collisionWorld, IslandCallback* callback);
|
||||||
void buildIslands(btDispatcher* dispatcher, btCollisionWorld* colWorld);
|
void buildIslands(btDispatcher* dispatcher, btCollisionWorld* colWorld);
|
||||||
|
|
||||||
bool getSplitIslands()
|
bool getSplitIslands()
|
||||||
|
|||||||
@@ -428,13 +428,18 @@ void btMultiBodyDynamicsWorld::forwardKinematics()
|
|||||||
void btMultiBodyDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
|
void btMultiBodyDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
|
||||||
{
|
{
|
||||||
solveExternalForces(solverInfo);
|
solveExternalForces(solverInfo);
|
||||||
buildIslands();
|
m_islandManager->buildAndProcessIslands(getCollisionWorld()->getDispatcher(), getCollisionWorld(), m_solverMultiBodyIslandCallback);
|
||||||
solveInternalConstraints(solverInfo);
|
solveInternalConstraints(solverInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void btMultiBodyDynamicsWorld::buildIslands()
|
void btMultiBodyDynamicsWorld::buildIslands()
|
||||||
{
|
{
|
||||||
m_islandManager->buildAndProcessIslands(getCollisionWorld()->getDispatcher(), getCollisionWorld(), m_solverMultiBodyIslandCallback);
|
m_islandManager->buildIslands(getCollisionWorld()->getDispatcher(), getCollisionWorld());
|
||||||
|
}
|
||||||
|
|
||||||
|
void btMultiBodyDynamicsWorld::processIslands()
|
||||||
|
{
|
||||||
|
m_islandManager->processIslands(getCollisionWorld()->getDispatcher(), getCollisionWorld(), m_solverMultiBodyIslandCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
void btMultiBodyDynamicsWorld::solveInternalConstraints(btContactSolverInfo& solverInfo)
|
void btMultiBodyDynamicsWorld::solveInternalConstraints(btContactSolverInfo& solverInfo)
|
||||||
@@ -1086,3 +1091,8 @@ void btMultiBodyDynamicsWorld::serializeMultiBodies(btSerializer* serializer)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void btMultiBodyDynamicsWorld::setSplitIslands(bool split)
|
||||||
|
{
|
||||||
|
m_islandManager->setSplitIslands(split);
|
||||||
|
}
|
||||||
|
|||||||
@@ -118,6 +118,8 @@ public:
|
|||||||
virtual void solveExternalForces(btContactSolverInfo& solverInfo);
|
virtual void solveExternalForces(btContactSolverInfo& solverInfo);
|
||||||
virtual void solveInternalConstraints(btContactSolverInfo& solverInfo);
|
virtual void solveInternalConstraints(btContactSolverInfo& solverInfo);
|
||||||
void buildIslands();
|
void buildIslands();
|
||||||
|
void processIslands();
|
||||||
|
void setSplitIslands(bool split);
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif //BT_MULTIBODY_DYNAMICS_WORLD_H
|
#endif //BT_MULTIBODY_DYNAMICS_WORLD_H
|
||||||
|
|||||||
@@ -143,6 +143,8 @@ void btDeformableBackwardEulerObjective::setConstraints()
|
|||||||
{
|
{
|
||||||
// build islands for multibody solve
|
// build islands for multibody solve
|
||||||
m_world->btMultiBodyDynamicsWorld::buildIslands();
|
m_world->btMultiBodyDynamicsWorld::buildIslands();
|
||||||
|
// for repeated constraint solve, splitIslands has to be set to true
|
||||||
|
m_world->setSplitIslands(true);
|
||||||
projection.setConstraints();
|
projection.setConstraints();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
btDeformableBodySolver::btDeformableBodySolver()
|
btDeformableBodySolver::btDeformableBodySolver()
|
||||||
: m_numNodes(0)
|
: m_numNodes(0)
|
||||||
, m_cg(10)
|
, m_cg(10)
|
||||||
, m_contact_iterations(10)
|
, m_contact_iterations(5)
|
||||||
{
|
{
|
||||||
m_objective = new btDeformableBackwardEulerObjective(m_softBodySet, m_backupVelocity);
|
m_objective = new btDeformableBackwardEulerObjective(m_softBodySet, m_backupVelocity);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,9 +51,11 @@ static btVector3 generateUnitOrthogonalVector(const btVector3& u)
|
|||||||
void btDeformableContactProjection::update()
|
void btDeformableContactProjection::update()
|
||||||
{
|
{
|
||||||
///solve rigid body constraints
|
///solve rigid body constraints
|
||||||
|
{
|
||||||
m_world->getSolverInfo().m_numIterations = 1;
|
m_world->getSolverInfo().m_numIterations = 1;
|
||||||
m_world->btMultiBodyDynamicsWorld::solveInternalConstraints(m_world->getSolverInfo());
|
m_world->processIslands();
|
||||||
|
m_world->btMultiBodyDynamicsWorld::solveInternalConstraints(m_world->getSolverInfo()); // process constraints deferred in the previous step
|
||||||
|
}
|
||||||
// loop through constraints to set constrained values
|
// loop through constraints to set constrained values
|
||||||
for (int index = 0; index < m_constraints.size(); ++index)
|
for (int index = 0; index < m_constraints.size(); ++index)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user