Added sample code to enable parallel (multi threaded) dispatcher (disabled by default, see #define USE_PARALLEL_DISPATCHER)

This commit is contained in:
ejcoumans
2007-06-13 05:12:01 +00:00
parent d2aa366226
commit a608d1ad47

View File

@@ -17,6 +17,8 @@ subject to the following restrictions:
//#define USE_GROUND_BOX 1 //#define USE_GROUND_BOX 1
//#define PRINT_CONTACT_STATISTICS 1 //#define PRINT_CONTACT_STATISTICS 1
//#define CHECK_MEMORY_LEAKS 1 //#define CHECK_MEMORY_LEAKS 1
//#define USE_PARALLEL_DISPATCHER 1
int gNumObjects = 120; int gNumObjects = 120;
#define HALF_EXTENTS btScalar(1.) #define HALF_EXTENTS btScalar(1.)
@@ -30,6 +32,11 @@ btScalar gCollisionMargin = btScalar(0.05);
#include "GL_ShapeDrawer.h" #include "GL_ShapeDrawer.h"
#include "GlutStuff.h" #include "GlutStuff.h"
#ifdef USE_PARALLEL_DISPATCHER
#include "SpuGatheringCollisionDispatcher.h"
#endif//USE_PARALLEL_DISPATCHER
#include <LinearMath/btAlignedObjectArray.h> #include <LinearMath/btAlignedObjectArray.h>
//////////////////////////////////// ////////////////////////////////////
@@ -115,8 +122,12 @@ void BasicDemo::displayCallback(void) {
void BasicDemo::initPhysics() void BasicDemo::initPhysics()
{ {
#ifdef USE_PARALLEL_DISPATCHER
m_dispatcher = new SpuGatheringCollisionDispatcher();
#else
m_dispatcher = new btCollisionDispatcher(true); m_dispatcher = new btCollisionDispatcher(true);
#endif //USE_PARALLEL_DISPATCHER
//#define USE_SWEEP_AND_PRUNE 1 //#define USE_SWEEP_AND_PRUNE 1
#ifdef USE_SWEEP_AND_PRUNE #ifdef USE_SWEEP_AND_PRUNE
#define maxProxies 8192 #define maxProxies 8192
@@ -127,6 +138,7 @@ void BasicDemo::initPhysics()
m_overlappingPairCache = new btSimpleBroadphase; m_overlappingPairCache = new btSimpleBroadphase;
#endif //USE_SWEEP_AND_PRUNE #endif //USE_SWEEP_AND_PRUNE
#ifndef USE_PARALLEL_DISPATCHER
m_sphereSphereCF = new btSphereSphereCollisionAlgorithm::CreateFunc; m_sphereSphereCF = new btSphereSphereCollisionAlgorithm::CreateFunc;
m_dispatcher->registerCollisionCreateFunc(SPHERE_SHAPE_PROXYTYPE,SPHERE_SHAPE_PROXYTYPE,m_sphereSphereCF); m_dispatcher->registerCollisionCreateFunc(SPHERE_SHAPE_PROXYTYPE,SPHERE_SHAPE_PROXYTYPE,m_sphereSphereCF);
@@ -136,12 +148,15 @@ void BasicDemo::initPhysics()
m_boxSphereCF->m_swapped = true; m_boxSphereCF->m_swapped = true;
m_dispatcher->registerCollisionCreateFunc(SPHERE_SHAPE_PROXYTYPE,BOX_SHAPE_PROXYTYPE,m_sphereBoxCF); m_dispatcher->registerCollisionCreateFunc(SPHERE_SHAPE_PROXYTYPE,BOX_SHAPE_PROXYTYPE,m_sphereBoxCF);
m_dispatcher->registerCollisionCreateFunc(BOX_SHAPE_PROXYTYPE,SPHERE_SHAPE_PROXYTYPE,m_boxSphereCF); m_dispatcher->registerCollisionCreateFunc(BOX_SHAPE_PROXYTYPE,SPHERE_SHAPE_PROXYTYPE,m_boxSphereCF);
#endif //USE_PARALLEL_DISPATCHER
m_solver = new btSequentialImpulseConstraintSolver; m_solver = new btSequentialImpulseConstraintSolver;
//m_dynamicsWorld = new btSimpleDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_solver); //m_dynamicsWorld = new btSimpleDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_solver);
m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_solver); m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_solver);
m_dynamicsWorld->getDispatchInfo().m_enableSPU = true;
m_dynamicsWorld->setGravity(btVector3(0,-10,0)); m_dynamicsWorld->setGravity(btVector3(0,-10,0));
m_dynamicsWorld->setDebugDrawer(&debugDrawer); m_dynamicsWorld->setDebugDrawer(&debugDrawer);
@@ -164,6 +179,7 @@ void BasicDemo::initPhysics()
localCreateRigidBody(btScalar(0.),groundTransform,groundShape); localCreateRigidBody(btScalar(0.),groundTransform,groundShape);
//create a few dynamic sphere rigidbodies (re-using the same sphere shape) //create a few dynamic sphere rigidbodies (re-using the same sphere shape)
//btCollisionShape* sphereShape = new btBoxShape(btVector3(1,1,1));
btCollisionShape* sphereShape = new btSphereShape(btScalar(1.)); btCollisionShape* sphereShape = new btSphereShape(btScalar(1.));
m_collisionShapes.push_back(sphereShape); m_collisionShapes.push_back(sphereShape);