enable randomization of non-contact constraints (disabled by default)
Thanks to Peter Kyme, http://code.google.com/p/bullet/issues/detail?id=576
This commit is contained in:
@@ -957,15 +957,20 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|||||||
btContactSolverInfo info = infoGlobal;
|
btContactSolverInfo info = infoGlobal;
|
||||||
|
|
||||||
|
|
||||||
|
int numNonContactPool = m_tmpSolverNonContactConstraintPool.size();
|
||||||
int numConstraintPool = m_tmpSolverContactConstraintPool.size();
|
int numConstraintPool = m_tmpSolverContactConstraintPool.size();
|
||||||
int numFrictionPool = m_tmpSolverContactFrictionConstraintPool.size();
|
int numFrictionPool = m_tmpSolverContactFrictionConstraintPool.size();
|
||||||
|
|
||||||
///@todo: use stack allocator for such temporarily memory, same for solver bodies/constraints
|
///@todo: use stack allocator for such temporarily memory, same for solver bodies/constraints
|
||||||
|
m_orderNonContactConstraintPool.resize(numNonContactPool);
|
||||||
m_orderTmpConstraintPool.resize(numConstraintPool);
|
m_orderTmpConstraintPool.resize(numConstraintPool);
|
||||||
m_orderFrictionConstraintPool.resize(numFrictionPool);
|
m_orderFrictionConstraintPool.resize(numFrictionPool);
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
for (i=0;i<numNonContactPool;i++)
|
||||||
|
{
|
||||||
|
m_orderNonContactConstraintPool[i] = i;
|
||||||
|
}
|
||||||
for (i=0;i<numConstraintPool;i++)
|
for (i=0;i<numConstraintPool;i++)
|
||||||
{
|
{
|
||||||
m_orderTmpConstraintPool[i] = i;
|
m_orderTmpConstraintPool[i] = i;
|
||||||
@@ -983,6 +988,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
|
|||||||
btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration, btCollisionObject** /*bodies */,int /*numBodies*/,btPersistentManifold** /*manifoldPtr*/, int /*numManifolds*/,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* /*debugDrawer*/,btStackAlloc* /*stackAlloc*/)
|
btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration, btCollisionObject** /*bodies */,int /*numBodies*/,btPersistentManifold** /*manifoldPtr*/, int /*numManifolds*/,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* /*debugDrawer*/,btStackAlloc* /*stackAlloc*/)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
int numNonContactPool = m_tmpSolverNonContactConstraintPool.size();
|
||||||
int numConstraintPool = m_tmpSolverContactConstraintPool.size();
|
int numConstraintPool = m_tmpSolverContactConstraintPool.size();
|
||||||
int numFrictionPool = m_tmpSolverContactFrictionConstraintPool.size();
|
int numFrictionPool = m_tmpSolverContactFrictionConstraintPool.size();
|
||||||
|
|
||||||
@@ -991,6 +997,13 @@ btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration
|
|||||||
if (infoGlobal.m_solverMode & SOLVER_RANDMIZE_ORDER)
|
if (infoGlobal.m_solverMode & SOLVER_RANDMIZE_ORDER)
|
||||||
{
|
{
|
||||||
if ((iteration & 7) == 0) {
|
if ((iteration & 7) == 0) {
|
||||||
|
for (j=0; j<numNonContactPool; ++j) {
|
||||||
|
int tmp = m_orderNonContactConstraintPool[j];
|
||||||
|
int swapi = btRandInt2(j+1);
|
||||||
|
m_orderNonContactConstraintPool[j] = m_orderNonContactConstraintPool[swapi];
|
||||||
|
m_orderNonContactConstraintPool[swapi] = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
for (j=0; j<numConstraintPool; ++j) {
|
for (j=0; j<numConstraintPool; ++j) {
|
||||||
int tmp = m_orderTmpConstraintPool[j];
|
int tmp = m_orderTmpConstraintPool[j];
|
||||||
int swapi = btRandInt2(j+1);
|
int swapi = btRandInt2(j+1);
|
||||||
@@ -1012,7 +1025,7 @@ btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration
|
|||||||
///solve all joint constraints, using SIMD, if available
|
///solve all joint constraints, using SIMD, if available
|
||||||
for (j=0;j<m_tmpSolverNonContactConstraintPool.size();j++)
|
for (j=0;j<m_tmpSolverNonContactConstraintPool.size();j++)
|
||||||
{
|
{
|
||||||
btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[j];
|
btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[m_orderNonContactConstraintPool[j]];
|
||||||
resolveSingleConstraintRowGenericSIMD(*constraint.m_solverBodyA,*constraint.m_solverBodyB,constraint);
|
resolveSingleConstraintRowGenericSIMD(*constraint.m_solverBodyA,*constraint.m_solverBodyB,constraint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1050,7 +1063,7 @@ btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration
|
|||||||
///solve all joint constraints
|
///solve all joint constraints
|
||||||
for (j=0;j<m_tmpSolverNonContactConstraintPool.size();j++)
|
for (j=0;j<m_tmpSolverNonContactConstraintPool.size();j++)
|
||||||
{
|
{
|
||||||
btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[j];
|
btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[m_orderNonContactConstraintPool[j]];
|
||||||
resolveSingleConstraintRowGeneric(*constraint.m_solverBodyA,*constraint.m_solverBodyB,constraint);
|
resolveSingleConstraintRowGeneric(*constraint.m_solverBodyA,*constraint.m_solverBodyB,constraint);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ protected:
|
|||||||
btConstraintArray m_tmpSolverNonContactConstraintPool;
|
btConstraintArray m_tmpSolverNonContactConstraintPool;
|
||||||
btConstraintArray m_tmpSolverContactFrictionConstraintPool;
|
btConstraintArray m_tmpSolverContactFrictionConstraintPool;
|
||||||
btAlignedObjectArray<int> m_orderTmpConstraintPool;
|
btAlignedObjectArray<int> m_orderTmpConstraintPool;
|
||||||
|
btAlignedObjectArray<int> m_orderNonContactConstraintPool;
|
||||||
btAlignedObjectArray<int> m_orderFrictionConstraintPool;
|
btAlignedObjectArray<int> m_orderFrictionConstraintPool;
|
||||||
btAlignedObjectArray<btTypedConstraint::btConstraintInfo1> m_tmpConstraintSizesPool;
|
btAlignedObjectArray<btTypedConstraint::btConstraintInfo1> m_tmpConstraintSizesPool;
|
||||||
|
|
||||||
|
|||||||
@@ -84,7 +84,6 @@ protected:
|
|||||||
///internal method used by the constraint solver, don't use them directly
|
///internal method used by the constraint solver, don't use them directly
|
||||||
btScalar getMotorFactor(btScalar pos, btScalar lowLim, btScalar uppLim, btScalar vel, btScalar timeFact);
|
btScalar getMotorFactor(btScalar pos, btScalar lowLim, btScalar uppLim, btScalar vel, btScalar timeFact);
|
||||||
|
|
||||||
static btRigidBody& getFixedBody();
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@@ -96,6 +95,8 @@ public:
|
|||||||
int m_numConstraintRows,nub;
|
int m_numConstraintRows,nub;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static btRigidBody& getFixedBody();
|
||||||
|
|
||||||
struct btConstraintInfo2 {
|
struct btConstraintInfo2 {
|
||||||
// integrator parameters: frames per second (1/stepsize), default error
|
// integrator parameters: frames per second (1/stepsize), default error
|
||||||
// reduction parameter (0..1).
|
// reduction parameter (0..1).
|
||||||
|
|||||||
Reference in New Issue
Block a user