Code: Select all
setTaskScheduler(SchedulerType::DEFAULT);
Code: Select all
btDefaultCollisionConstructionInfo cci;
cci.m_defaultMaxPersistentManifoldPoolSize = 80000;
cci.m_defaultMaxCollisionAlgorithmPoolSize = 80000;
mCollisionConfiguration = new btDefaultCollisionConfiguration(cci);
mDispatcher = new btCollisionDispatcherMt(mCollisionConfiguration, 40);
mBroadphase = new btDbvtBroadphase();
auto createSolver = [&]() -> btConstraintSolverPoolMt* {
SolverType tmpSolverType = mSolverType;
if (tmpSolverType == SolverType::SOLVER_TYPE_SEQUENTIAL_IMPULSE_MT) {
// pool solvers shouldn't be parallel solvers, we don't allow that kind of
// nested parallelism because of performance issues
//tmpSolverType = SolverType::SOLVER_TYPE_SEQUENTIAL_IMPULSE;
}
const int threadCount = 16;//BT_MAX_THREAD_COUNT
btConstraintSolver* solvers[threadCount];
for (int i = 0; i < threadCount ; ++i) {
solvers[i] = createSolverByType(tmpSolverType);
}
return new btConstraintSolverPoolMt(solvers, threadCount);
};
mSolver = createSolver();
if (mSolverType == SolverType::SOLVER_TYPE_SEQUENTIAL_IMPULSE_MT) {
mImpulseSolverMt = new btSequentialImpulseConstraintSolverMt();
mImpulseSolverMt->setRandSeed(seed);
mImpulseSolverMt->reset();
}
mDynamicsWorld = new btDiscreteDynamicsWorldMt(mDispatcher, mBroadphase, mSolver, mImpulseSolverMt, mCollisionConfiguration);
mDynamicsWorld->getSolverInfo().m_solverMode = SOLVER_SIMD | SOLVER_USE_WARMSTARTING ;
mDynamicsWorld->applyGravity();
mGhostPairCallback = new btGhostPairCallback();
mDynamicsWorld->getBroadphase()->getOverlappingPairCache()->setInternalGhostPairCallback(mGhostPairCallback);
mDynamicsWorld->getBroadphase()->resetPool(mDispatcher);