|
|
|
@ -66,41 +66,41 @@ void jmePhysicsSpace::stepSimulation(jfloat tpf, jint maxSteps, jfloat accuracy) |
|
|
|
|
dynamicsWorld->stepSimulation(tpf, maxSteps, accuracy); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
btThreadSupportInterface* jmePhysicsSpace::createSolverThreadSupport(int maxNumThreads) { |
|
|
|
|
#ifdef _WIN32 |
|
|
|
|
Win32ThreadSupport::Win32ThreadConstructionInfo threadConstructionInfo("solverThreads", SolverThreadFunc, SolverlsMemoryFunc, maxNumThreads); |
|
|
|
|
Win32ThreadSupport* threadSupport = new Win32ThreadSupport(threadConstructionInfo); |
|
|
|
|
threadSupport->startSPU(); |
|
|
|
|
#elif defined (USE_PTHREADS) |
|
|
|
|
PosixThreadSupport::ThreadConstructionInfo constructionInfo("collision", SolverThreadFunc, |
|
|
|
|
SolverlsMemoryFunc, maxNumThreads); |
|
|
|
|
PosixThreadSupport* threadSupport = new PosixThreadSupport(constructionInfo); |
|
|
|
|
threadSupport->startSPU(); |
|
|
|
|
#else |
|
|
|
|
SequentialThreadSupport::SequentialThreadConstructionInfo tci("solverThreads", SolverThreadFunc, SolverlsMemoryFunc); |
|
|
|
|
SequentialThreadSupport* threadSupport = new SequentialThreadSupport(tci); |
|
|
|
|
threadSupport->startSPU(); |
|
|
|
|
#endif |
|
|
|
|
return threadSupport; |
|
|
|
|
} |
|
|
|
|
// btThreadSupportInterface* jmePhysicsSpace::createSolverThreadSupport(int maxNumThreads) {
|
|
|
|
|
// #ifdef _WIN32
|
|
|
|
|
// Win32ThreadSupport::Win32ThreadConstructionInfo threadConstructionInfo("solverThreads", SolverThreadFunc, SolverlsMemoryFunc, maxNumThreads);
|
|
|
|
|
// Win32ThreadSupport* threadSupport = new Win32ThreadSupport(threadConstructionInfo);
|
|
|
|
|
// threadSupport->startSPU();
|
|
|
|
|
// #elif defined (USE_PTHREADS)
|
|
|
|
|
// PosixThreadSupport::ThreadConstructionInfo constructionInfo("collision", SolverThreadFunc,
|
|
|
|
|
// SolverlsMemoryFunc, maxNumThreads);
|
|
|
|
|
// PosixThreadSupport* threadSupport = new PosixThreadSupport(constructionInfo);
|
|
|
|
|
// threadSupport->startSPU();
|
|
|
|
|
// #else
|
|
|
|
|
// SequentialThreadSupport::SequentialThreadConstructionInfo tci("solverThreads", SolverThreadFunc, SolverlsMemoryFunc);
|
|
|
|
|
// SequentialThreadSupport* threadSupport = new SequentialThreadSupport(tci);
|
|
|
|
|
// threadSupport->startSPU();
|
|
|
|
|
// #endif
|
|
|
|
|
// return threadSupport;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
btThreadSupportInterface* jmePhysicsSpace::createDispatchThreadSupport(int maxNumThreads) { |
|
|
|
|
#ifdef _WIN32 |
|
|
|
|
Win32ThreadSupport::Win32ThreadConstructionInfo threadConstructionInfo("solverThreads", processCollisionTask, createCollisionLocalStoreMemory, maxNumThreads); |
|
|
|
|
Win32ThreadSupport* threadSupport = new Win32ThreadSupport(threadConstructionInfo); |
|
|
|
|
threadSupport->startSPU(); |
|
|
|
|
#elif defined (USE_PTHREADS) |
|
|
|
|
PosixThreadSupport::ThreadConstructionInfo solverConstructionInfo("solver", processCollisionTask, |
|
|
|
|
createCollisionLocalStoreMemory, maxNumThreads); |
|
|
|
|
PosixThreadSupport* threadSupport = new PosixThreadSupport(solverConstructionInfo); |
|
|
|
|
threadSupport->startSPU(); |
|
|
|
|
#else |
|
|
|
|
SequentialThreadSupport::SequentialThreadConstructionInfo tci("solverThreads", processCollisionTask, createCollisionLocalStoreMemory); |
|
|
|
|
SequentialThreadSupport* threadSupport = new SequentialThreadSupport(tci); |
|
|
|
|
threadSupport->startSPU(); |
|
|
|
|
#endif |
|
|
|
|
return threadSupport; |
|
|
|
|
} |
|
|
|
|
// btThreadSupportInterface* jmePhysicsSpace::createDispatchThreadSupport(int maxNumThreads) {
|
|
|
|
|
// #ifdef _WIN32
|
|
|
|
|
// Win32ThreadSupport::Win32ThreadConstructionInfo threadConstructionInfo("solverThreads", processCollisionTask, createCollisionLocalStoreMemory, maxNumThreads);
|
|
|
|
|
// Win32ThreadSupport* threadSupport = new Win32ThreadSupport(threadConstructionInfo);
|
|
|
|
|
// threadSupport->startSPU();
|
|
|
|
|
// #elif defined (USE_PTHREADS)
|
|
|
|
|
// PosixThreadSupport::ThreadConstructionInfo solverConstructionInfo("solver", processCollisionTask,
|
|
|
|
|
// createCollisionLocalStoreMemory, maxNumThreads);
|
|
|
|
|
// PosixThreadSupport* threadSupport = new PosixThreadSupport(solverConstructionInfo);
|
|
|
|
|
// threadSupport->startSPU();
|
|
|
|
|
// #else
|
|
|
|
|
// SequentialThreadSupport::SequentialThreadConstructionInfo tci("solverThreads", processCollisionTask, createCollisionLocalStoreMemory);
|
|
|
|
|
// SequentialThreadSupport* threadSupport = new SequentialThreadSupport(tci);
|
|
|
|
|
// threadSupport->startSPU();
|
|
|
|
|
// #endif
|
|
|
|
|
// return threadSupport;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
void jmePhysicsSpace::createPhysicsSpace(jfloat minX, jfloat minY, jfloat minZ, jfloat maxX, jfloat maxY, jfloat maxZ, jint broadphaseId, jboolean threading) { |
|
|
|
|
// collision configuration contains default setup for memory, collision setup
|
|
|
|
@ -140,23 +140,23 @@ void jmePhysicsSpace::createPhysicsSpace(jfloat minX, jfloat minY, jfloat minZ, |
|
|
|
|
btCollisionDispatcher* dispatcher; |
|
|
|
|
btConstraintSolver* solver; |
|
|
|
|
// use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded)
|
|
|
|
|
if (threading) { |
|
|
|
|
btThreadSupportInterface* dispatchThreads = createDispatchThreadSupport(4); |
|
|
|
|
dispatcher = new SpuGatheringCollisionDispatcher(dispatchThreads, 4, collisionConfiguration); |
|
|
|
|
dispatcher->setDispatcherFlags(btCollisionDispatcher::CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION); |
|
|
|
|
} else { |
|
|
|
|
// if (threading) {
|
|
|
|
|
// btThreadSupportInterface* dispatchThreads = createDispatchThreadSupport(4);
|
|
|
|
|
// dispatcher = new SpuGatheringCollisionDispatcher(dispatchThreads, 4, collisionConfiguration);
|
|
|
|
|
// dispatcher->setDispatcherFlags(btCollisionDispatcher::CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION);
|
|
|
|
|
// } else {
|
|
|
|
|
dispatcher = new btCollisionDispatcher(collisionConfiguration); |
|
|
|
|
} |
|
|
|
|
// }
|
|
|
|
|
btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded)
|
|
|
|
|
if (threading) { |
|
|
|
|
btThreadSupportInterface* solverThreads = createSolverThreadSupport(4); |
|
|
|
|
solver = new btParallelConstraintSolver(solverThreads); |
|
|
|
|
} else { |
|
|
|
|
// if (threading) {
|
|
|
|
|
// btThreadSupportInterface* solverThreads = createSolverThreadSupport(4);
|
|
|
|
|
// solver = new btParallelConstraintSolver(solverThreads);
|
|
|
|
|
// } else {
|
|
|
|
|
solver = new btSequentialImpulseConstraintSolver; |
|
|
|
|
} |
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
//create dynamics world
|
|
|
|
|
btDiscreteDynamicsWorld* world = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration); |
|
|
|
@ -164,12 +164,12 @@ void jmePhysicsSpace::createPhysicsSpace(jfloat minX, jfloat minY, jfloat minZ, |
|
|
|
|
dynamicsWorld->setWorldUserInfo(this); |
|
|
|
|
|
|
|
|
|
//parallel solver requires the contacts to be in a contiguous pool, so avoid dynamic allocation
|
|
|
|
|
if (threading) { |
|
|
|
|
world->getSimulationIslandManager()->setSplitIslands(false); |
|
|
|
|
world->getSolverInfo().m_numIterations = 4; |
|
|
|
|
world->getSolverInfo().m_solverMode = SOLVER_SIMD + SOLVER_USE_WARMSTARTING; //+SOLVER_RANDMIZE_ORDER;
|
|
|
|
|
world->getDispatchInfo().m_enableSPU = true; |
|
|
|
|
} |
|
|
|
|
// if (threading) {
|
|
|
|
|
// world->getSimulationIslandManager()->setSplitIslands(false);
|
|
|
|
|
// world->getSolverInfo().m_numIterations = 4;
|
|
|
|
|
// world->getSolverInfo().m_solverMode = SOLVER_SIMD + SOLVER_USE_WARMSTARTING; //+SOLVER_RANDMIZE_ORDER;
|
|
|
|
|
// world->getDispatchInfo().m_enableSPU = true;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback()); |
|
|
|
|
|
|
|
|
|