diff --git a/Demos/AllBulletDemos/Main.cpp b/Demos/AllBulletDemos/Main.cpp index e3a7253f5..f54d0bef1 100644 --- a/Demos/AllBulletDemos/Main.cpp +++ b/Demos/AllBulletDemos/Main.cpp @@ -50,7 +50,7 @@ namespace float viewY = 0.0f; int tx, ty, tw, th; int gDrawAabb=0; - int gDebugDraw=0; + int gWireFrame=0; int gDebugContacts=0; int gDebugNoDeactivation = 0; } @@ -120,7 +120,7 @@ void SimulationLoop() { demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawAabb)); } - if (gDebugDraw) + if (gWireFrame) { demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawWireframe); } else @@ -284,7 +284,7 @@ int main(int argc, char** argv) GLUI_Panel* drawPanel = glui->add_panel("Draw"); glui->add_checkbox_to_panel(drawPanel, "AABBs", &gDrawAabb); - glui->add_checkbox_to_panel(drawPanel, "DebugDrawer", &gDebugDraw); + glui->add_checkbox_to_panel(drawPanel, "Wireframe", &gWireFrame); glui->add_checkbox_to_panel(drawPanel, "Contacts", &gDebugContacts); // glui->add_checkbox_to_panel(drawPanel, "Impulses", &settings.drawImpulses); diff --git a/Demos/Benchmarks/BenchmarkDemo.cpp b/Demos/Benchmarks/BenchmarkDemo.cpp index 1841ccb88..7bb6eb1d2 100644 --- a/Demos/Benchmarks/BenchmarkDemo.cpp +++ b/Demos/Benchmarks/BenchmarkDemo.cpp @@ -274,7 +274,6 @@ void BenchmarkDemo::initPhysics() btVector3 worldAabbMax(10000,10000,10000); m_overlappingPairCache = new btAxisSweep3(worldAabbMin,worldAabbMax,3500); //m_overlappingPairCache = new btDbvtBroadphase(); - ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; diff --git a/Demos/BspDemo/BspDemo.cpp b/Demos/BspDemo/BspDemo.cpp index 4ea66cd21..f20e3aae0 100644 --- a/Demos/BspDemo/BspDemo.cpp +++ b/Demos/BspDemo/BspDemo.cpp @@ -147,7 +147,8 @@ void BspDemo::initPhysics(char* bspfilename) m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); btVector3 worldMin(-1000,-1000,-1000); btVector3 worldMax(1000,1000,1000); - m_broadphase = new btAxisSweep3(worldMin,worldMax); + m_broadphase = new btDbvtBroadphase(); + //m_broadphase = new btAxisSweep3(worldMin,worldMax); //btOverlappingPairCache* broadphase = new btSimpleBroadphase(); m_solver = new btSequentialImpulseConstraintSolver(); //ConstraintSolver* solver = new OdeConstraintSolver; @@ -235,6 +236,9 @@ void BspDemo::displayCallback(void) { renderme(); + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); glFlush(); glutSwapBuffers(); diff --git a/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp b/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp index d275a1d0f..6ffacea4a 100644 --- a/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp +++ b/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp @@ -240,7 +240,7 @@ void CcdPhysicsDemo::clientMoveAndDisplay() //optional but useful: debug drawing m_dynamicsWorld->debugDrawWorld(); - + #ifdef VERBOSE_TIMESTEPPING_CONSOLEOUTPUT if (!numSimSteps) printf("Interpolated transforms\n"); @@ -295,9 +295,12 @@ void CcdPhysicsDemo::displayCallback(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - renderme(); + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + glFlush(); glutSwapBuffers(); } diff --git a/Demos/CharacterDemo/CharacterDemo.cpp b/Demos/CharacterDemo/CharacterDemo.cpp index 4420a4686..c852d4ba1 100644 --- a/Demos/CharacterDemo/CharacterDemo.cpp +++ b/Demos/CharacterDemo/CharacterDemo.cpp @@ -1,528 +1,629 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - -/// September 2006: CharacterDemo is work in progress, this file is mostly just a placeholder -/// This CharacterDemo file is very early in development, please check it later -/// One todo is a basic engine model: -/// A function that maps user input (throttle) into torque/force applied on the wheels -/// with gears etc. -#include "btBulletDynamicsCommon.h" -#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" - -#include "GLDebugDrawer.h" -#include //printf debugging - -#include "GL_ShapeDrawer.h" - -#include "GlutStuff.h" -#include "CharacterDemo.h" -#include "CharacterController.h" - -const int maxProxies = 32766; -const int maxOverlap = 65535; - -static int gForward = 0; -static int gBackward = 0; -static int gLeft = 0; -static int gRight = 0; -static int gJump = 0; - -CharacterDemo::CharacterDemo() -: -m_cameraHeight(4.f), -m_minCameraDistance(3.f), -m_maxCameraDistance(10.f), -m_indexVertexArrays(0), -m_vertices(0) -{ - m_character = 0; - m_cameraPosition = btVector3(30,30,30); -} - -CharacterDemo::~CharacterDemo() -{ - //cleanup in the reverse order of creation/initialization - if (m_character) - m_character->destroy (m_dynamicsWorld); - - //remove the rigidbodies from the dynamics world and delete them - int i; - for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) - { - btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; - btRigidBody* body = btRigidBody::upcast(obj); - if (body && body->getMotionState()) - { - delete body->getMotionState(); - } - m_dynamicsWorld->removeCollisionObject( obj ); - delete obj; - } - - //delete collision shapes - for (int j=0;jsetGravity(btVector3(0,0,0)); - btTransform tr; - tr.setIdentity(); - -//either use heightfield or triangle mesh -#define USE_TRIMESH_GROUND 1 -#ifdef USE_TRIMESH_GROUND - int i; - -const float TRIANGLE_SIZE=20.f; - - //create a triangle-mesh ground - int vertStride = sizeof(btVector3); - int indexStride = 3*sizeof(int); - - const int NUM_VERTS_X = 20; - const int NUM_VERTS_Y = 20; - const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; - - const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); - - m_vertices = new btVector3[totalVerts]; - int* gIndices = new int[totalTriangles*3]; - - - - for ( i=0;isetUseDiamondSubdivision(true); - - btVector3 localScaling(20,20,20); - localScaling[upIndex]=1.f; - groundShape->setLocalScaling(localScaling); - - tr.setOrigin(btVector3(0,-64.5f,0)); - -#endif // - - m_collisionShapes.push_back(groundShape); - //create ground object - localCreateRigidBody(0,tr,groundShape); - - m_character = new CharacterController (); - m_character->setup (m_dynamicsWorld); - -#define CUBE_HALF_EXTENTS 0.5 -#define EXTRA_HEIGHT 10.0 - btBoxShape* boxShape = new btBoxShape (btVector3(1.0, 1.0, 1.0)); - m_collisionShapes.push_back (boxShape); -#define DO_WALL -#ifdef DO_WALL - for (i=0;i<50;i++) - { - btCollisionShape* shape = boxShape; - //shape->setMargin(gCollisionMargin); - - bool isDyna = i>0; - - btTransform trans; - trans.setIdentity(); - - if (i>0) - { - //stack them - int colsize = 10; - int row = (i*CUBE_HALF_EXTENTS*2)/(colsize*2*CUBE_HALF_EXTENTS); - int row2 = row; - int col = (i)%(colsize)-colsize/2; - - - if (col>3) - { - col=11; - row2 |=1; - } - - btVector3 pos(col*2*CUBE_HALF_EXTENTS + (row2%2)*CUBE_HALF_EXTENTS, - row*2*CUBE_HALF_EXTENTS+CUBE_HALF_EXTENTS+EXTRA_HEIGHT,0); - - trans.setOrigin(pos); - } else - { - trans.setOrigin(btVector3(0,EXTRA_HEIGHT-CUBE_HALF_EXTENTS,0)); - } - - float mass = 1.f; - - if (!isDyna) - mass = 0.f; - - btRigidBody* body = localCreateRigidBody(mass,trans,shape); -#ifdef USE_KINEMATIC_GROUND - if (mass == 0.f) - { - body->setCollisionFlags( body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); - body->setActivationState(DISABLE_DEACTIVATION); - } -#endif //USE_KINEMATIC_GROUND - - } -#endif - - clientResetScene(); - - setCameraDistance(26.f); - -} - - -//to be implemented by the demo -void CharacterDemo::renderme() -{ - updateCamera(); - - DemoApplication::renderme(); -} - -void CharacterDemo::clientMoveAndDisplay() -{ - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - float dt = getDeltaTimeMicroseconds() * 0.000001f; - - /* Character stuff &*/ - if (m_character) - { - m_character->preStep (m_dynamicsWorld); - m_character->playerStep (dt, gForward, gBackward, gLeft, gRight); - if (gJump) - { - gJump = 0; - m_character->jump (); - } - } - - if (m_dynamicsWorld) - { - //during idle mode, just run 1 simulation step maximum - int maxSimSubSteps = m_idle ? 1 : 2; - if (m_idle) - dt = 1.0/420.f; - - int numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - - -//#define VERBOSE_FEEDBACK -#ifdef VERBOSE_FEEDBACK - if (!numSimSteps) - printf("Interpolated transforms\n"); - else - { - if (numSimSteps > maxSimSubSteps) - { - //detect dropping frames - printf("Dropped (%i) simulation steps out of %i\n",numSimSteps - maxSimSubSteps,numSimSteps); - } else - { - printf("Simulated (%i) steps\n",numSimSteps); - } - } -#endif //VERBOSE_FEEDBACK - - } - - - - - - - -#ifdef USE_QUICKPROF - btProfiler::beginBlock("render"); -#endif //USE_QUICKPROF - - - renderme(); - -#ifdef USE_QUICKPROF - btProfiler::endBlock("render"); -#endif - - - glFlush(); - glutSwapBuffers(); - -} - - - -void CharacterDemo::displayCallback(void) -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - renderme(); - - - glFlush(); - glutSwapBuffers(); -} - - - -void CharacterDemo::clientResetScene() -{ - m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(m_character->getRigidBody()->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); - - btTransform startTransform; - startTransform.setIdentity (); - startTransform.setOrigin (btVector3(0.0, 2.0, 0.0)); - - m_character->getRigidBody()->getMotionState()->setWorldTransform(startTransform); - m_character->getRigidBody()->setLinearVelocity(btVector3(0,0,0)); - m_character->getRigidBody()->setAngularVelocity(btVector3(0,0,0)); - -} - -void CharacterDemo::specialKeyboardUp(int key, int x, int y) -{ - switch (key) - { - case GLUT_KEY_UP: - { - gForward = 0; - } - break; - case GLUT_KEY_DOWN: - { - gBackward = 0; - } - break; - case GLUT_KEY_LEFT: - { - gLeft = 0; - } - break; - case GLUT_KEY_RIGHT: - { - gRight = 0; - } - break; - default: - DemoApplication::specialKeyboardUp(key,x,y); - break; - } -} - - -void CharacterDemo::specialKeyboard(int key, int x, int y) -{ - -// printf("key = %i x=%i y=%i\n",key,x,y); - - switch (key) - { - case GLUT_KEY_UP: - { - gForward = 1; - } - break; - case GLUT_KEY_DOWN: - { - gBackward = 1; - } - break; - case GLUT_KEY_LEFT: - { - gLeft = 1; - } - break; - case GLUT_KEY_RIGHT: - { - gRight = 1; - } - break; - case GLUT_KEY_F1: - { - if (m_character && m_character->canJump()) - gJump = 1; - } - break; - default: - DemoApplication::specialKeyboard(key,x,y); - break; - } - -// glutPostRedisplay(); - - -} - -void CharacterDemo::updateCamera() -{ - -//#define DISABLE_CAMERA 1 -#ifdef DISABLE_CAMERA - DemoApplication::updateCamera(); - return; -#endif //DISABLE_CAMERA - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - btTransform characterWorldTrans; - - //look at the vehicle - m_character->getRigidBody()->getMotionState()->getWorldTransform(characterWorldTrans); - btVector3 up = characterWorldTrans.getBasis()[1]; - btVector3 backward = -characterWorldTrans.getBasis()[2]; - up.normalize (); - backward.normalize (); - - m_cameraTargetPosition = characterWorldTrans.getOrigin(); - m_cameraPosition = m_cameraTargetPosition + up * 5.0 + backward * 5.0; - - //update OpenGL camera settings - glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10000.0); - - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - gluLookAt(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2], - m_cameraTargetPosition[0],m_cameraTargetPosition[1], m_cameraTargetPosition[2], - m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); - - - -} - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/// September 2006: CharacterDemo is work in progress, this file is mostly just a placeholder +/// This CharacterDemo file is very early in development, please check it later +/// One todo is a basic engine model: +/// A function that maps user input (throttle) into torque/force applied on the wheels +/// with gears etc. +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" + +#include "GLDebugDrawer.h" +#include //printf debugging + +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" +#include "CharacterDemo.h" +#include "CharacterController.h" + +const int maxProxies = 32766; +const int maxOverlap = 65535; + +static int gForward = 0; +static int gBackward = 0; +static int gLeft = 0; +static int gRight = 0; +static int gJump = 0; + +CharacterDemo::CharacterDemo() +: +m_cameraHeight(4.f), +m_minCameraDistance(3.f), +m_maxCameraDistance(10.f), +m_indexVertexArrays(0), +m_vertices(0) +{ + m_character = 0; + m_cameraPosition = btVector3(30,30,30); +} + +CharacterDemo::~CharacterDemo() +{ + //cleanup in the reverse order of creation/initialization + if (m_character) + m_character->destroy (m_dynamicsWorld); + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;jm_clientObject==m_characterCollider || proxy1->m_clientObject==m_characterCollider) + { + printf("addOverlappingPair (%x,%x)\n",proxy0,proxy1); + return m_hashPairCache->addOverlappingPair(proxy0,proxy1); + } + return 0; + } + + virtual void* removeOverlappingPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1,btDispatcher* dispatcher) + { + if (proxy0->m_clientObject==m_characterCollider || proxy1->m_clientObject==m_characterCollider) + { + printf("removeOverlappingPair (%x,%x)\n",proxy0,proxy1); + return m_hashPairCache->removeOverlappingPair(proxy0,proxy1,dispatcher); + } + return 0; + } + + virtual void removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy0,btDispatcher* dispatcher) + { + if (proxy0->m_clientObject==m_characterCollider) + { + printf("removeOverlappingPairsContainingProxy (%x)\n",proxy0); + m_hashPairCache->removeOverlappingPairsContainingProxy(proxy0,dispatcher); + } + } + + btBroadphasePairArray& getOverlappingPairArray() + { + return m_hashPairCache->getOverlappingPairArray(); + } + +}; + +void CharacterDemo::initPhysics() +{ + + btCollisionShape* groundShape = new btBoxShape(btVector3(50,3,50)); + m_collisionShapes.push_back(groundShape); + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + btAxisSweep3* sweepBP = new btAxisSweep3(worldMin,worldMax); + m_overlappingPairCache = sweepBP; + + m_constraintSolver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); + //m_dynamicsWorld->setGravity(btVector3(0,0,0)); + btTransform tr; + tr.setIdentity(); + +//either use heightfield or triangle mesh +#define USE_TRIMESH_GROUND 1 +#ifdef USE_TRIMESH_GROUND + int i; + +const float TRIANGLE_SIZE=20.f; + + //create a triangle-mesh ground + int vertStride = sizeof(btVector3); + int indexStride = 3*sizeof(int); + + const int NUM_VERTS_X = 20; + const int NUM_VERTS_Y = 20; + const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + + const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); + + m_vertices = new btVector3[totalVerts]; + int* gIndices = new int[totalTriangles*3]; + + + + for ( i=0;isetUseDiamondSubdivision(true); + + btVector3 localScaling(20,20,20); + localScaling[upIndex]=1.f; + groundShape->setLocalScaling(localScaling); + + tr.setOrigin(btVector3(0,-64.5f,0)); + +#endif // + + m_collisionShapes.push_back(groundShape); + //create ground object + localCreateRigidBody(0,tr,groundShape); + + m_character = new CharacterController (); + m_character->setup (m_dynamicsWorld); + + //we need to remove the rigid body from the broadphase in order to register all collisions + m_dynamicsWorld->removeRigidBody(m_character->getRigidBody()); + //some custom callback sample + m_customPairCallback = new MyCustomOverlappingPairCallback(this,m_character->getRigidBody()); + sweepBP->setOverlappingPairUserCallback(m_customPairCallback); + m_dynamicsWorld->addRigidBody(m_character->getRigidBody()); + + +#define CUBE_HALF_EXTENTS 0.5 +#define EXTRA_HEIGHT 10.0 + btBoxShape* boxShape = new btBoxShape (btVector3(1.0, 1.0, 1.0)); + m_collisionShapes.push_back (boxShape); +#define DO_WALL +#ifdef DO_WALL + for (i=0;i<50;i++) + { + btCollisionShape* shape = boxShape; + //shape->setMargin(gCollisionMargin); + + bool isDyna = i>0; + + btTransform trans; + trans.setIdentity(); + + if (i>0) + { + //stack them + int colsize = 10; + int row = (i*CUBE_HALF_EXTENTS*2)/(colsize*2*CUBE_HALF_EXTENTS); + int row2 = row; + int col = (i)%(colsize)-colsize/2; + + + if (col>3) + { + col=11; + row2 |=1; + } + + btVector3 pos(col*2*CUBE_HALF_EXTENTS + (row2%2)*CUBE_HALF_EXTENTS, + row*2*CUBE_HALF_EXTENTS+CUBE_HALF_EXTENTS+EXTRA_HEIGHT,0); + + trans.setOrigin(pos); + } else + { + trans.setOrigin(btVector3(0,EXTRA_HEIGHT-CUBE_HALF_EXTENTS,0)); + } + + float mass = 1.f; + + if (!isDyna) + mass = 0.f; + + btRigidBody* body = localCreateRigidBody(mass,trans,shape); +#ifdef USE_KINEMATIC_GROUND + if (mass == 0.f) + { + body->setCollisionFlags( body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + body->setActivationState(DISABLE_DEACTIVATION); + } +#endif //USE_KINEMATIC_GROUND + + } +#endif + + clientResetScene(); + + setCameraDistance(26.f); + +} + + +//to be implemented by the demo +void CharacterDemo::renderme() +{ + updateCamera(); + + DemoApplication::renderme(); +} + +void CharacterDemo::clientMoveAndDisplay() +{ + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + /* Character stuff &*/ + if (m_character) + { + m_character->preStep (m_dynamicsWorld); + m_character->playerStep (dt, gForward, gBackward, gLeft, gRight); + if (gJump) + { + gJump = 0; + m_character->jump (); + } + } + + printf("numPairs = %d\n",m_customPairCallback->getOverlappingPairArray().size()); + { + btManifoldArray manifoldArray; + for (int i=0;igetOverlappingPairArray().size();i++) + { + manifoldArray.clear(); + + const btBroadphasePair& pair = m_customPairCallback->getOverlappingPairArray()[i]; + btBroadphasePair* collisionPair = m_overlappingPairCache->getOverlappingPairCache()->findPair(pair.m_pProxy0,pair.m_pProxy1); + + if (collisionPair->m_algorithm) + collisionPair->m_algorithm->getAllContactManifolds(manifoldArray); + + for (int j=0;jgetNumContacts();p++) + { + const btManifoldPoint&pt = manifold->getContactPoint(p); + + m_dynamicsWorld->getDebugDrawer()->drawContactPoint(pt.getPositionWorldOnB(),pt.m_normalWorldOnB,pt.getDistance(),pt.getLifeTime(),btVector3(1.f,1.f,0.f)); + } + } + } + } + + + + if (m_dynamicsWorld) + { + //during idle mode, just run 1 simulation step maximum + int maxSimSubSteps = m_idle ? 1 : 2; + if (m_idle) + dt = 1.0/420.f; + + int numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + +//#define VERBOSE_FEEDBACK +#ifdef VERBOSE_FEEDBACK + if (!numSimSteps) + printf("Interpolated transforms\n"); + else + { + if (numSimSteps > maxSimSubSteps) + { + //detect dropping frames + printf("Dropped (%i) simulation steps out of %i\n",numSimSteps - maxSimSubSteps,numSimSteps); + } else + { + printf("Simulated (%i) steps\n",numSimSteps); + } + } +#endif //VERBOSE_FEEDBACK + + } + + + + + + + +#ifdef USE_QUICKPROF + btProfiler::beginBlock("render"); +#endif //USE_QUICKPROF + + + renderme(); + +#ifdef USE_QUICKPROF + btProfiler::endBlock("render"); +#endif + + + glFlush(); + glutSwapBuffers(); + +} + + + +void CharacterDemo::displayCallback(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + + glFlush(); + glutSwapBuffers(); +} + + + +void CharacterDemo::clientResetScene() +{ + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(m_character->getRigidBody()->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + + btTransform startTransform; + startTransform.setIdentity (); + startTransform.setOrigin (btVector3(0.0, 2.0, 0.0)); + + m_character->getRigidBody()->getMotionState()->setWorldTransform(startTransform); + m_character->getRigidBody()->setLinearVelocity(btVector3(0,0,0)); + m_character->getRigidBody()->setAngularVelocity(btVector3(0,0,0)); + +} + +void CharacterDemo::specialKeyboardUp(int key, int x, int y) +{ + switch (key) + { + case GLUT_KEY_UP: + { + gForward = 0; + } + break; + case GLUT_KEY_DOWN: + { + gBackward = 0; + } + break; + case GLUT_KEY_LEFT: + { + gLeft = 0; + } + break; + case GLUT_KEY_RIGHT: + { + gRight = 0; + } + break; + default: + DemoApplication::specialKeyboardUp(key,x,y); + break; + } +} + + +void CharacterDemo::specialKeyboard(int key, int x, int y) +{ + +// printf("key = %i x=%i y=%i\n",key,x,y); + + switch (key) + { + case GLUT_KEY_UP: + { + gForward = 1; + } + break; + case GLUT_KEY_DOWN: + { + gBackward = 1; + } + break; + case GLUT_KEY_LEFT: + { + gLeft = 1; + } + break; + case GLUT_KEY_RIGHT: + { + gRight = 1; + } + break; + case GLUT_KEY_F1: + { + if (m_character && m_character->canJump()) + gJump = 1; + } + break; + default: + DemoApplication::specialKeyboard(key,x,y); + break; + } + +// glutPostRedisplay(); + + +} + +void CharacterDemo::updateCamera() +{ + +//#define DISABLE_CAMERA 1 +#ifdef DISABLE_CAMERA + DemoApplication::updateCamera(); + return; +#endif //DISABLE_CAMERA + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + btTransform characterWorldTrans; + + //look at the vehicle + m_character->getRigidBody()->getMotionState()->getWorldTransform(characterWorldTrans); + btVector3 up = characterWorldTrans.getBasis()[1]; + btVector3 backward = -characterWorldTrans.getBasis()[2]; + up.normalize (); + backward.normalize (); + + m_cameraTargetPosition = characterWorldTrans.getOrigin(); + m_cameraPosition = m_cameraTargetPosition + up * 5.0 + backward * 5.0; + + //update OpenGL camera settings + glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10000.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + gluLookAt(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2], + m_cameraTargetPosition[0],m_cameraTargetPosition[1], m_cameraTargetPosition[2], + m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); + + + +} + diff --git a/Demos/CharacterDemo/CharacterDemo.h b/Demos/CharacterDemo/CharacterDemo.h index 44f2e3df5..10fe7722f 100644 --- a/Demos/CharacterDemo/CharacterDemo.h +++ b/Demos/CharacterDemo/CharacterDemo.h @@ -41,6 +41,8 @@ class CharacterDemo : public DemoApplication class btTriangleIndexVertexArray* m_indexVertexArrays; + class MyCustomOverlappingPairCallback* m_customPairCallback; + btVector3* m_vertices; diff --git a/Demos/CharacterDemo/main.cpp b/Demos/CharacterDemo/main.cpp index b60016ccd..080eb8621 100644 --- a/Demos/CharacterDemo/main.cpp +++ b/Demos/CharacterDemo/main.cpp @@ -1,7 +1,10 @@ #include "CharacterDemo.h" #include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" +GLDebugDrawer gDebugDrawer; int main(int argc,char** argv) { @@ -9,6 +12,7 @@ int main(int argc,char** argv) CharacterDemo* characterDemo = new CharacterDemo; characterDemo->initPhysics(); + characterDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); return glutmain(argc, argv,640,480,"Bullet Character Demo. http://www.continuousphysics.com/Bullet/phpBB2/", characterDemo); } diff --git a/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp b/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp index 10a187a3d..0131e8f13 100644 --- a/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp +++ b/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp @@ -351,6 +351,7 @@ void ConcaveDemo::clientMoveAndDisplay() //optional but useful: debug drawing m_dynamicsWorld->debugDrawWorld(); + renderme(); @@ -368,6 +369,11 @@ void ConcaveDemo::displayCallback(void) { renderme(); + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); glutSwapBuffers(); } diff --git a/Demos/GimpactTestDemo/GimpactTestDemo.cpp b/Demos/GimpactTestDemo/GimpactTestDemo.cpp index 5f9f91d03..df9af2f76 100644 --- a/Demos/GimpactTestDemo/GimpactTestDemo.cpp +++ b/Demos/GimpactTestDemo/GimpactTestDemo.cpp @@ -628,6 +628,10 @@ void GimpactConcaveDemo::displayCallback(void) { renderme(); + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + glFlush(); glutSwapBuffers(); } diff --git a/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp b/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp index 5b7d38117..bd594dc49 100644 --- a/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp +++ b/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp @@ -1909,6 +1909,10 @@ void ConcaveDemo::displayCallback(void) { renderme(); + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + glFlush(); glutSwapBuffers(); } diff --git a/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp b/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp index a89b3800f..1ed317be6 100644 --- a/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp +++ b/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp @@ -212,6 +212,10 @@ void MultiThreadedDemo::displayCallback(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + renderme(); diff --git a/Demos/OpenGL/GLDebugDrawer.cpp b/Demos/OpenGL/GLDebugDrawer.cpp index 7927782f1..fa8695c16 100644 --- a/Demos/OpenGL/GLDebugDrawer.cpp +++ b/Demos/OpenGL/GLDebugDrawer.cpp @@ -68,7 +68,7 @@ void GLDebugDrawer::reportErrorWarning(const char* warningString) void GLDebugDrawer::drawContactPoint(const btVector3& pointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color) { - if (m_debugMode & btIDebugDraw::DBG_DrawContactPoints) + { btVector3 to=pointOnB+normalOnB*distance; const btVector3&from = pointOnB; diff --git a/Demos/RagdollDemo/RagdollDemo.cpp b/Demos/RagdollDemo/RagdollDemo.cpp index 6f90a53fc..62274a28e 100644 --- a/Demos/RagdollDemo/RagdollDemo.cpp +++ b/Demos/RagdollDemo/RagdollDemo.cpp @@ -373,9 +373,11 @@ void RagdollDemo::clientMoveAndDisplay() if (m_dynamicsWorld) { m_dynamicsWorld->stepSimulation(ms / 1000000.f); + //optional but useful: debug drawing m_dynamicsWorld->debugDrawWorld(); + } renderme(); @@ -391,6 +393,10 @@ void RagdollDemo::displayCallback() renderme(); + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + glFlush(); glutSwapBuffers(); } diff --git a/Demos/RagdollDemo/main.cpp b/Demos/RagdollDemo/main.cpp index 8123671c4..7c0ad9d1e 100644 --- a/Demos/RagdollDemo/main.cpp +++ b/Demos/RagdollDemo/main.cpp @@ -1,13 +1,17 @@ #include "RagdollDemo.h" #include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +GLDebugDrawer gDebugDrawer; int main(int argc,char* argv[]) { RagdollDemo demoApp; demoApp.initPhysics(); - + demoApp.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bullet.sf.net",&demoApp); } diff --git a/Demos/SoftDemo/SoftDemo.cpp b/Demos/SoftDemo/SoftDemo.cpp index b7d7e6f3b..97e69dfee 100644 --- a/Demos/SoftDemo/SoftDemo.cpp +++ b/Demos/SoftDemo/SoftDemo.cpp @@ -1182,7 +1182,7 @@ void SoftDemo::initPhysics() btCollisionShape* groundShape = 0; - bool useConcaveMesh = false;//not ready yet true; + bool useConcaveMesh = true;//not ready yet true; if (useConcaveMesh) { diff --git a/Demos/VehicleDemo/VehicleDemo.cpp b/Demos/VehicleDemo/VehicleDemo.cpp index f635251c0..c190b8725 100644 --- a/Demos/VehicleDemo/VehicleDemo.cpp +++ b/Demos/VehicleDemo/VehicleDemo.cpp @@ -450,9 +450,7 @@ void VehicleDemo::clientMoveAndDisplay() dt = 1.0/420.f; int numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); - //optional but useful: debug drawing - m_dynamicsWorld->debugDrawWorld(); - + //#define VERBOSE_FEEDBACK #ifdef VERBOSE_FEEDBACK @@ -486,6 +484,10 @@ void VehicleDemo::clientMoveAndDisplay() renderme(); + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + #ifdef USE_QUICKPROF btProfiler::endBlock("render"); #endif @@ -504,6 +506,9 @@ void VehicleDemo::displayCallback(void) renderme(); +//optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); glFlush(); glutSwapBuffers(); diff --git a/Extras/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.h b/Extras/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.h index 8a585a863..5c1a4b96f 100644 --- a/Extras/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.h +++ b/Extras/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.h @@ -46,6 +46,12 @@ public: virtual ~SpuContactManifoldCollisionAlgorithm(); + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + if (m_manifoldPtr) + manifoldArray.push_back(m_manifoldPtr); + } + btPersistentManifold* getContactManifoldPtr() { return m_manifoldPtr; diff --git a/Extras/GIMPACT/include/GIMPACT/Bullet/btGImpactCollisionAlgorithm.h b/Extras/GIMPACT/include/GIMPACT/Bullet/btGImpactCollisionAlgorithm.h index 49e206fb8..f12c44cb5 100755 --- a/Extras/GIMPACT/include/GIMPACT/Bullet/btGImpactCollisionAlgorithm.h +++ b/Extras/GIMPACT/include/GIMPACT/Bullet/btGImpactCollisionAlgorithm.h @@ -204,7 +204,11 @@ public: btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); - + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + if (m_manifoldPtr) + manifoldArray.push_back(m_manifoldPtr); + } struct CreateFunc :public btCollisionAlgorithmCreateFunc diff --git a/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h b/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h index 610eab4ce..1618ad9fd 100644 --- a/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h +++ b/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h @@ -17,6 +17,7 @@ subject to the following restrictions: #define COLLISION_ALGORITHM_H #include "LinearMath/btScalar.h" +#include "LinearMath/btAlignedObjectArray.h" struct btBroadphaseProxy; class btDispatcher; @@ -25,6 +26,7 @@ class btCollisionObject; struct btDispatcherInfo; class btPersistentManifold; +typedef btAlignedObjectArray btManifoldArray; struct btCollisionAlgorithmConstructionInfo { @@ -71,6 +73,7 @@ public: virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) = 0; + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) = 0; }; diff --git a/src/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h b/src/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h index beddd8977..588110595 100644 --- a/src/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h +++ b/src/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h @@ -41,6 +41,15 @@ public: virtual ~btBoxBoxCollisionAlgorithm(); + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + if (m_manifoldPtr && m_ownManifold) + { + manifoldArray.push_back(m_manifoldPtr); + } + } + + struct CreateFunc :public btCollisionAlgorithmCreateFunc { virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) diff --git a/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h b/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h index a381d8b3c..1682c6761 100644 --- a/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h +++ b/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h @@ -44,6 +44,15 @@ public: btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + int i; + for (i=0;igetAllContactManifolds(manifoldArray); + } + } + struct CreateFunc :public btCollisionAlgorithmCreateFunc { virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) diff --git a/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp b/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp index 9dc22d805..06ea9563d 100644 --- a/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp +++ b/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp @@ -37,6 +37,13 @@ btConvexConcaveCollisionAlgorithm::~btConvexConcaveCollisionAlgorithm() { } +void btConvexConcaveCollisionAlgorithm::getAllContactManifolds(btManifoldArray& manifoldArray) +{ + if (m_btConvexTriangleCallback.m_manifoldPtr) + { + manifoldArray.push_back(m_btConvexTriangleCallback.m_manifoldPtr); + } +} btConvexTriangleCallback::btConvexTriangleCallback(btDispatcher* dispatcher,btCollisionObject* body0,btCollisionObject* body1,bool isSwapped): diff --git a/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h b/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h index da33e9889..34b9a107b 100644 --- a/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h +++ b/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h @@ -88,6 +88,8 @@ public: btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + virtual void getAllContactManifolds(btManifoldArray& manifoldArray); + void clearCache(); struct CreateFunc :public btCollisionAlgorithmCreateFunc diff --git a/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h b/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h index ca58bce25..a0030e679 100644 --- a/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h +++ b/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h @@ -47,6 +47,14 @@ public: virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + ///should we use m_ownManifold to avoid adding duplicates? + if (m_manifoldPtr && m_ownManifold) + manifoldArray.push_back(m_manifoldPtr); + } + + void setLowLevelOfDetail(bool useLowLevel); diff --git a/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h b/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h index b503ba40c..416b7717b 100644 --- a/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h +++ b/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h @@ -42,6 +42,14 @@ public: virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + if (m_manifoldPtr && m_ownManifold) + { + manifoldArray.push_back(m_manifoldPtr); + } + } + struct CreateFunc :public btCollisionAlgorithmCreateFunc { virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) diff --git a/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h b/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h index 89e708078..e54721dec 100644 --- a/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h +++ b/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h @@ -34,6 +34,10 @@ public: virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + } + struct CreateFunc :public btCollisionAlgorithmCreateFunc { virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) diff --git a/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h b/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h index b839dc4ad..729978de1 100644 --- a/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h +++ b/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h @@ -42,6 +42,14 @@ public: virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + if (m_manifoldPtr && m_ownManifold) + { + manifoldArray.push_back(m_manifoldPtr); + } + } + btScalar getSphereDistance( btCollisionObject* boxObj,btVector3& v3PointOnBox, btVector3& v3PointOnSphere, const btVector3& v3SphereCenter, btScalar fRadius ); btScalar getSpherePenetration( btCollisionObject* boxObj, btVector3& v3PointOnBox, btVector3& v3PointOnSphere, const btVector3& v3SphereCenter, btScalar fRadius, const btVector3& aabbMin, const btVector3& aabbMax); diff --git a/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h b/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h index bcaa0d303..9e4898546 100644 --- a/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h +++ b/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h @@ -41,6 +41,13 @@ public: virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + if (m_manifoldPtr && m_ownManifold) + { + manifoldArray.push_back(m_manifoldPtr); + } + } virtual ~btSphereSphereCollisionAlgorithm(); diff --git a/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h b/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h index 4aefc0c43..dd11d4d25 100644 --- a/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h +++ b/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h @@ -41,6 +41,13 @@ public: virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + if (m_manifoldPtr && m_ownManifold) + { + manifoldArray.push_back(m_manifoldPtr); + } + } virtual ~btSphereTriangleCollisionAlgorithm(); diff --git a/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp b/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp index 3dbd97c02..81bd4ff59 100644 --- a/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp +++ b/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp @@ -536,7 +536,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol END_PROFILE("refreshManifolds"); #endif //FORCE_REFESH_CONTACT_MANIFOLDS - btVector3 color(0,1,0); + @@ -648,10 +648,6 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol btManifoldPoint& cp = manifold->getContactPoint(j); - if (debugDrawer) - debugDrawer->drawContactPoint(cp.m_positionWorldOnB,cp.m_normalWorldOnB,cp.getDistance(),cp.getLifeTime(),color); - - if (cp.getDistance() <= btScalar(0.)) { @@ -1110,7 +1106,7 @@ void btSequentialImpulseConstraintSolver::prepareConstraints(btPersistentManifol gTotalContactPoints += numpoints; - btVector3 color(0,1,0); + for (int i=0;igetContactPoint(i); @@ -1287,16 +1283,12 @@ btScalar btSequentialImpulseConstraintSolver::solveCombinedContactFriction(btRig { - btVector3 color(0,1,0); + { if (cp.getDistance() <= btScalar(0.)) { - if (iter == 0) - { - if (debugDrawer) - debugDrawer->drawContactPoint(cp.m_positionWorldOnB,cp.m_normalWorldOnB,cp.getDistance(),cp.getLifeTime(),color); - } + { @@ -1325,16 +1317,12 @@ btScalar btSequentialImpulseConstraintSolver::solve(btRigidBody* body0,btRigidBo { - btVector3 color(0,1,0); + { if (cp.getDistance() <= btScalar(0.)) { - if (iter == 0) - { - if (debugDrawer) - debugDrawer->drawContactPoint(cp.m_positionWorldOnB,cp.m_normalWorldOnB,cp.getDistance(),cp.getLifeTime(),color); - } + { @@ -1363,7 +1351,7 @@ btScalar btSequentialImpulseConstraintSolver::solveFriction(btRigidBody* body0,b { - btVector3 color(0,1,0); + { if (cp.getDistance() <= btScalar(0.)) diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp index 15a312fc1..0c8c69070 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp @@ -125,6 +125,27 @@ void btDiscreteDynamicsWorld::saveKinematicState(btScalar timeStep) void btDiscreteDynamicsWorld::debugDrawWorld() { + + if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawContactPoints) + { + int numManifolds = getDispatcher()->getNumManifolds(); + btVector3 color(0,1,0); + for (int i=0;igetManifoldByIndexInternal(i); + btCollisionObject* obA = static_cast(contactManifold->getBody0()); + btCollisionObject* obB = static_cast(contactManifold->getBody1()); + + int numContacts = contactManifold->getNumContacts(); + for (int j=0;jgetContactPoint(j); + getDebugDrawer()->drawContactPoint(cp.m_positionWorldOnB,cp.m_normalWorldOnB,cp.getDistance(),cp.getLifeTime(),color); + } + } + } + + if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & (btIDebugDraw::DBG_DrawWireframe | btIDebugDraw::DBG_DrawAabb)) { int i; diff --git a/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp b/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp index 032b0c1c7..a31036ce3 100644 --- a/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp +++ b/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp @@ -39,6 +39,8 @@ m_btSoftBodyTriangleCallback(ci.m_dispatcher1,body0,body1,isSwapped) { } + + btSoftBodyConcaveCollisionAlgorithm::~btSoftBodyConcaveCollisionAlgorithm() { } @@ -161,7 +163,7 @@ btCollisionObject* ob = static_cast(m_triBody); // btVector3 other; btVector3 normal = (triangle[1]-triangle[0]).cross(triangle[2]-triangle[0]); normal.normalize(); - normal*= 0.3f; + normal*= 1.3f; // other=(triangle[0]+triangle[1]+triangle[2])*0.333333f; // other+=normal*22.f; btVector3 pts[6] = {triangle[0]+normal, diff --git a/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h b/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h index e75b19f0b..8be5a18d8 100644 --- a/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h +++ b/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h @@ -88,6 +88,11 @@ public: btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + //we don't add any manifolds + } + void clearCache(); struct CreateFunc :public btCollisionAlgorithmCreateFunc diff --git a/src/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.cpp b/src/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.cpp index 19e54381a..cb37f8cf1 100644 --- a/src/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.cpp +++ b/src/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.cpp @@ -18,7 +18,7 @@ subject to the following restrictions: #include "btSoftBodyConcaveCollisionAlgorithm.h" #include "btSoftSoftCollisionAlgorithm.h" -//#define ENABLE_SOFTBODY_CONCAVE_COLLISIONS 1 +#define ENABLE_SOFTBODY_CONCAVE_COLLISIONS 1 btSoftBodyRigidBodyCollisionConfiguration::btSoftBodyRigidBodyCollisionConfiguration(btStackAlloc* stackAlloc,btPoolAllocator* persistentManifoldPool,btPoolAllocator* collisionAlgorithmPool) :btDefaultCollisionConfiguration(stackAlloc,persistentManifoldPool,collisionAlgorithmPool) diff --git a/src/BulletSoftBody/btSoftRigidCollisionAlgorithm.h b/src/BulletSoftBody/btSoftRigidCollisionAlgorithm.h index 351952ffe..502e52dc6 100644 --- a/src/BulletSoftBody/btSoftRigidCollisionAlgorithm.h +++ b/src/BulletSoftBody/btSoftRigidCollisionAlgorithm.h @@ -1,70 +1,75 @@ -/* -Bullet Continuous Collision Detection and Physics Library -Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ - -This software is provided 'as-is', without any express or implied warranty. -In no event will the authors be held liable for any damages arising from the use of this software. -Permission is granted to anyone to use this software for any purpose, -including commercial applications, and to alter it and redistribute it freely, -subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef SOFT_RIGID_COLLISION_ALGORITHM_H -#define SOFT_RIGID_COLLISION_ALGORITHM_H - -#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h" -#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" -#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" -class btPersistentManifold; -#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" - -#include "LinearMath/btVector3.h" -class btSoftBody; - -/// btSoftRigidCollisionAlgorithm provides collision detection between btSoftBody and btRigidBody -class btSoftRigidCollisionAlgorithm : public btCollisionAlgorithm -{ -// bool m_ownManifold; -// btPersistentManifold* m_manifoldPtr; - - btSoftBody* m_softBody; - btCollisionObject* m_rigidCollisionObject; - - ///for rigid versus soft (instead of soft versus rigid), we use this swapped boolean - bool m_isSwapped; - -public: - - btSoftRigidCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1, bool isSwapped); - - virtual ~btSoftRigidCollisionAlgorithm(); - - virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); - - virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); - - - struct CreateFunc :public btCollisionAlgorithmCreateFunc - { - virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) - { - void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btSoftRigidCollisionAlgorithm)); - if (!m_swapped) - { - return new(mem) btSoftRigidCollisionAlgorithm(0,ci,body0,body1,false); - } else - { - return new(mem) btSoftRigidCollisionAlgorithm(0,ci,body0,body1,true); - } - } - }; - -}; - -#endif //SOFT_RIGID_COLLISION_ALGORITHM_H - - +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef SOFT_RIGID_COLLISION_ALGORITHM_H +#define SOFT_RIGID_COLLISION_ALGORITHM_H + +#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h" +#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" +#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" +class btPersistentManifold; +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" + +#include "LinearMath/btVector3.h" +class btSoftBody; + +/// btSoftRigidCollisionAlgorithm provides collision detection between btSoftBody and btRigidBody +class btSoftRigidCollisionAlgorithm : public btCollisionAlgorithm +{ +// bool m_ownManifold; +// btPersistentManifold* m_manifoldPtr; + + btSoftBody* m_softBody; + btCollisionObject* m_rigidCollisionObject; + + ///for rigid versus soft (instead of soft versus rigid), we use this swapped boolean + bool m_isSwapped; + +public: + + btSoftRigidCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1, bool isSwapped); + + virtual ~btSoftRigidCollisionAlgorithm(); + + virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + + virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + //we don't add any manifolds + } + + + struct CreateFunc :public btCollisionAlgorithmCreateFunc + { + virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) + { + void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btSoftRigidCollisionAlgorithm)); + if (!m_swapped) + { + return new(mem) btSoftRigidCollisionAlgorithm(0,ci,body0,body1,false); + } else + { + return new(mem) btSoftRigidCollisionAlgorithm(0,ci,body0,body1,true); + } + } + }; + +}; + +#endif //SOFT_RIGID_COLLISION_ALGORITHM_H + + diff --git a/src/BulletSoftBody/btSoftSoftCollisionAlgorithm.h b/src/BulletSoftBody/btSoftSoftCollisionAlgorithm.h index b1627603d..c60843c35 100644 --- a/src/BulletSoftBody/btSoftSoftCollisionAlgorithm.h +++ b/src/BulletSoftBody/btSoftSoftCollisionAlgorithm.h @@ -42,6 +42,12 @@ public: virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + if (m_manifoldPtr && m_ownManifold) + manifoldArray.push_back(m_manifoldPtr); + } + btSoftSoftCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1); virtual ~btSoftSoftCollisionAlgorithm(); diff --git a/src/btBulletCollisionCommon.h b/src/btBulletCollisionCommon.h index 8fd2cc57a..4fbdcb1d7 100644 --- a/src/btBulletCollisionCommon.h +++ b/src/btBulletCollisionCommon.h @@ -51,6 +51,7 @@ subject to the following restrictions: #include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" #include "BulletCollision/BroadphaseCollision/btAxisSweep3.h" #include "BulletCollision/BroadphaseCollision/btMultiSapBroadphase.h" +#include "BulletCollision/BroadphaseCollision/btDbvtBroadphase.h" ///Math library & Utils #include "LinearMath/btQuaternion.h"