From d38549aa544fd6fb816f9123f7c0499db7354f91 Mon Sep 17 00:00:00 2001 From: ejcoumans Date: Sat, 30 Sep 2006 01:36:39 +0000 Subject: [PATCH] more refactoring, removed PhysicsInterface, cleaned up demos to make use of btDynamicsWorld derived classes. removed two cached optimizations, type in btTransform and cached inverse transform (todo: test performance impact) committed fixes that make the code adhere to 'who creates it, also destroys it' --- Demos/BspDemo/BspConverter.cpp | 1 - Demos/BspDemo/BspDemo.cpp | 28 +- Demos/BspDemo/BspDemo.h | 2 + Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp | 15 +- Demos/CcdPhysicsDemo/MyMotionState.cpp | 67 --- Demos/CcdPhysicsDemo/MyMotionState.h | 44 -- Demos/ColladaDemo/ColladaConverter.cpp | 46 +- Demos/ColladaDemo/ColladaConverter.h | 13 +- Demos/ColladaDemo/ColladaDemo.cpp | 73 +-- Demos/ConcaveDemo/ConcavePhysicsDemo.cpp | 29 +- Demos/ConcaveDemo/MyMotionState.cpp | 67 --- Demos/ConcaveDemo/MyMotionState.h | 44 -- Demos/ConstraintDemo/ConstraintDemo.cpp | 41 +- Demos/ConstraintDemo/MyMotionState.cpp | 67 --- Demos/ConstraintDemo/MyMotionState.h | 44 -- .../ConvexDecompositionDemo.cpp | 27 +- Demos/OpenGL/DemoApplication.cpp | 419 +----------------- Demos/OpenGL/DemoApplication.h | 23 +- Demos/OpenGL/GL_ShapeDrawer.cpp | 2 +- .../UserCollisionAlgorithm.cpp | 22 +- .../CollisionDispatch/btCollisionObject.cpp | 3 +- .../CollisionDispatch/btCollisionObject.h | 2 - .../CollisionDispatch/btCollisionWorld.cpp | 1 - .../CollisionDispatch/btCollisionWorld.h | 10 +- .../btConvexConcaveCollisionAlgorithm.cpp | 5 +- .../CollisionDispatch/btManifoldResult.cpp | 4 +- .../btConvexTriangleMeshShape.cpp | 2 - .../btTriangleIndexVertexArray.h | 4 + .../Dynamics/btDiscreteDynamicsWorld.cpp | 71 ++- .../Dynamics/btDiscreteDynamicsWorld.h | 19 +- src/BulletDynamics/Dynamics/btDynamicsWorld.h | 7 +- src/BulletDynamics/Dynamics/btRigidBody.cpp | 3 + src/BulletDynamics/Dynamics/btRigidBody.h | 10 + .../Dynamics/btSimpleDynamicsWorld.cpp | 23 +- .../Dynamics/btSimpleDynamicsWorld.h | 16 +- src/LinearMath/btTransform.h | 56 +-- src/btBulletDynamicsCommon.h | 2 + 37 files changed, 317 insertions(+), 995 deletions(-) delete mode 100644 Demos/CcdPhysicsDemo/MyMotionState.cpp delete mode 100644 Demos/CcdPhysicsDemo/MyMotionState.h delete mode 100644 Demos/ConcaveDemo/MyMotionState.cpp delete mode 100644 Demos/ConcaveDemo/MyMotionState.h delete mode 100644 Demos/ConstraintDemo/MyMotionState.cpp delete mode 100644 Demos/ConstraintDemo/MyMotionState.h diff --git a/Demos/BspDemo/BspConverter.cpp b/Demos/BspDemo/BspConverter.cpp index 5fefd50c3..e3708fd50 100644 --- a/Demos/BspDemo/BspConverter.cpp +++ b/Demos/BspDemo/BspConverter.cpp @@ -15,7 +15,6 @@ subject to the following restrictions: #include "BspConverter.h" #include "BspLoader.h" -#include "CcdPhysicsEnvironment.h" #include "LinearMath/btVector3.h" void BspConverter::convertBsp(BspLoader& bspLoader,float scaling) diff --git a/Demos/BspDemo/BspDemo.cpp b/Demos/BspDemo/BspDemo.cpp index 3ba3489e5..22eaaf8ff 100644 --- a/Demos/BspDemo/BspDemo.cpp +++ b/Demos/BspDemo/BspDemo.cpp @@ -13,9 +13,6 @@ subject to the following restrictions: 3. This notice may not be removed or altered from any source distribution. */ -#include "CcdPhysicsEnvironment.h" -#include "CcdPhysicsController.h" - #include "btBulletDynamicsCommon.h" #include "LinearMath/btQuickprof.h" @@ -31,7 +28,6 @@ subject to the following restrictions: #include "BspConverter.h" #endif //QUAKE_BSP_IMPORTING -#include "PHY_Pro.h" #include "BMF_Api.h" #include //printf debugging @@ -76,7 +72,9 @@ public: //this create an internal copy of the vertices btCollisionShape* shape = new btConvexHullShape(&vertices[0],vertices.size()); - m_demoApp->localCreatePhysicsObject(isDynamic, mass, startTransform,shape); + btRigidBody* body = m_demoApp->localCreateRigidBody(isDynamic, mass, startTransform,shape); + assert(body); + m_demoApp->getDynamicsWorld()->addCollisionObject( body ); } } }; @@ -124,6 +122,11 @@ int main(int argc,char** argv) return glutmain(argc, argv,640,480,"Bullet Quake BSP Physics Viewer http://bullet.sourceforge.net",bspDemo); } +BspDemo::~BspDemo() +{ + delete m_dynamicsWorld; +} + void BspDemo::initPhysics(char* bspfilename) { @@ -132,16 +135,7 @@ void BspDemo::initPhysics(char* bspfilename) m_forwardAxis = 1; ///Setup a Physics Simulation Environment - btCollisionDispatcher* dispatcher = new btCollisionDispatcher(); - btVector3 worldAabbMin(-10000,-10000,-10000); - btVector3 worldAabbMax(10000,10000,10000); - btOverlappingPairCache* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax); - //BroadphaseInterface* broadphase = new btSimpleBroadphase(); - m_physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase); - m_physicsEnvironmentPtr->setDeactivationTime(2.f); - m_physicsEnvironmentPtr->setGravity(0,0,-10); - m_physicsEnvironmentPtr->setDebugDrawer(&debugDrawer); - + m_dynamicsWorld = new btDiscreteDynamicsWorld(); #ifdef QUAKE_BSP_IMPORTING @@ -192,7 +186,7 @@ void BspDemo::clientMoveAndDisplay() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - m_physicsEnvironmentPtr->proceedDeltaTime(0.f,deltaTime); + m_dynamicsWorld->stepSimulation(deltaTime); renderme(); @@ -208,7 +202,7 @@ void BspDemo::displayCallback(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - m_physicsEnvironmentPtr->UpdateAabbs(deltaTime); + //m_dynamicsWorld->UpdateAabbs(deltaTime); renderme(); diff --git a/Demos/BspDemo/BspDemo.h b/Demos/BspDemo/BspDemo.h index d3326a707..e770d5c5c 100644 --- a/Demos/BspDemo/BspDemo.h +++ b/Demos/BspDemo/BspDemo.h @@ -22,6 +22,8 @@ class BspDemo : public DemoApplication { public: + virtual ~BspDemo(); + void initPhysics(char* bspfilename); virtual void clientMoveAndDisplay(); diff --git a/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp b/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp index f096690c8..070818fa8 100644 --- a/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp +++ b/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp @@ -21,10 +21,8 @@ subject to the following restrictions: #include "LinearMath/btQuickprof.h" #include "LinearMath/btIDebugDraw.h" - #include "GLDebugDrawer.h" -#include "PHY_Pro.h" #include "BMF_Api.h" #include //printf debugging @@ -154,16 +152,9 @@ void CcdPhysicsDemo::displayCallback(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - /* - if (m_physicsEnvironmentPtr) - { - m_physicsEnvironmentPtr->UpdateAabbs(deltaTime); - //draw contactpoints - m_physicsEnvironmentPtr->CallbackTriggers(); - } - */ - + m_dynamicsWorld->updateAabbs(); + renderme(); glFlush(); @@ -253,6 +244,8 @@ void CcdPhysicsDemo::initPhysics() m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver); + m_dynamicsWorld->setDebugDrawer(&debugDrawer); + #ifdef USER_DEFINED_FRICTION_MODEL btSequentialImpulseConstraintSolver* solver = (btSequentialImpulseConstraintSolver*) m_physicsEnvironmentPtr->GetConstraintSolver(); diff --git a/Demos/CcdPhysicsDemo/MyMotionState.cpp b/Demos/CcdPhysicsDemo/MyMotionState.cpp deleted file mode 100644 index fe3636d5d..000000000 --- a/Demos/CcdPhysicsDemo/MyMotionState.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* -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. -*/ - -#include "MyMotionState.h" -#include "LinearMath/btPoint3.h" - -MyMotionState::MyMotionState() -{ - m_worldTransform.setIdentity(); -} - - -MyMotionState::~MyMotionState() -{ - -} - -void MyMotionState::getWorldPosition(float& posX,float& posY,float& posZ) -{ - posX = m_worldTransform.getOrigin().x(); - posY = m_worldTransform.getOrigin().y(); - posZ = m_worldTransform.getOrigin().z(); -} - -void MyMotionState::getWorldScaling(float& scaleX,float& scaleY,float& scaleZ) -{ - scaleX = 1.; - scaleY = 1.; - scaleZ = 1.; -} - -void MyMotionState::getWorldOrientation(float& quatIma0,float& quatIma1,float& quatIma2,float& quatReal) -{ - quatIma0 = m_worldTransform.getRotation().x(); - quatIma1 = m_worldTransform.getRotation().y(); - quatIma2 = m_worldTransform.getRotation().z(); - quatReal = m_worldTransform.getRotation()[3]; -} - -void MyMotionState::setWorldPosition(float posX,float posY,float posZ) -{ - btPoint3 pos(posX,posY,posZ); - m_worldTransform.setOrigin( pos ); -} - -void MyMotionState::setWorldOrientation(float quatIma0,float quatIma1,float quatIma2,float quatReal) -{ - btQuaternion orn(quatIma0,quatIma1,quatIma2,quatReal); - m_worldTransform.setRotation( orn ); -} - -void MyMotionState::calculateWorldTransformations() -{ - -} diff --git a/Demos/CcdPhysicsDemo/MyMotionState.h b/Demos/CcdPhysicsDemo/MyMotionState.h deleted file mode 100644 index 7aa7c8520..000000000 --- a/Demos/CcdPhysicsDemo/MyMotionState.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -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 MY_MOTIONSTATE_H -#define MY_MOTIONSTATE_H - -#include "PHY_IMotionState.h" -#include - - -class MyMotionState : public PHY_IMotionState - -{ - public: - MyMotionState(); - - virtual ~MyMotionState(); - - virtual void getWorldPosition(float& posX,float& posY,float& posZ); - virtual void getWorldScaling(float& scaleX,float& scaleY,float& scaleZ); - virtual void getWorldOrientation(float& quatIma0,float& quatIma1,float& quatIma2,float& quatReal); - - virtual void setWorldPosition(float posX,float posY,float posZ); - virtual void setWorldOrientation(float quatIma0,float quatIma1,float quatIma2,float quatReal); - - virtual void calculateWorldTransformations(); - - btTransform m_worldTransform; - -}; - -#endif //MY_MOTIONSTATE_H diff --git a/Demos/ColladaDemo/ColladaConverter.cpp b/Demos/ColladaDemo/ColladaConverter.cpp index d3340776d..b6010aa7c 100644 --- a/Demos/ColladaDemo/ColladaConverter.cpp +++ b/Demos/ColladaDemo/ColladaConverter.cpp @@ -14,7 +14,7 @@ subject to the following restrictions: */ #include "ColladaConverter.h" - +#include "btBulletDynamicsCommon.h" #include "dae.h" #include "dom/domCOLLADA.h" @@ -27,10 +27,9 @@ subject to the following restrictions: #include "BulletCollision/CollisionShapes/btTriangleMesh.h" #include "BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h" #include "BulletCollision/CollisionShapes/btTriangleMeshShape.h" -#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h" +//#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h" #include "BulletCollision/CollisionShapes/btCompoundShape.h" -#include "CcdPhysicsController.h" char* getLastFileName(); @@ -537,18 +536,18 @@ void ColladaConverter::prepareConstraints(ConstraintInput& input) daeString orgUri0 = attachRefBody->getRigid_body().getOriginalURI(); daeString orgUri1 = attachBody1->getRigid_body().getOriginalURI(); - CcdPhysicsController* ctrl0=0,*ctrl1=0; + btRigidBody* body0=0,*body1=0; for (int i=0;igetNewClientInfo(); + char* bodyName = (char*)m_rigidBodies[i]->m_userObjectPointer; if (!strcmp(bodyName,orgUri0)) { - ctrl0=m_physObjects[i]; + body0=m_rigidBodies[i]; } if (!strcmp(bodyName,orgUri1)) { - ctrl1=m_physObjects[i]; + body1=m_rigidBodies[i]; } } @@ -572,8 +571,7 @@ void ColladaConverter::prepareConstraints(ConstraintInput& input) btVector3 angularMax(coneMaxLimit.get(0),coneMaxLimit.get(1),coneMaxLimit.get(2)); { - int constraintId; - + btTransform attachFrameRef0; attachFrameRef0 = GetbtTransformFromCOLLADA_DOM @@ -635,11 +633,11 @@ void ColladaConverter::prepareConstraints(ConstraintInput& input) } - if (ctrl0 && ctrl1) + if (body0&& body1) { - constraintId = createUniversalD6Constraint( - ctrl0, - ctrl1, + createUniversalD6Constraint( + body0, + body1, attachFrameRef0, attachFrameOther, linearLowerLimits, @@ -699,12 +697,12 @@ void ColladaConverter::PreparePhysicsObject(struct btRigidBodyInput& input, bool - CcdPhysicsController* ctrl = createPhysicsObject(isDynamics,mass,startTransform,colShape); - if (ctrl) + btRigidBody* body= createRigidBody(isDynamics,mass,startTransform,colShape); + if (body) { //for bodyName lookup in constraints - ctrl->setNewClientInfo((void*)input.m_bodyName); - m_physObjects[m_numObjects] = ctrl; + body->m_userObjectPointer = (void*)input.m_bodyName; + m_rigidBodies[m_numObjects] = body; m_numObjects++; } @@ -733,12 +731,8 @@ bool ColladaConverter::saveAs(const char* filename) { - float np[3]; + btVector3 np = m_rigidBodies[i]->m_worldTransform.getOrigin(); domFloat3 newPos = m_colladadomNodes[i]->getTranslate_array().get(0)->getValue(); - m_physObjects[i]->GetMotionState()->getWorldPosition( - np[0], - np[1], - np[2]); newPos.set(0,np[0]); newPos.set(1,np[1]); newPos.set(2,np[2]); @@ -764,7 +758,7 @@ bool ColladaConverter::saveAs(const char* filename) } { - btQuaternion quat = m_physObjects[i]->getRigidBody()->getCenterOfMassTransform().getRotation(); + btQuaternion quat = m_rigidBodies[i]->getCenterOfMassTransform().getRotation(); btVector3 axis(quat.getX(),quat.getY(),quat.getZ()); axis[3] = 0.f; //check for axis length @@ -1059,7 +1053,11 @@ void ColladaConverter::ConvertRigidBodyRef( btRigidBodyInput& rbInput,btRigidBod } else { printf("static concave triangle added\n"); - rbOutput.m_colShape = new btTriangleMeshShape(trimesh); + //rbOutput.m_colShape = new btTriangleMeshShape(trimesh);//btBvhTriangleMeshShape(trimesh); + //rbOutput.m_colShape = new btBvhTriangleMeshShape(trimesh); + rbOutput.m_colShape = new btConvexTriangleMeshShape(trimesh); + + //btTriangleMeshShape } } diff --git a/Demos/ColladaDemo/ColladaConverter.h b/Demos/ColladaDemo/ColladaConverter.h index f1abf71d3..dd8c2af44 100644 --- a/Demos/ColladaDemo/ColladaConverter.h +++ b/Demos/ColladaDemo/ColladaConverter.h @@ -22,8 +22,9 @@ subject to the following restrictions: #include "LinearMath/btVector3.h" class btCollisionShape; -class PHY_IPhysicsController; -class CcdPhysicsController; +class btRigidBody; +class btTypedConstraint; + class ConstraintInput; //use some reasonable number here @@ -42,7 +43,7 @@ protected: const char* m_filename; int m_numObjects; - CcdPhysicsController* m_physObjects[COLLADA_CONVERTER_MAX_NUM_OBJECTS]; + btRigidBody* m_rigidBodies[COLLADA_CONVERTER_MAX_NUM_OBJECTS]; void PreparePhysicsObject(struct btRigidBodyInput& input, bool isDynamics, float mass,btCollisionShape* colShape); @@ -66,8 +67,8 @@ public: bool convert(); ///those 2 virtuals are called for each constraint/physics object - virtual int createUniversalD6Constraint( - class PHY_IPhysicsController* ctrlRef,class PHY_IPhysicsController* ctrlOther, + virtual btTypedConstraint* createUniversalD6Constraint( + class btRigidBody* body0,class btRigidBody* otherBody, btTransform& localAttachmentFrameRef, btTransform& localAttachmentOther, const btVector3& linearMinLimits, @@ -76,7 +77,7 @@ public: const btVector3& angularMaxLimits ) = 0; - virtual CcdPhysicsController* createPhysicsObject(bool isDynamic, + virtual btRigidBody* createRigidBody(bool isDynamic, float mass, const btTransform& startTransform, btCollisionShape* shape) = 0; diff --git a/Demos/ColladaDemo/ColladaDemo.cpp b/Demos/ColladaDemo/ColladaDemo.cpp index 350c2afdd..2fa1dd234 100644 --- a/Demos/ColladaDemo/ColladaDemo.cpp +++ b/Demos/ColladaDemo/ColladaDemo.cpp @@ -13,8 +13,6 @@ subject to the following restrictions: 3. This notice may not be removed or altered from any source distribution. */ -#include "CcdPhysicsEnvironment.h" -#include "CcdPhysicsController.h" #include "btBulletDynamicsCommon.h" #include "LinearMath/btQuickprof.h" #include "LinearMath/btIDebugDraw.h" @@ -26,7 +24,7 @@ subject to the following restrictions: //COLLADA_DOM should compile under all platforms, and is enabled by default. #include "ColladaConverter.h" -#include "PHY_Pro.h" + #include "BMF_Api.h" #include //printf debugging @@ -35,6 +33,7 @@ float deltaTime = 1.f/60.f; #include "ColladaDemo.h" #include "GL_ShapeDrawer.h" #include "GlutStuff.h" +int maxObj = 1; ///custom version of the converter, that creates physics objects/constraints class MyColladaConverter : public ColladaConverter @@ -48,8 +47,8 @@ class MyColladaConverter : public ColladaConverter } ///those 2 virtuals are called for each constraint/physics object - virtual int createUniversalD6Constraint( - class PHY_IPhysicsController* ctrlRef,class PHY_IPhysicsController* ctrlOther, + virtual btTypedConstraint* createUniversalD6Constraint( + class btRigidBody* bodyRef,class btRigidBody* bodyOther, btTransform& localAttachmentFrameRef, btTransform& localAttachmentOther, const btVector3& linearMinLimits, @@ -58,30 +57,49 @@ class MyColladaConverter : public ColladaConverter const btVector3& angularMaxLimits ) { - return m_demoApp->getPhysicsEnvironment()->createUniversalD6Constraint( - ctrlRef,ctrlOther, - localAttachmentFrameRef, - localAttachmentOther, - linearMinLimits, - linearMaxLimits, - angularMinLimits, - angularMaxLimits - ); + if (bodyRef && bodyOther) + { + btGeneric6DofConstraint* genericConstraint = new btGeneric6DofConstraint( + *bodyRef,*bodyOther, + localAttachmentFrameRef,localAttachmentOther); + + genericConstraint->setLinearLowerLimit(linearMinLimits); + genericConstraint->setLinearUpperLimit(linearMaxLimits); + genericConstraint->setAngularLowerLimit(angularMinLimits); + genericConstraint->setAngularUpperLimit(angularMaxLimits); + + m_demoApp->getDynamicsWorld()->addConstraint( genericConstraint ); + + return genericConstraint; + } + return 0; } - virtual CcdPhysicsController* createPhysicsObject(bool isDynamic, + virtual btRigidBody* createRigidBody(bool isDynamic, float mass, const btTransform& startTransform, btCollisionShape* shape) { - CcdPhysicsController* ctrl = m_demoApp->localCreatePhysicsObject(isDynamic, mass, startTransform,shape); - return ctrl; + if (!isDynamic) + { + printf("nondyna\n"); + } else + { + if (!maxObj) + return 0; + maxObj--; + } + + + btRigidBody* body = m_demoApp->localCreateRigidBody(isDynamic, mass, startTransform,shape); + m_demoApp->getDynamicsWorld()->addCollisionObject(body); + return body; } virtual void setGravity(const btVector3& grav) { - m_demoApp->getPhysicsEnvironment()->setGravity(grav.getX(),grav.getY(),grav.getZ()); + m_demoApp->setGravity(grav); } virtual void setCameraInfo(const btVector3& camUp,int forwardAxis) { @@ -141,16 +159,11 @@ void ColladaDemo::initPhysics(const char* filename) m_cameraUp = btVector3(0,0,1); m_forwardAxis = 1; - ///Setup a Physics Simulation Environment - btCollisionDispatcher* dispatcher = new btCollisionDispatcher(); - btVector3 worldAabbMin(-10000,-10000,-10000); - btVector3 worldAabbMax(10000,10000,10000); - btOverlappingPairCache* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax); - //BroadphaseInterface* broadphase = new btSimpleBroadphase(); - m_physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase); - m_physicsEnvironmentPtr->setDeactivationTime(2.f); - m_physicsEnvironmentPtr->setGravity(0,0,-10); - m_physicsEnvironmentPtr->setDebugDrawer(&debugDrawer); + m_dynamicsWorld = new btDiscreteDynamicsWorld(); + //m_dynamicsWorld = new btSimpleDynamicsWorld(); + + m_dynamicsWorld->setDebugDrawer(&debugDrawer); + MyColladaConverter* converter = new MyColladaConverter(this); @@ -174,7 +187,7 @@ void ColladaDemo::clientMoveAndDisplay() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - m_physicsEnvironmentPtr->proceedDeltaTime(0.f,deltaTime); + m_dynamicsWorld->stepSimulation(deltaTime); renderme(); @@ -190,7 +203,7 @@ void ColladaDemo::displayCallback(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - m_physicsEnvironmentPtr->UpdateAabbs(deltaTime); + m_dynamicsWorld->updateAabbs(); renderme(); diff --git a/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp b/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp index be64728f3..8289a2d43 100644 --- a/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp +++ b/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp @@ -13,13 +13,9 @@ subject to the following restrictions: 3. This notice may not be removed or altered from any source distribution. */ -#include "CcdPhysicsEnvironment.h" -#include "CcdPhysicsController.h" -#include "MyMotionState.h" #include "btBulletDynamicsCommon.h" #include "LinearMath/btIDebugDraw.h" #include "GLDebugDrawer.h" -#include "PHY_Pro.h" #include "ConcaveDemo.h" #include "GL_ShapeDrawer.h" #include "GlutStuff.h" @@ -159,30 +155,31 @@ void ConcaveDemo::initPhysics() btOverlappingPairCache* broadphase = new btSimpleBroadphase(); - - m_physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase); + m_dynamicsWorld = new btDiscreteDynamicsWorld(); - bool isDynamic = false; + bool isDynamic = false; float mass = 0.f; btTransform startTransform; startTransform.setIdentity(); - startTransform.setOrigin(btVector3(0,-2,0)); + startTransform.setOrigin(btVector3(0,0,0)); - CcdPhysicsController* staticTrimesh = localCreatePhysicsObject(isDynamic, mass, startTransform,trimeshShape); + btRigidBody* staticBody = localCreateRigidBody(isDynamic, mass, startTransform,trimeshShape); + + staticBody->m_collisionFlags |=btCollisionObject::isStatic; + + getDynamicsWorld()->addCollisionObject(staticBody); //enable custom material callback - staticTrimesh->getRigidBody()->m_collisionFlags |= btCollisionObject::customMaterialCallback; + staticBody->m_collisionFlags |= btCollisionObject::customMaterialCallback; { for (int i=0;i<10;i++) { btCollisionShape* boxShape = new btBoxShape(btVector3(1,1,1)); startTransform.setOrigin(btVector3(2*i,1,1)); - localCreatePhysicsObject(true, 1, startTransform,boxShape); + getDynamicsWorld()->addCollisionObject(localCreateRigidBody(true, 1, startTransform,boxShape)); } } - m_physicsEnvironmentPtr->setGravity(-1,-10,1); - m_physicsEnvironmentPtr->setDebugDrawer(&debugDrawer); } void ConcaveDemo::clientMoveAndDisplay() @@ -191,7 +188,7 @@ void ConcaveDemo::clientMoveAndDisplay() float deltaTime = 1.f/60.f; - m_physicsEnvironmentPtr->proceedDeltaTime(0.f,deltaTime); + m_dynamicsWorld->stepSimulation(deltaTime); renderme(); @@ -202,7 +199,7 @@ void ConcaveDemo::clientMoveAndDisplay() void ConcaveDemo::clientResetScene() { - int numObj = m_physicsEnvironmentPtr->GetNumControllers(); + /*int numObj = m_physicsEnvironmentPtr->GetNumControllers(); //skip ground for (int i=1;iSetLinearVelocity(0,0,0,0); ctrl->SetAngularVelocity(0,0,0,0); } + */ + } diff --git a/Demos/ConcaveDemo/MyMotionState.cpp b/Demos/ConcaveDemo/MyMotionState.cpp deleted file mode 100644 index fe3636d5d..000000000 --- a/Demos/ConcaveDemo/MyMotionState.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* -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. -*/ - -#include "MyMotionState.h" -#include "LinearMath/btPoint3.h" - -MyMotionState::MyMotionState() -{ - m_worldTransform.setIdentity(); -} - - -MyMotionState::~MyMotionState() -{ - -} - -void MyMotionState::getWorldPosition(float& posX,float& posY,float& posZ) -{ - posX = m_worldTransform.getOrigin().x(); - posY = m_worldTransform.getOrigin().y(); - posZ = m_worldTransform.getOrigin().z(); -} - -void MyMotionState::getWorldScaling(float& scaleX,float& scaleY,float& scaleZ) -{ - scaleX = 1.; - scaleY = 1.; - scaleZ = 1.; -} - -void MyMotionState::getWorldOrientation(float& quatIma0,float& quatIma1,float& quatIma2,float& quatReal) -{ - quatIma0 = m_worldTransform.getRotation().x(); - quatIma1 = m_worldTransform.getRotation().y(); - quatIma2 = m_worldTransform.getRotation().z(); - quatReal = m_worldTransform.getRotation()[3]; -} - -void MyMotionState::setWorldPosition(float posX,float posY,float posZ) -{ - btPoint3 pos(posX,posY,posZ); - m_worldTransform.setOrigin( pos ); -} - -void MyMotionState::setWorldOrientation(float quatIma0,float quatIma1,float quatIma2,float quatReal) -{ - btQuaternion orn(quatIma0,quatIma1,quatIma2,quatReal); - m_worldTransform.setRotation( orn ); -} - -void MyMotionState::calculateWorldTransformations() -{ - -} diff --git a/Demos/ConcaveDemo/MyMotionState.h b/Demos/ConcaveDemo/MyMotionState.h deleted file mode 100644 index 7aa7c8520..000000000 --- a/Demos/ConcaveDemo/MyMotionState.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -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 MY_MOTIONSTATE_H -#define MY_MOTIONSTATE_H - -#include "PHY_IMotionState.h" -#include - - -class MyMotionState : public PHY_IMotionState - -{ - public: - MyMotionState(); - - virtual ~MyMotionState(); - - virtual void getWorldPosition(float& posX,float& posY,float& posZ); - virtual void getWorldScaling(float& scaleX,float& scaleY,float& scaleZ); - virtual void getWorldOrientation(float& quatIma0,float& quatIma1,float& quatIma2,float& quatReal); - - virtual void setWorldPosition(float posX,float posY,float posZ); - virtual void setWorldOrientation(float quatIma0,float quatIma1,float quatIma2,float quatReal); - - virtual void calculateWorldTransformations(); - - btTransform m_worldTransform; - -}; - -#endif //MY_MOTIONSTATE_H diff --git a/Demos/ConstraintDemo/ConstraintDemo.cpp b/Demos/ConstraintDemo/ConstraintDemo.cpp index 0d065d27d..14d8bacd3 100644 --- a/Demos/ConstraintDemo/ConstraintDemo.cpp +++ b/Demos/ConstraintDemo/ConstraintDemo.cpp @@ -13,15 +13,12 @@ subject to the following restrictions: 3. This notice may not be removed or altered from any source distribution. */ -#include "CcdPhysicsEnvironment.h" -#include "CcdPhysicsController.h" -#include "MyMotionState.h" + #include "btBulletDynamicsCommon.h" #include "LinearMath/btIDebugDraw.h" #include "GLDebugDrawer.h" -#include "PHY_Pro.h" #include "BMF_Api.h" #include //printf debugging @@ -61,10 +58,7 @@ void ConstraintDemo::initPhysics() btOverlappingPairCache* broadphase = new btSimpleBroadphase(); - m_physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase); - m_physicsEnvironmentPtr->setDeactivationTime(0.f); - m_physicsEnvironmentPtr->setGravity(0,-10,0); - + m_dynamicsWorld = new btDiscreteDynamicsWorld(); btCollisionShape* shape = new btBoxShape(btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS)); btTransform trans; @@ -74,10 +68,12 @@ void ConstraintDemo::initPhysics() bool isDynamic = false; float mass = 1.f; - CcdPhysicsController* ctrl0 = localCreatePhysicsObject( isDynamic,mass,trans,shape); + btRigidBody* body0 = localCreateRigidBody( isDynamic,mass,trans,shape); + getDynamicsWorld()->addCollisionObject(body0); trans.setOrigin(btVector3(2*CUBE_HALF_EXTENTS,20,0)); isDynamic = true; - CcdPhysicsController* ctrl1 = localCreatePhysicsObject( isDynamic,mass,trans,shape); + btRigidBody* body1 = localCreateRigidBody( isDynamic,mass,trans,shape); + getDynamicsWorld()->addCollisionObject(body1); clientResetScene(); @@ -85,21 +81,17 @@ void ConstraintDemo::initPhysics() { int constraintId; - float pivotX=CUBE_HALF_EXTENTS, - pivotY=-CUBE_HALF_EXTENTS, - pivotZ=-CUBE_HALF_EXTENTS; - float axisX=0,axisY=0,axisZ=1; + btVector3 pivotInA(CUBE_HALF_EXTENTS,-CUBE_HALF_EXTENTS,-CUBE_HALF_EXTENTS); + btVector3 axisInA(0,0,1); + btVector3 pivotInB = body1 ? body1->getCenterOfMassTransform().inverse()(body0->getCenterOfMassTransform()(pivotInA)) : pivotInA; + btVector3 axisInB = body1? + (body1->getCenterOfMassTransform().getBasis().inverse()*(body1->getCenterOfMassTransform().getBasis() * axisInA)) : + body0->getCenterOfMassTransform().getBasis() * axisInA; - constraintId =m_physicsEnvironmentPtr->createConstraint( - ctrl0, - ctrl1, - PHY_POINT2POINT_CONSTRAINT, - //PHY_GENERIC_6DOF_CONSTRAINT,//can leave any of the 6 degree of freedom 'free' or 'locked' - //PHY_LINEHINGE_CONSTRAINT, - pivotX,pivotY,pivotZ, - axisX,axisY,axisZ - ); + btTypedConstraint* p2p = new btPoint2PointConstraint(*body0,*body1,pivotInA,pivotInB); + + m_dynamicsWorld->addConstraint(p2p); } } @@ -112,8 +104,7 @@ void ConstraintDemo::clientMoveAndDisplay() float deltaTime = 1.f/60.f; - m_physicsEnvironmentPtr->proceedDeltaTime(0.f,deltaTime); - + m_dynamicsWorld->stepSimulation(deltaTime); renderme(); glFlush(); diff --git a/Demos/ConstraintDemo/MyMotionState.cpp b/Demos/ConstraintDemo/MyMotionState.cpp deleted file mode 100644 index fe3636d5d..000000000 --- a/Demos/ConstraintDemo/MyMotionState.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* -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. -*/ - -#include "MyMotionState.h" -#include "LinearMath/btPoint3.h" - -MyMotionState::MyMotionState() -{ - m_worldTransform.setIdentity(); -} - - -MyMotionState::~MyMotionState() -{ - -} - -void MyMotionState::getWorldPosition(float& posX,float& posY,float& posZ) -{ - posX = m_worldTransform.getOrigin().x(); - posY = m_worldTransform.getOrigin().y(); - posZ = m_worldTransform.getOrigin().z(); -} - -void MyMotionState::getWorldScaling(float& scaleX,float& scaleY,float& scaleZ) -{ - scaleX = 1.; - scaleY = 1.; - scaleZ = 1.; -} - -void MyMotionState::getWorldOrientation(float& quatIma0,float& quatIma1,float& quatIma2,float& quatReal) -{ - quatIma0 = m_worldTransform.getRotation().x(); - quatIma1 = m_worldTransform.getRotation().y(); - quatIma2 = m_worldTransform.getRotation().z(); - quatReal = m_worldTransform.getRotation()[3]; -} - -void MyMotionState::setWorldPosition(float posX,float posY,float posZ) -{ - btPoint3 pos(posX,posY,posZ); - m_worldTransform.setOrigin( pos ); -} - -void MyMotionState::setWorldOrientation(float quatIma0,float quatIma1,float quatIma2,float quatReal) -{ - btQuaternion orn(quatIma0,quatIma1,quatIma2,quatReal); - m_worldTransform.setRotation( orn ); -} - -void MyMotionState::calculateWorldTransformations() -{ - -} diff --git a/Demos/ConstraintDemo/MyMotionState.h b/Demos/ConstraintDemo/MyMotionState.h deleted file mode 100644 index 7aa7c8520..000000000 --- a/Demos/ConstraintDemo/MyMotionState.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -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 MY_MOTIONSTATE_H -#define MY_MOTIONSTATE_H - -#include "PHY_IMotionState.h" -#include - - -class MyMotionState : public PHY_IMotionState - -{ - public: - MyMotionState(); - - virtual ~MyMotionState(); - - virtual void getWorldPosition(float& posX,float& posY,float& posZ); - virtual void getWorldScaling(float& scaleX,float& scaleY,float& scaleZ); - virtual void getWorldOrientation(float& quatIma0,float& quatIma1,float& quatIma2,float& quatReal); - - virtual void setWorldPosition(float posX,float posY,float posZ); - virtual void setWorldOrientation(float quatIma0,float quatIma1,float quatIma2,float quatReal); - - virtual void calculateWorldTransformations(); - - btTransform m_worldTransform; - -}; - -#endif //MY_MOTIONSTATE_H diff --git a/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp b/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp index f9adcae6e..031abb7cd 100644 --- a/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp +++ b/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp @@ -16,18 +16,12 @@ subject to the following restrictions: #include "cd_wavefront.h" #include "ConvexBuilder.h" - -#include "CcdPhysicsEnvironment.h" -#include "CcdPhysicsController.h" #include "btBulletDynamicsCommon.h" #include "LinearMath/btQuickprof.h" #include "LinearMath/btIDebugDraw.h" - #include "GLDebugDrawer.h" - -#include "PHY_Pro.h" #include "BMF_Api.h" #include //printf debugging @@ -90,16 +84,14 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) btOverlappingPairCache* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax); //OverlappingPairCache* broadphase = new btSimpleBroadphase(); - m_physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase); - m_physicsEnvironmentPtr->setDeactivationTime(2.f); - - m_physicsEnvironmentPtr->setGravity(0,-10,0); + btConstraintSolver* solver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver); btTransform startTransform; startTransform.setIdentity(); startTransform.setOrigin(btVector3(0,-4,0)); - localCreatePhysicsObject(false,0,startTransform,new btBoxShape(btVector3(30,2,30))); + localCreateRigidBody(false,0,startTransform,new btBoxShape(btVector3(30,2,30))); class MyConvexDecomposition : public ConvexDecomposition::ConvexDecompInterface { @@ -200,8 +192,8 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) btTransform trans; trans.setIdentity(); trans.setOrigin(centroid); - m_convexDemo->localCreatePhysicsObject(isDynamic, mass, trans,convexShape); - + btRigidBody* body = m_convexDemo->localCreateRigidBody(isDynamic, mass, trans,convexShape); + m_convexDemo->getDynamicsWorld()->addCollisionObject(body); mBaseCount+=result.mHullVcount; // advance the 'base index' counter. @@ -245,7 +237,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) startTransform.setIdentity(); startTransform.setOrigin(btVector3(20,2,0)); - localCreatePhysicsObject(isDynamic, mass, startTransform,convexShape); + localCreateRigidBody(isDynamic, mass, startTransform,convexShape); } @@ -296,7 +288,7 @@ void ConvexDecompositionDemo::initPhysics(const char* filename) } - m_physicsEnvironmentPtr->setDebugDrawer(&debugDrawer); + m_dynamicsWorld->setDebugDrawer(&debugDrawer); } @@ -305,8 +297,7 @@ void ConvexDecompositionDemo::clientMoveAndDisplay() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - m_physicsEnvironmentPtr->proceedDeltaTime(0.f,deltaTime); + m_dynamicsWorld->stepSimulation(deltaTime); renderme(); @@ -322,7 +313,7 @@ void ConvexDecompositionDemo::displayCallback(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - m_physicsEnvironmentPtr->UpdateAabbs(deltaTime); + m_dynamicsWorld->updateAabbs(); renderme(); diff --git a/Demos/OpenGL/DemoApplication.cpp b/Demos/OpenGL/DemoApplication.cpp index 51bf99452..2541d3c0b 100644 --- a/Demos/OpenGL/DemoApplication.cpp +++ b/Demos/OpenGL/DemoApplication.cpp @@ -18,10 +18,7 @@ subject to the following restrictions: #include "LinearMath/btIDebugDraw.h" #include "BulletDynamics/Dynamics/btDynamicsWorld.h" -#include "CcdPhysicsEnvironment.h" -#include "CcdPhysicsController.h" #include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h"//picking -#include "PHY_Pro.h" #include "BulletCollision/CollisionShapes/btCollisionShape.h" #include "BulletCollision/CollisionShapes/btBoxShape.h" #include "GL_ShapeDrawer.h" @@ -31,8 +28,6 @@ subject to the following restrictions: int numObjects = 0; const int maxNumObjects = 16384; -DefaultMotionState ms[maxNumObjects]; -CcdPhysicsController* physObjects[maxNumObjects]; btTransform startTransforms[maxNumObjects]; btCollisionShape* gShapePtr[maxNumObjects];//1 rigidbody has 1 shape (no re-use of shapes) @@ -40,9 +35,9 @@ btCollisionShape* gShapePtr[maxNumObjects];//1 rigidbody has 1 shape (no re-use DemoApplication::DemoApplication() //see btIDebugDraw.h for modes : -m_physicsEnvironmentPtr(0), m_dynamicsWorld(0), m_pickConstraint(0), +m_gravity(0,-10,0), m_cameraDistance(15.0), m_debugMode(0), m_ele(0.f), @@ -340,8 +335,7 @@ void DemoApplication::keyboardCallback(unsigned char key, int x, int y) break; } - if (m_physicsEnvironmentPtr) - m_physicsEnvironmentPtr->setDebugMode(m_debugMode); + getDynamicsWorld()->getDebugDrawer()->setDebugMode(m_debugMode); glutPostRedisplay(); @@ -411,27 +405,6 @@ void DemoApplication::shootBox(const btVector3& destination) body->setAngularVelocity(btVector3(0,0,0)); } - if (m_physicsEnvironmentPtr) - { - bool isDynamic = true; - float mass = 1.f; - btTransform startTransform; - startTransform.setIdentity(); - btVector3 camPos = getCameraPosition(); - startTransform.setOrigin(camPos); - btCollisionShape* boxShape = new btBoxShape(btVector3(1.f,1.f,1.f)); - - CcdPhysicsController* newBox = localCreatePhysicsObject(isDynamic, mass, startTransform,boxShape); - - btVector3 linVel(destination[0]-camPos[0],destination[1]-camPos[1],destination[2]-camPos[2]); - linVel.normalize(); - linVel*=m_ShootBoxInitialSpeed; - - newBox->setPosition(camPos[0],camPos[1],camPos[2]); - newBox->setOrientation(0,0,0,1); - newBox->SetLinearVelocity(linVel[0],linVel[1],linVel[2],false); - newBox->SetAngularVelocity(0,0,0,false); - } } @@ -513,11 +486,9 @@ void DemoApplication::mouseFunc(int button, int state, int x, int y) if (rayCallback.HasHit()) { - if (rayCallback.m_collisionObject->m_internalOwner) + btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); + if (body) { - btRigidBody* body = (btRigidBody*)rayCallback.m_collisionObject->m_internalOwner; - if (body) - { body->SetActivationState(ACTIVE_TAG); btVector3 impulse = rayTo; impulse.normalize(); @@ -526,39 +497,10 @@ void DemoApplication::mouseFunc(int button, int state, int x, int y) btVector3 relPos = rayCallback.m_hitPointWorld - body->getCenterOfMassPosition(); body->applyImpulse(impulse,relPos); } - } - } } - //apply an impulse - if (m_physicsEnvironmentPtr) - { - float hit[3]; - float normal[3]; - PHY_IPhysicsController* hitObj = m_physicsEnvironmentPtr->rayTest(0,m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2],rayTo.getX(),rayTo.getY(),rayTo.getZ(),hit[0],hit[1],hit[2],normal[0],normal[1],normal[2]); - if (hitObj) - { - CcdPhysicsController* physCtrl = static_cast(hitObj); - btRigidBody* body = physCtrl->getRigidBody(); - if (body) - { - body->SetActivationState(ACTIVE_TAG); - btVector3 impulse = rayTo; - impulse.normalize(); - float impulseStrength = 10.f; - impulse *= impulseStrength; - btVector3 relPos( - hit[0] - body->getCenterOfMassPosition().getX(), - hit[1] - body->getCenterOfMassPosition().getY(), - hit[2] - body->getCenterOfMassPosition().getZ()); - - body->applyImpulse(impulse,relPos); - } - - } - - } + } else { @@ -581,10 +523,11 @@ void DemoApplication::mouseFunc(int button, int state, int x, int y) if (rayCallback.HasHit()) { - if (rayCallback.m_collisionObject->m_internalOwner) + + btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); + if (body) { - btRigidBody* body = (btRigidBody*)rayCallback.m_collisionObject->m_internalOwner; - if (body && !body->IsStatic()) + if (!body->IsStatic()) { pickedBody = body; pickedBody->SetActivationState(DISABLE_DEACTIVATION); @@ -612,51 +555,6 @@ void DemoApplication::mouseFunc(int button, int state, int x, int y) } } - //add a point to point constraint for picking - if (m_physicsEnvironmentPtr) - { - float hit[3]; - float normal[3]; - PHY_IPhysicsController* hitObj = m_physicsEnvironmentPtr->rayTest(0,m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2],rayTo.getX(),rayTo.getY(),rayTo.getZ(),hit[0],hit[1],hit[2],normal[0],normal[1],normal[2]); - if (hitObj) - { - - CcdPhysicsController* physCtrl = static_cast(hitObj); - btRigidBody* body = physCtrl->getRigidBody(); - - if (body && !body->IsStatic()) - { - pickedBody = body; - pickedBody->SetActivationState(DISABLE_DEACTIVATION); - - btVector3 pickPos(hit[0],hit[1],hit[2]); - - btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; - - gPickingConstraintId = m_physicsEnvironmentPtr->createConstraint(physCtrl,0,PHY_POINT2POINT_CONSTRAINT, - localPivot.getX(), - localPivot.getY(), - localPivot.getZ(), - 0,0,0); - //printf("created constraint %i",gPickingConstraintId); - - //save mouse position for dragging - gOldPickingPos = rayTo; - - - btVector3 eyePos(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2]); - - gOldPickingDist = (pickPos-eyePos).length(); - - btPoint2PointConstraint* p2p = static_cast(m_physicsEnvironmentPtr->getConstraintById(gPickingConstraintId)); - if (p2p) - { - //very weak constraint for picking - p2p->m_setting.m_tau = 0.1f; - } - } - } - } } else { @@ -671,17 +569,7 @@ void DemoApplication::mouseFunc(int button, int state, int x, int y) pickedBody = 0; } - if (gPickingConstraintId && m_physicsEnvironmentPtr) - { - m_physicsEnvironmentPtr->removeConstraint(gPickingConstraintId); - //printf("removed constraint %i",gPickingConstraintId); - gPickingConstraintId = 0; - pickedBody->ForceActivationState(ACTIVE_TAG); - pickedBody->m_deactivationTime = 0.f; - pickedBody = 0; - - - } + } break; @@ -717,27 +605,7 @@ void DemoApplication::mouseMotionFunc(int x,int y) } - if (gPickingConstraintId && m_physicsEnvironmentPtr) - { - - //move the constraint pivot - - btPoint2PointConstraint* p2p = static_cast(m_physicsEnvironmentPtr->getConstraintById(gPickingConstraintId)); - if (p2p) - { - //keep it at the same picking distance - - btVector3 newRayTo = getRayTo(x,y); - btVector3 eyePos(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2]); - btVector3 dir = newRayTo-eyePos; - dir.normalize(); - dir *= gOldPickingDist; - - btVector3 newPos = eyePos + dir; - p2p->setPivotB(newPos); - } - - } + } @@ -753,82 +621,27 @@ btRigidBody* DemoApplication::localCreateRigidBody(bool isDynamic, float mass, c btRigidBody* body = new btRigidBody(massProps); body->m_collisionShape = shape; body->m_worldTransform = startTransform; - body->m_internalOwner = body; - body->setMassProps( mass, localInertia); - body->setGravity(btVector3(0,-9.8f,0)); + if (!isDynamic) { body->m_collisionFlags = btCollisionObject::isStatic;//?? +// body->getBroadphaseProxy()->m_collisionFilterGroup = 1;/btCcdConstructionInfo::StaticFilter; +// body->getBroadphaseProxy()->m_collisionFilterMask = btCcdConstructionInfo::AllFilter ^ btCcdConstructionInfo::StaticFilter; + body->setMassProps( 0.f, localInertia); + } else + { + body->setMassProps( mass, localInertia); + body->m_collisionFlags = 0; } + + body->setGravity(m_gravity); + return body; } -///Very basic import -CcdPhysicsController* DemoApplication::localCreatePhysicsObject(bool isDynamic, float mass, const btTransform& startTransform,btCollisionShape* shape) -{ - startTransforms[numObjects] = startTransform; - - btCcdConstructionInfo ccdObjectCi; - ccdObjectCi.m_friction = 0.5f; - - btTransform tr; - tr.setIdentity(); - - int i = numObjects; - { - gShapePtr[i] = shape; - gShapePtr[i]->setMargin(0.05f); - - btQuaternion orn = startTransform.getRotation(); - - ms[i].setWorldOrientation(orn[0],orn[1],orn[2],orn[3]); - ms[i].setWorldPosition(startTransform.getOrigin().getX(),startTransform.getOrigin().getY(),startTransform.getOrigin().getZ()); - - ccdObjectCi.m_MotionState = &ms[i]; - ccdObjectCi.m_gravity = btVector3(0,-9.8,0); - ccdObjectCi.m_localInertiaTensor =btVector3(0,0,0); - if (!isDynamic) - { - ccdObjectCi.m_mass = 0.f; - ccdObjectCi.m_collisionFlags = btCollisionObject::isStatic; - ccdObjectCi.m_collisionFilterGroup = btCcdConstructionInfo::StaticFilter; - ccdObjectCi.m_collisionFilterMask = btCcdConstructionInfo::AllFilter ^ btCcdConstructionInfo::StaticFilter; - } - else - { - ccdObjectCi.m_mass = mass; - ccdObjectCi.m_collisionFlags = 0; - } - - btVector3 localInertia(0.f,0.f,0.f); - - if (isDynamic) - { - gShapePtr[i]->calculateLocalInertia(ccdObjectCi.m_mass,localInertia); - } - - ccdObjectCi.m_localInertiaTensor = localInertia; - ccdObjectCi.m_collisionShape = gShapePtr[i]; - - - physObjects[i]= new CcdPhysicsController( ccdObjectCi); - - // Only do CCD if motion in one timestep (1.f/60.f) exceeds CUBE_HALF_EXTENTS - physObjects[i]->getRigidBody()->m_ccdSquareMotionTreshold = 0.f; - - //Experimental: better estimation of CCD Time of Impact: - //physObjects[i]->getRigidBody()->m_ccdSweptShereRadius = 0.5*CUBE_HALF_EXTENTS; - - m_physicsEnvironmentPtr->addCcdPhysicsController( physObjects[i]); - - } - - //return newly created PhysicsController - return physObjects[numObjects++]; -} void DemoApplication::renderme() { @@ -950,192 +763,4 @@ void DemoApplication::renderme() } - if (m_physicsEnvironmentPtr) - { - - if (getDebugMode() & btIDebugDraw::DBG_DisableBulletLCP) - { - //don't use Bullet, use quickstep - m_physicsEnvironmentPtr->setSolverType(0); - } else - { - //Bullet LCP solver - m_physicsEnvironmentPtr->setSolverType(1); - } - - if (getDebugMode() & btIDebugDraw::DBG_EnableCCD) - { - m_physicsEnvironmentPtr->setCcdMode(3); - } else - { - m_physicsEnvironmentPtr->setCcdMode(0); - } - - - bool isSatEnabled = (getDebugMode() & btIDebugDraw::DBG_EnableSatComparison); - m_physicsEnvironmentPtr->EnableSatCollisionDetection(isSatEnabled); - - - int numPhysicsObjects = m_physicsEnvironmentPtr->GetNumControllers(); - - int i; - - for (i=0;iGetPhysicsController(i); - btRigidBody* body = ctrl->getRigidBody(); - - body->m_worldTransform.getOpenGLMatrix( m ); - - btVector3 wireColor(1.f,1.0f,0.5f); //wants deactivation - if (i & 1) - { - wireColor = btVector3(0.f,0.0f,1.f); - } - ///color differently for active, sleeping, wantsdeactivation states - if (ctrl->getRigidBody()->GetActivationState() == 1) //active - { - if (i & 1) - { - wireColor += btVector3 (1.f,0.f,0.f); - } else - { - wireColor += btVector3 (.5f,0.f,0.f); - } - } - if (ctrl->getRigidBody()->GetActivationState() == 2) //ISLAND_SLEEPING - { - if (i & 1) - { - wireColor += btVector3 (0.f,1.f, 0.f); - } else - { - wireColor += btVector3 (0.f,0.5f,0.f); - } - } - - char extraDebug[125]; - sprintf(extraDebug,"Island:%i, Body:%i",ctrl->getRigidBody()->m_islandTag1,ctrl->getRigidBody()->m_debugBodyId); - ctrl->getRigidBody()->getCollisionShape()->setExtraDebugInfo(extraDebug); - - float vec[16]; - btTransform ident; - ident.setIdentity(); - ident.getOpenGLMatrix(vec); - - - GL_ShapeDrawer::drawOpenGL(m,ctrl->getRigidBody()->getCollisionShape(),wireColor,getDebugMode()); - - - - - } - - if (!(getDebugMode() & btIDebugDraw::DBG_NoHelpText)) - { - - float xOffset = 10.f; - float yStart = 20.f; - - float yIncr = -2.f; - - char buf[124]; - - glColor3f(0, 0, 0); - - #ifdef USE_QUICKPROF - - - if ( getDebugMode() & btIDebugDraw::DBG_ProfileTimings) - { - static int counter = 0; - counter++; - std::map::iterator iter; - for (iter = btProfiler::mProfileBlocks.begin(); iter != btProfiler::mProfileBlocks.end(); ++iter) - { - char blockTime[128]; - sprintf(blockTime, "%s: %lf",&((*iter).first[0]),btProfiler::getBlockTime((*iter).first, btProfiler::BLOCK_CYCLE_SECONDS));//BLOCK_TOTAL_PERCENT)); - glRasterPos3f(xOffset,yStart,0); - BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),blockTime); - yStart += yIncr; - - } - } - #endif //USE_QUICKPROF - //profiling << btProfiler::createStatsString(btProfiler::BLOCK_TOTAL_PERCENT); - //<< std::endl; - - - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"mouse to interact"); - BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"space to reset"); - BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"cursor keys and z,x to navigate"); - BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"i to toggle simulation, s single step"); - BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"q to quit"); - BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"d to toggle deactivation"); - BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"a to draw temporal AABBs"); - BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); - yStart += yIncr; - - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"h to toggle help text"); - BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); - yStart += yIncr; - - bool useBulletLCP = !(getDebugMode() & btIDebugDraw::DBG_DisableBulletLCP); - - bool useCCD = (getDebugMode() & btIDebugDraw::DBG_EnableCCD); - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"m Bullet GJK = %i",!isSatEnabled); - BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"n Bullet LCP = %i",useBulletLCP); - BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"1 CCD mode (adhoc) = %i",useCCD); - BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); - yStart += yIncr; - - glRasterPos3f(xOffset,yStart,0); - sprintf(buf,"+- shooting speed = %10.2f",m_ShootBoxInitialSpeed); - BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); - yStart += yIncr; - - - } - - } - } diff --git a/Demos/OpenGL/DemoApplication.h b/Demos/OpenGL/DemoApplication.h index a76767458..241bd6649 100644 --- a/Demos/OpenGL/DemoApplication.h +++ b/Demos/OpenGL/DemoApplication.h @@ -39,8 +39,6 @@ subject to the following restrictions: #include "LinearMath/btMatrix3x3.h" #include "LinearMath/btTransform.h" -class CcdPhysicsEnvironment; -class CcdPhysicsController; class btCollisionShape; class btDynamicsWorld; class btRigidBody; @@ -53,12 +51,13 @@ class DemoApplication ///this is the most important class - CcdPhysicsEnvironment* m_physicsEnvironmentPtr; - btDynamicsWorld* m_dynamicsWorld; + ///constraint for mouse picking btTypedConstraint* m_pickConstraint; + btVector3 m_gravity; + float m_cameraDistance; int m_debugMode; @@ -82,12 +81,16 @@ class DemoApplication bool m_idle; int m_lastKey; - public: +public: DemoApplication(); virtual ~DemoApplication(); + btDynamicsWorld* getDynamicsWorld() + { + return m_dynamicsWorld; + } int getDebugMode() { @@ -99,10 +102,6 @@ class DemoApplication m_debugMode = mode; } - CcdPhysicsEnvironment* getPhysicsEnvironment() - { - return m_physicsEnvironmentPtr; - } void setCameraUp(const btVector3& camUp) { @@ -142,10 +141,12 @@ class DemoApplication ///Demo functions void shootBox(const btVector3& destination); + void setGravity(const btVector3& grav) + { + m_gravity = grav; + } btVector3 getRayTo(int x,int y); - CcdPhysicsController* localCreatePhysicsObject(bool isDynamic, float mass, const btTransform& startTransform,btCollisionShape* shape); - btRigidBody* localCreateRigidBody(bool isDynamic, float mass, const btTransform& startTransform,btCollisionShape* shape); ///callback methods by glut diff --git a/Demos/OpenGL/GL_ShapeDrawer.cpp b/Demos/OpenGL/GL_ShapeDrawer.cpp index 0ea9b0d5e..03b9e50e3 100644 --- a/Demos/OpenGL/GL_ShapeDrawer.cpp +++ b/Demos/OpenGL/GL_ShapeDrawer.cpp @@ -226,7 +226,7 @@ void GL_ShapeDrawer::drawOpenGL(float* m, const btCollisionShape* shape, const b gluCylinder(quadObj, radius, radius, 2.f*halfHeight, 15, 10); glPopMatrix(); - glEndList(); + gluDeleteQuadric(quadObj); break; } diff --git a/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp b/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp index e82462ad6..195a6aec4 100644 --- a/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp +++ b/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp @@ -13,12 +13,9 @@ subject to the following restrictions: 3. This notice may not be removed or altered from any source distribution. */ -#include "CcdPhysicsEnvironment.h" -#include "CcdPhysicsController.h" #include "btBulletDynamicsCommon.h" #include "LinearMath/btIDebugDraw.h" #include "GLDebugDrawer.h" -#include "PHY_Pro.h" #include "UserCollisionAlgorithm.h" #include "GL_ShapeDrawer.h" #include "GlutStuff.h" @@ -129,7 +126,7 @@ void UserCollisionAlgorithm::initPhysics() dispatcher->registerCollisionCreateFunc(SPHERE_SHAPE_PROXYTYPE,SPHERE_SHAPE_PROXYTYPE,new btSphereSphereCollisionAlgorithm::CreateFunc); - m_physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase); + m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase); bool isDynamic = false; float mass = 0.f; @@ -137,21 +134,23 @@ void UserCollisionAlgorithm::initPhysics() startTransform.setIdentity(); startTransform.setOrigin(btVector3(0,-2,0)); - CcdPhysicsController* staticTrimesh = localCreatePhysicsObject(isDynamic, mass, startTransform,trimeshShape); + btRigidBody* staticBody= localCreateRigidBody(isDynamic, mass, startTransform,trimeshShape); + getDynamicsWorld()->addCollisionObject(staticBody); //enable custom material callback - staticTrimesh->getRigidBody()->m_collisionFlags |= btCollisionObject::customMaterialCallback; + staticBody->m_collisionFlags |= btCollisionObject::customMaterialCallback; { for (int i=0;i<10;i++) { btCollisionShape* sphereShape = new btSphereShape(1); startTransform.setOrigin(btVector3(1,2*i,1)); - localCreatePhysicsObject(true, 1, startTransform,sphereShape); + btRigidBody* body = localCreateRigidBody(true, 1, startTransform,sphereShape); + getDynamicsWorld()->addCollisionObject(body); } } - m_physicsEnvironmentPtr->setGravity(-1,-10,1); - m_physicsEnvironmentPtr->setDebugDrawer(&debugDrawer); + + m_dynamicsWorld->setDebugDrawer(&debugDrawer); } void UserCollisionAlgorithm::clientMoveAndDisplay() @@ -160,7 +159,7 @@ void UserCollisionAlgorithm::clientMoveAndDisplay() float deltaTime = 1.f/60.f; - m_physicsEnvironmentPtr->proceedDeltaTime(0.f,deltaTime); + m_dynamicsWorld->stepSimulation(deltaTime); renderme(); @@ -171,6 +170,7 @@ void UserCollisionAlgorithm::clientMoveAndDisplay() void UserCollisionAlgorithm::clientResetScene() { + /* int numObj = m_physicsEnvironmentPtr->GetNumControllers(); //skip ground @@ -182,6 +182,8 @@ void UserCollisionAlgorithm::clientResetScene() ctrl->SetLinearVelocity(0,0,0,0); ctrl->SetAngularVelocity(0,0,0,0); } + */ + } diff --git a/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp b/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp index 69831b68b..b5b5cf306 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp +++ b/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp @@ -25,8 +25,7 @@ btCollisionObject::btCollisionObject() m_ccdSweptShereRadius(0.f), m_ccdSquareMotionTreshold(0.f) { - m_cachedInvertedWorldTransform.setIdentity(); - + } diff --git a/src/BulletCollision/CollisionDispatch/btCollisionObject.h b/src/BulletCollision/CollisionDispatch/btCollisionObject.h index 591a8e894..9872e94fd 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionObject.h +++ b/src/BulletCollision/CollisionDispatch/btCollisionObject.h @@ -41,8 +41,6 @@ struct btCollisionObject //it can be either previous or future (predicted) transform btTransform m_interpolationWorldTransform; - btTransform m_cachedInvertedWorldTransform; - enum CollisionFlags { isStatic = 1, diff --git a/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp b/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp index 5e4950613..584eaad43 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp +++ b/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp @@ -123,7 +123,6 @@ void btCollisionWorld::performDiscreteCollisionDetection() btVector3 aabbMin,aabbMax; for (size_t i=0;im_cachedInvertedWorldTransform = m_collisionObjects[i]->m_worldTransform.inverse(); m_collisionObjects[i]->m_collisionShape->getAabb(m_collisionObjects[i]->m_worldTransform,aabbMin,aabbMax); m_broadphasePairCache->setAabb(m_collisionObjects[i]->m_broadphaseHandle,aabbMin,aabbMax); } diff --git a/src/BulletCollision/CollisionDispatch/btCollisionWorld.h b/src/BulletCollision/CollisionDispatch/btCollisionWorld.h index a5705b9bc..2280399b2 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionWorld.h +++ b/src/BulletCollision/CollisionDispatch/btCollisionWorld.h @@ -133,7 +133,7 @@ public: struct LocalRayResult { - LocalRayResult(const btCollisionObject* collisionObject, + LocalRayResult(btCollisionObject* collisionObject, LocalShapeInfo* localShapeInfo, const btVector3& hitNormalLocal, float hitFraction) @@ -144,7 +144,7 @@ public: { } - const btCollisionObject* m_collisionObject; + btCollisionObject* m_collisionObject; LocalShapeInfo* m_localShapeInfo; const btVector3& m_hitNormalLocal; float m_hitFraction; @@ -167,7 +167,7 @@ public: :m_closestHitFraction(1.f) { } - virtual float AddSingleResult(const LocalRayResult& rayResult) = 0; + virtual float AddSingleResult(LocalRayResult& rayResult) = 0; }; struct ClosestRayResultCallback : public RayResultCallback @@ -184,9 +184,9 @@ public: btVector3 m_hitNormalWorld; btVector3 m_hitPointWorld; - const btCollisionObject* m_collisionObject; + btCollisionObject* m_collisionObject; - virtual float AddSingleResult(const LocalRayResult& rayResult) + virtual float AddSingleResult(LocalRayResult& rayResult) { //caller already does the filter on the m_closestHitFraction diff --git a/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp b/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp index a5a392563..86da3cf7f 100644 --- a/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp +++ b/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp @@ -217,8 +217,9 @@ float btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btBroadphaseProxy //btVector3 to = convexbody->m_interpolationWorldTransform.getOrigin(); //todo: only do if the motion exceeds the 'radius' - btTransform convexFromLocal = triBody->m_cachedInvertedWorldTransform * convexbody->m_worldTransform; - btTransform convexToLocal = triBody->m_cachedInvertedWorldTransform * convexbody->m_interpolationWorldTransform; + btTransform worldToLocalTrimesh = triBody->m_worldTransform.inverse(); + btTransform convexFromLocal = worldToLocalTrimesh * convexbody->m_worldTransform; + btTransform convexToLocal = worldToLocalTrimesh * convexbody->m_interpolationWorldTransform; struct LocalTriangleSphereCastCallback : public btTriangleCallback { diff --git a/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp b/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp index 1156e36a2..114d7fdc0 100644 --- a/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp +++ b/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp @@ -57,8 +57,8 @@ void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const b return; - btTransform transAInv = m_body0->m_cachedInvertedWorldTransform; - btTransform transBInv= m_body1->m_cachedInvertedWorldTransform; + btTransform transAInv = m_body0->m_worldTransform.inverse(); + btTransform transBInv= m_body1->m_worldTransform.inverse(); //transAInv = m_body0->m_worldTransform.inverse(); //transBInv= m_body1->m_worldTransform.inverse(); diff --git a/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp b/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp index 840428201..d54410bed 100644 --- a/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp +++ b/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp @@ -148,14 +148,12 @@ btVector3 btConvexTriangleMeshShape::localGetSupportingVertex(const btVector3& v int btConvexTriangleMeshShape::getNumVertices() const { //cache this? - assert(0); return 0; } int btConvexTriangleMeshShape::getNumEdges() const { - assert(0); return 0; } diff --git a/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h b/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h index 0cf609dc7..638c8b87f 100644 --- a/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h +++ b/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h @@ -13,6 +13,9 @@ subject to the following restrictions: 3. This notice may not be removed or altered from any source distribution. */ +#ifndef BT_TRIANGLE_INDEX_VERTEX_ARRAY_H +#define BT_TRIANGLE_INDEX_VERTEX_ARRAY_H + #include "btStridingMeshInterface.h" #include @@ -76,3 +79,4 @@ public: }; +#endif //BT_TRIANGLE_INDEX_VERTEX_ARRAY_H diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp index 12722674c..77f0995a4 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp @@ -16,6 +16,7 @@ subject to the following restrictions: #include "btDiscreteDynamicsWorld.h" + //collision detection #include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" #include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" @@ -32,12 +33,14 @@ subject to the following restrictions: #include "BulletDynamics/Vehicle/btRaycastVehicle.h" #include "BulletDynamics/Vehicle/btVehicleRaycaster.h" #include "BulletDynamics/Vehicle/btWheelInfo.h" +#include "LinearMath/btIDebugDraw.h" #include btDiscreteDynamicsWorld::btDiscreteDynamicsWorld() :btDynamicsWorld(), -m_constraintSolver(new btSequentialImpulseConstraintSolver) +m_constraintSolver(new btSequentialImpulseConstraintSolver), +m_debugDrawer(0) { m_islandManager = new btSimulationIslandManager(); m_ownsIslandManager = true; @@ -47,11 +50,12 @@ m_constraintSolver(new btSequentialImpulseConstraintSolver) btDiscreteDynamicsWorld::btDiscreteDynamicsWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache,btConstraintSolver* constraintSolver) :btDynamicsWorld(dispatcher,pairCache), -m_constraintSolver(constraintSolver) +m_constraintSolver(constraintSolver? constraintSolver: new btSequentialImpulseConstraintSolver), +m_debugDrawer(0) { m_islandManager = new btSimulationIslandManager(); m_ownsIslandManager = true; - m_ownsConstraintSolver = false; + m_ownsConstraintSolver = (constraintSolver==0); } @@ -114,10 +118,9 @@ void btDiscreteDynamicsWorld::updateActivationState(float timeStep) for (int i=0;im_internalOwner) + btRigidBody* body = btRigidBody::upcast(colObj); + if (body) { - btRigidBody* body = (btRigidBody*)colObj->m_internalOwner; - body->updateDeactivation(timeStep); if (body->wantsSleeping()) @@ -190,8 +193,8 @@ void btDiscreteDynamicsWorld::solveContactConstraints(btContactSolverInfo& solve }; - btIDebugDraw* debugDraw = 0; - InplaceSolverIslandCallback solverCallback( solverInfo, m_constraintSolver, debugDraw); + + InplaceSolverIslandCallback solverCallback( solverInfo, m_constraintSolver, m_debugDrawer); /// solve all the contact points and contact friction @@ -277,23 +280,60 @@ void btDiscreteDynamicsWorld::calculateSimulationIslands() Profiler::endBlock("IslandUnionFind"); #endif //USE_QUICKPROF +} + +static void DrawAabb(btIDebugDraw* debugDrawer,const btVector3& from,const btVector3& to,const btVector3& color) +{ + btVector3 halfExtents = (to-from)* 0.5f; + btVector3 center = (to+from) *0.5f; + int i,j; + + btVector3 edgecoord(1.f,1.f,1.f),pa,pb; + for (i=0;i<4;i++) + { + for (j=0;j<3;j++) + { + pa = btVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1], + edgecoord[2]*halfExtents[2]); + pa+=center; + + int othercoord = j%3; + edgecoord[othercoord]*=-1.f; + pb = btVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1], + edgecoord[2]*halfExtents[2]); + pb+=center; + + debugDrawer->drawLine(pa,pb,color); + } + edgecoord = btVector3(-1.f,-1.f,-1.f); + if (i<3) + edgecoord[i]*=-1.f; + } + + } void btDiscreteDynamicsWorld::updateAabbs() { + btVector3 colorvec(1,0,0); btTransform predictedTrans; for (int i=0;im_internalOwner) + + btRigidBody* body = btRigidBody::upcast(colObj); + if (body) { - btRigidBody* body = (btRigidBody*)colObj->m_internalOwner; - if (body->IsActive() && (!body->IsStatic())) + // if (body->IsActive() && (!body->IsStatic())) { btPoint3 minAabb,maxAabb; colObj->m_collisionShape->getAabb(colObj->m_worldTransform, minAabb,maxAabb); btSimpleBroadphase* bp = (btSimpleBroadphase*)m_broadphasePairCache; bp->setAabb(body->m_broadphaseHandle,minAabb,maxAabb); + if (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawAabb)) + { + DrawAabb(m_debugDrawer,minAabb,maxAabb,colorvec); + } } } } @@ -305,9 +345,9 @@ void btDiscreteDynamicsWorld::integrateTransforms(float timeStep) for (int i=0;im_internalOwner) + btRigidBody* body = btRigidBody::upcast(colObj); + if (body) { - btRigidBody* body = (btRigidBody*)colObj->m_internalOwner; if (body->IsActive() && (!body->IsStatic())) { body->predictIntegratedTransform(timeStep, predictedTrans); @@ -324,10 +364,9 @@ void btDiscreteDynamicsWorld::predictUnconstraintMotion(float timeStep) for (int i=0;im_internalOwner) + btRigidBody* body = btRigidBody::upcast(colObj); + if (body) { - btRigidBody* body = (btRigidBody*)colObj->m_internalOwner; - body->m_cachedInvertedWorldTransform = body->m_worldTransform.inverse(); if (body->IsActive() && (!body->IsStatic())) { body->applyForces( timeStep); diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h index 394a45eed..f8a41f1a6 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h @@ -25,6 +25,7 @@ class btSimulationIslandManager; class btTypedConstraint; struct btContactSolverInfo; class btRaycastVehicle; +class btIDebugDraw; #include @@ -40,6 +41,8 @@ protected: std::vector m_constraints; + btIDebugDraw* m_debugDrawer; + bool m_ownsIslandManager; bool m_ownsConstraintSolver; @@ -49,8 +52,6 @@ protected: void integrateTransforms(float timeStep); - void updateAabbs(); - void calculateSimulationIslands(); void solveNoncontactConstraints(btContactSolverInfo& solverInfo); @@ -65,7 +66,7 @@ public: ///this btDiscreteDynamicsWorld constructor gets created objects from the user, and will not delete those - btDiscreteDynamicsWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache,btConstraintSolver* constraintSolver); + btDiscreteDynamicsWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache,btConstraintSolver* constraintSolver=0); ///this btDiscreteDynamicsWorld will create and own dispatcher, pairCache and constraintSolver, and deletes it in the destructor. btDiscreteDynamicsWorld(); @@ -74,6 +75,8 @@ public: virtual void stepSimulation( float timeStep); + virtual void updateAabbs(); + void addConstraint(btTypedConstraint* constraint); void removeConstraint(btTypedConstraint* constraint); @@ -97,6 +100,16 @@ public: return this; } + virtual void setDebugDrawer(btIDebugDraw* debugDrawer) + { + m_debugDrawer = debugDrawer; + } + + virtual btIDebugDraw* getDebugDrawer() + { + return m_debugDrawer; + } + }; #endif //BT_DISCRETE_DYNAMICS_WORLD_H diff --git a/src/BulletDynamics/Dynamics/btDynamicsWorld.h b/src/BulletDynamics/Dynamics/btDynamicsWorld.h index ab83a622a..38b55e81f 100644 --- a/src/BulletDynamics/Dynamics/btDynamicsWorld.h +++ b/src/BulletDynamics/Dynamics/btDynamicsWorld.h @@ -40,11 +40,16 @@ class btDynamicsWorld : public btCollisionWorld ///stepSimulation proceeds the simulation over timeStep units virtual void stepSimulation( float timeStep) = 0; + virtual void updateAabbs() = 0; virtual void addConstraint(btTypedConstraint* constraint) {}; virtual void removeConstraint(btTypedConstraint* constraint) {}; - + + virtual void setDebugDrawer(btIDebugDraw* debugDrawer) = 0; + + virtual btIDebugDraw* getDebugDrawer() = 0; + }; #endif //BT_DYNAMICS_WORLD_H diff --git a/src/BulletDynamics/Dynamics/btRigidBody.cpp b/src/BulletDynamics/Dynamics/btRigidBody.cpp index 83b9ae432..81197853d 100644 --- a/src/BulletDynamics/Dynamics/btRigidBody.cpp +++ b/src/BulletDynamics/Dynamics/btRigidBody.cpp @@ -48,6 +48,9 @@ btRigidBody::btRigidBody( const btMassProps& massProps,btScalar linearDamping,bt m_debugBodyId = uniqueId++; + //m_internalOwner is to allow upcasting from collision object to rigid body + m_internalOwner = this; + setMassProps(massProps.m_mass, massProps.m_inertiaLocal); setDamping(linearDamping, angularDamping); m_worldTransform.setIdentity(); diff --git a/src/BulletDynamics/Dynamics/btRigidBody.h b/src/BulletDynamics/Dynamics/btRigidBody.h index fb01f4d7c..a312194e4 100644 --- a/src/BulletDynamics/Dynamics/btRigidBody.h +++ b/src/BulletDynamics/Dynamics/btRigidBody.h @@ -65,6 +65,16 @@ public: void proceedToTransform(const btTransform& newTrans); + ///to keep collision detection and dynamics separate we don't store a rigidbody pointer + ///but a rigidbody is derived from btCollisionObject, so we can safely perform an upcast + static const btRigidBody* upcast(const btCollisionObject* colObj) + { + return (const btRigidBody*)colObj->m_internalOwner; + } + static btRigidBody* upcast(btCollisionObject* colObj) + { + return (btRigidBody*)colObj->m_internalOwner; + } /// continuous collision detection needs prediction void predictIntegratedTransform(btScalar step, btTransform& predictedTransform) const; diff --git a/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp b/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp index 1464547e5..6143049eb 100644 --- a/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp +++ b/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp @@ -24,14 +24,16 @@ subject to the following restrictions: btSimpleDynamicsWorld::btSimpleDynamicsWorld() :m_constraintSolver(new btSequentialImpulseConstraintSolver), -m_ownsConstraintSolver(true) +m_ownsConstraintSolver(true), +m_debugDrawer(0) { } btSimpleDynamicsWorld::btSimpleDynamicsWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache,btConstraintSolver* constraintSolver) :btDynamicsWorld(dispatcher,pairCache), m_constraintSolver(constraintSolver), -m_ownsConstraintSolver(false) +m_ownsConstraintSolver(false), +m_debugDrawer(0) { } @@ -56,8 +58,8 @@ void btSimpleDynamicsWorld::stepSimulation(float timeStep) int numManifolds = m_dispatcher1->getNumManifolds(); btContactSolverInfo infoGlobal; infoGlobal.m_timeStep = timeStep; - btIDebugDraw* debugDrawer=0; - m_constraintSolver->solveGroup(manifoldPtr, numManifolds,infoGlobal,debugDrawer); + + m_constraintSolver->solveGroup(manifoldPtr, numManifolds,infoGlobal,m_debugDrawer); ///integrate transforms integrateTransforms(timeStep); @@ -74,9 +76,9 @@ void btSimpleDynamicsWorld::updateAabbs() for (int i=0;im_internalOwner) + btRigidBody* body = btRigidBody::upcast(colObj); + if (body) { - btRigidBody* body = (btRigidBody*)colObj->m_internalOwner; if (body->IsActive() && (!body->IsStatic())) { btPoint3 minAabb,maxAabb; @@ -94,9 +96,9 @@ void btSimpleDynamicsWorld::integrateTransforms(float timeStep) for (int i=0;im_internalOwner) + btRigidBody* body = btRigidBody::upcast(colObj); + if (body) { - btRigidBody* body = (btRigidBody*)colObj->m_internalOwner; if (body->IsActive() && (!body->IsStatic())) { body->predictIntegratedTransform(timeStep, predictedTrans); @@ -113,10 +115,9 @@ void btSimpleDynamicsWorld::predictUnconstraintMotion(float timeStep) for (int i=0;im_internalOwner) + btRigidBody* body = btRigidBody::upcast(colObj); + if (body) { - btRigidBody* body = (btRigidBody*)colObj->m_internalOwner; - body->m_cachedInvertedWorldTransform = body->m_worldTransform.inverse(); if (body->IsActive() && (!body->IsStatic())) { body->applyForces( timeStep); diff --git a/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h b/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h index 9aac55db8..52725830c 100644 --- a/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h +++ b/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h @@ -35,12 +35,13 @@ protected: bool m_ownsConstraintSolver; + btIDebugDraw* m_debugDrawer; + void predictUnconstraintMotion(float timeStep); void integrateTransforms(float timeStep); - void updateAabbs(); - + public: @@ -54,6 +55,17 @@ public: virtual void stepSimulation( float timeStep); + virtual void setDebugDrawer(btIDebugDraw* debugDrawer) + { + m_debugDrawer = debugDrawer; + }; + + virtual btIDebugDraw* getDebugDrawer() + { + return m_debugDrawer; + } + + virtual void updateAabbs(); }; #endif //BT_SIMPLE_DYNAMICS_WORLD_H diff --git a/src/LinearMath/btTransform.h b/src/LinearMath/btTransform.h index baeb0337a..af38d8eb7 100644 --- a/src/LinearMath/btTransform.h +++ b/src/LinearMath/btTransform.h @@ -41,37 +41,26 @@ public: explicit SIMD_FORCE_INLINE btTransform(const btQuaternion& q, const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0))) : m_basis(q), - m_origin(c), - m_type(RIGID) + m_origin(c) {} explicit SIMD_FORCE_INLINE btTransform(const btMatrix3x3& b, const btVector3& c = btVector3(btScalar(0), btScalar(0), btScalar(0)), unsigned int type = AFFINE) : m_basis(b), - m_origin(c), - m_type(type) + m_origin(c) {} SIMD_FORCE_INLINE void mult(const btTransform& t1, const btTransform& t2) { m_basis = t1.m_basis * t2.m_basis; m_origin = t1(t2.m_origin); - m_type = t1.m_type | t2.m_type; } void multInverseLeft(const btTransform& t1, const btTransform& t2) { btVector3 v = t2.m_origin - t1.m_origin; - if (t1.m_type & SCALING) { - btMatrix3x3 inv = t1.m_basis.inverse(); - m_basis = inv * t2.m_basis; - m_origin = inv * v; - } - else { - m_basis = btMultTransposeLeft(t1.m_basis, t2.m_basis); - m_origin = v * t1.m_basis; - } - m_type = t1.m_type | t2.m_type; + m_basis = btMultTransposeLeft(t1.m_basis, t2.m_basis); + m_origin = v * t1.m_basis; } SIMD_FORCE_INLINE btVector3 operator()(const btVector3& x) const @@ -102,7 +91,6 @@ public: { m_basis.setValue(m); m_origin.setValue(&m[12]); - m_type = AFFINE; } @@ -126,7 +114,6 @@ public: SIMD_FORCE_INLINE void setOrigin(const btVector3& origin) { m_origin = origin; - m_type |= TRANSLATION; } SIMD_FORCE_INLINE btVector3 invXform(const btVector3& inVec) const; @@ -136,50 +123,36 @@ public: SIMD_FORCE_INLINE void setBasis(const btMatrix3x3& basis) { m_basis = basis; - m_type |= LINEAR; } SIMD_FORCE_INLINE void setRotation(const btQuaternion& q) { m_basis.setRotation(q); - m_type = (m_type & ~LINEAR) | ROTATION; } SIMD_FORCE_INLINE void scale(const btVector3& scaling) { m_basis = m_basis.scaled(scaling); - m_type |= SCALING; } void setIdentity() { m_basis.setIdentity(); m_origin.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0)); - m_type = 0x0; } - SIMD_FORCE_INLINE bool isIdentity() const { return m_type == 0x0; } - + btTransform& operator*=(const btTransform& t) { m_origin += m_basis * t.m_origin; m_basis *= t.m_basis; - m_type |= t.m_type; return *this; } btTransform inverse() const { - if (m_type) - { - btMatrix3x3 inv = (m_type & SCALING) ? - m_basis.inverse() : - m_basis.transpose(); - - return btTransform(inv, inv * -m_origin, m_type); - } - - return *this; + btMatrix3x3 inv = m_basis.transpose(); + return btTransform(inv, inv * -m_origin); } btTransform inverseTimes(const btTransform& t) const; @@ -190,7 +163,6 @@ private: btMatrix3x3 m_basis; btVector3 m_origin; - unsigned int m_type; }; @@ -205,25 +177,15 @@ SIMD_FORCE_INLINE btTransform btTransform::inverseTimes(const btTransform& t) const { btVector3 v = t.getOrigin() - m_origin; - if (m_type & SCALING) - { - btMatrix3x3 inv = m_basis.inverse(); - return btTransform(inv * t.getBasis(), inv * v, - m_type | t.m_type); - } - else - { return btTransform(m_basis.transposeTimes(t.m_basis), - v * m_basis, m_type | t.m_type); - } + v * m_basis); } SIMD_FORCE_INLINE btTransform btTransform::operator*(const btTransform& t) const { return btTransform(m_basis * t.m_basis, - (*this)(t.m_origin), - m_type | t.m_type); + (*this)(t.m_origin)); } diff --git a/src/btBulletDynamicsCommon.h b/src/btBulletDynamicsCommon.h index 63765b998..8d5cb6ed0 100644 --- a/src/btBulletDynamicsCommon.h +++ b/src/btBulletDynamicsCommon.h @@ -24,6 +24,8 @@ subject to the following restrictions: #include "BulletDynamics/Dynamics/btRigidBody.h" #include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h" #include "BulletDynamics/ConstraintSolver/btHingeConstraint.h" +#include "BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h" + #include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" ///Vehicle simulation, with wheel contact simulated by raycasts #include "BulletDynamics/Vehicle/btRaycastVehicle.h"