diff --git a/Demos/BasicDemo/BasicDemo.cpp b/Demos/BasicDemo/BasicDemo.cpp index 49acc20ce..0baa1b59e 100644 --- a/Demos/BasicDemo/BasicDemo.cpp +++ b/Demos/BasicDemo/BasicDemo.cpp @@ -34,10 +34,14 @@ GLDebugDrawer debugDrawer; int main(int argc,char** argv) { - BasicDemo* ccdDemo = new BasicDemo(); - ccdDemo->initPhysics(); - ccdDemo->setCameraDistance(50.f); - return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bullet.sf.net",ccdDemo); + BasicDemo ccdDemo; + ccdDemo.initPhysics(); + ccdDemo.setCameraDistance(50.f); + ccdDemo.exitPhysics(); + + //return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bullet.sf.net",&ccdDemo); + return 0; + } @@ -74,7 +78,8 @@ void BasicDemo::displayCallback(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - m_dynamicsWorld->updateAabbs(); + if (m_dynamicsWorld) + m_dynamicsWorld->updateAabbs(); renderme(); @@ -95,27 +100,31 @@ void BasicDemo::clientResetScene() void BasicDemo::initPhysics() { - btCollisionDispatcher* dispatcher = new btCollisionDispatcher(true); + + m_dispatcher = new btCollisionDispatcher(true); #ifdef USE_SWEEP_AND_PRUNE btVector3 worldAabbMin(-10000,-10000,-10000); btVector3 worldAabbMax(10000,10000,10000); - btOverlappingPairCache* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); + m_overlappingPairCache = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); #else - btOverlappingPairCache* broadphase = new btSimpleBroadphase; + m_overlappingPairCache = new btSimpleBroadphase; #endif //USE_SWEEP_AND_PRUNE - - dispatcher->registerCollisionCreateFunc(SPHERE_SHAPE_PROXYTYPE,SPHERE_SHAPE_PROXYTYPE,new btSphereSphereCollisionAlgorithm::CreateFunc); + + m_sphereSphereCF = new btSphereSphereCollisionAlgorithm::CreateFunc; + m_dispatcher->registerCollisionCreateFunc(SPHERE_SHAPE_PROXYTYPE,SPHERE_SHAPE_PROXYTYPE,m_sphereSphereCF); + #ifdef USE_GROUND_BOX - dispatcher->registerCollisionCreateFunc(SPHERE_SHAPE_PROXYTYPE,BOX_SHAPE_PROXYTYPE,new btSphereBoxCollisionAlgorithm::CreateFunc); - btCollisionAlgorithmCreateFunc* swappedSphereBox = new btSphereBoxCollisionAlgorithm::CreateFunc; - swappedSphereBox->m_swapped = true; - dispatcher->registerCollisionCreateFunc(BOX_SHAPE_PROXYTYPE,SPHERE_SHAPE_PROXYTYPE,swappedSphereBox); + m_sphereBoxCF = new btSphereBoxCollisionAlgorithm::CreateFunc; + m_boxSphereCF = new btSphereBoxCollisionAlgorithm::CreateFunc; + m_boxSphereCF->m_swapped = true; + m_dispatcher->registerCollisionCreateFunc(SPHERE_SHAPE_PROXYTYPE,BOX_SHAPE_PROXYTYPE,m_sphereBoxCF); + m_dispatcher->registerCollisionCreateFunc(BOX_SHAPE_PROXYTYPE,SPHERE_SHAPE_PROXYTYPE,m_boxSphereCF); #endif //USE_GROUND_BOX - btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver; + m_solver = new btSequentialImpulseConstraintSolver; - m_dynamicsWorld = new btSimpleDynamicsWorld(dispatcher,broadphase,solver); + m_dynamicsWorld = new btSimpleDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_solver); m_dynamicsWorld->setGravity(btVector3(0,-10,0)); m_dynamicsWorld->setDebugDrawer(&debugDrawer); @@ -130,6 +139,8 @@ void BasicDemo::initPhysics() btCollisionShape* groundShape = new btSphereShape(50.f); #endif//USE_GROUND_BOX + m_collisionShapes.push_back(groundShape); + btTransform groundTransform; groundTransform.setIdentity(); groundTransform.setOrigin(btVector3(0,-50,0)); @@ -137,6 +148,8 @@ void BasicDemo::initPhysics() //create a few dynamic sphere rigidbodies (re-using the same sphere shape) btCollisionShape* sphereShape = new btSphereShape(1.f); + m_collisionShapes.push_back(sphereShape); + int i; for (i=0;igetNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (i=0;i + +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; + ///BasicDemo is good starting point for learning the code base and porting. class BasicDemo : public DemoApplication { + + //keep the collision shapes, for deletion/cleanup + std::vector m_collisionShapes; + + btOverlappingPairCache* m_overlappingPairCache; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btCollisionAlgorithmCreateFunc* m_sphereSphereCF; + btCollisionAlgorithmCreateFunc* m_sphereBoxCF; + btCollisionAlgorithmCreateFunc* m_boxSphereCF; + public: void initPhysics(); + void exitPhysics(); + virtual void clientMoveAndDisplay(); virtual void displayCallback(); diff --git a/src/LinearMath/btScalar.h b/src/LinearMath/btScalar.h index 02b346bbe..dea040a80 100644 --- a/src/LinearMath/btScalar.h +++ b/src/LinearMath/btScalar.h @@ -30,6 +30,7 @@ subject to the following restrictions: #else #pragma warning(disable:4530) #pragma warning(disable:4996) + #pragma warning(disable:4786) #define SIMD_FORCE_INLINE __forceinline #endif //__MINGW32__