|
|
|
@ -31,7 +31,6 @@ |
|
|
|
|
*/ |
|
|
|
|
#include "jmePhysicsSpace.h" |
|
|
|
|
#include "jmeBulletUtil.h" |
|
|
|
|
#include <stdio.h> |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Author: Normen Hansen |
|
|
|
@ -66,49 +65,8 @@ 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::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
|
|
|
|
|
btDefaultCollisionConstructionInfo cci; |
|
|
|
|
// if(threading){
|
|
|
|
|
// cci.m_defaultMaxPersistentManifoldPoolSize = 32768;
|
|
|
|
|
// }
|
|
|
|
|
btCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(cci); |
|
|
|
|
void jmePhysicsSpace::createPhysicsSpace(jfloat minX, jfloat minY, jfloat minZ, jfloat maxX, jfloat maxY, jfloat maxZ, jint broadphaseId, jboolean threading /*unused*/) { |
|
|
|
|
btCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); |
|
|
|
|
|
|
|
|
|
btVector3 min = btVector3(minX, minY, minZ); |
|
|
|
|
btVector3 max = btVector3(maxX, maxY, maxZ); |
|
|
|
@ -129,50 +87,19 @@ void jmePhysicsSpace::createPhysicsSpace(jfloat minX, jfloat minY, jfloat minZ, |
|
|
|
|
case 3: |
|
|
|
|
broadphase = new btDbvtBroadphase(); |
|
|
|
|
break; |
|
|
|
|
case 4: |
|
|
|
|
// broadphase = new btGpu3DGridBroadphase(
|
|
|
|
|
// min, max,
|
|
|
|
|
// 20, 20, 20,
|
|
|
|
|
// 10000, 1000, 25);
|
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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 { |
|
|
|
|
dispatcher = new btCollisionDispatcher(collisionConfiguration); |
|
|
|
|
} |
|
|
|
|
btCollisionDispatcher* 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 { |
|
|
|
|
solver = new btSequentialImpulseConstraintSolver; |
|
|
|
|
} |
|
|
|
|
btConstraintSolver* solver = new btSequentialImpulseConstraintSolver(); |
|
|
|
|
|
|
|
|
|
//create dynamics world
|
|
|
|
|
btDiscreteDynamicsWorld* world = new btDiscreteDynamicsWorld(dispatcher, broadphase, solver, collisionConfiguration); |
|
|
|
|
dynamicsWorld = world; |
|
|
|
|
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; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
broadphase->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback()); |
|
|
|
|
|
|
|
|
|
dynamicsWorld->setGravity(btVector3(0, -9.81f, 0)); |
|
|
|
|
|
|
|
|
|
struct jmeFilterCallback : public btOverlapFilterCallback { |
|
|
|
|