From 054d6725923215786c4b564064560c30e5bedd58 Mon Sep 17 00:00:00 2001 From: ejcoumans Date: Tue, 6 Mar 2007 09:59:17 +0000 Subject: [PATCH] - removed STL from the Bullet library: replace std::vector by btAlignedObjectArray. Also removed the std::set for overlapping pair set, and turned it into an overlapping pair array. The SAP only adds objects, never removed. Removal is postponed for during traversal of overlapping pairs (duplicates and non-overlapping pairs are removed during that traversal). - added heap sort and binary search/linear search to btAlignedObjectArray - fixed wrong cast, thanks Hamstray, http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1015 --- Demos/BasicDemo/BasicDemo.cpp | 3 +- Demos/BasicDemo/BasicDemo.h | 3 +- Demos/BspDemo/BspConverter.cpp | 3 + Demos/BspDemo/BspConverter.h | 1 - Demos/BspDemo/BspDemo.cpp | 2 +- Demos/BspDemo/BspLoader.cpp | 16 +++ Demos/BspDemo/BspLoader.h | 49 +++---- Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp | 1 + Demos/ColladaDemo/ColladaConverter.cpp | 7 +- Demos/ConcaveDemo/ConcavePhysicsDemo.cpp | 1 - Demos/ConstraintDemo/ConstraintDemo.cpp | 1 - Demos/MovingConcaveDemo/ConcaveDemo.h | 2 +- .../MovingConcaveDemo/ConcavePhysicsDemo.cpp | 1 - Demos/OpenGL/DemoApplication.cpp | 15 ++- Demos/OpenGL/DemoApplication.h | 3 +- Demos/OpenGL/GLDebugDrawer.cpp | 5 + Demos/OpenGL/GLDebugDrawer.h | 2 + .../UserCollisionAlgorithm.cpp | 2 - Demos/VehicleDemo/VehicleDemo.cpp | 1 - .../BoxBoxDetector.cpp | 1 + .../btConcaveConcaveCollisionAlgorithm.cpp | 2 +- .../btConcaveConcaveCollisionAlgorithm.h | 4 +- Extras/GIMPACTBullet/btGIMPACTMeshShape.h | 7 +- Extras/quickstep/OdeConstraintSolver.cpp | 1 + .../BroadphaseCollision/btAxisSweep3.cpp | 98 ++++++++++++++ .../BroadphaseCollision/btAxisSweep3.h | 6 +- .../BroadphaseCollision/btBroadphaseProxy.h | 25 +++- .../btOverlappingPairCache.cpp | 55 ++++---- .../btOverlappingPairCache.h | 7 +- .../btSimpleBroadphase.cpp | 2 +- .../CollisionDispatch/btCollisionCreateFunc.h | 5 +- .../btCollisionDispatcher.cpp | 12 +- .../CollisionDispatch/btCollisionDispatcher.h | 4 +- .../CollisionDispatch/btCollisionWorld.cpp | 35 ++--- .../CollisionDispatch/btCollisionWorld.h | 7 +- .../btCompoundCollisionAlgorithm.h | 4 +- .../btSimulationIslandManager.cpp | 43 ++++-- .../CollisionDispatch/btUnionFind.cpp | 18 ++- .../CollisionDispatch/btUnionFind.h | 5 +- .../CollisionShapes/btCompoundShape.h | 1 - .../CollisionShapes/btConvexShape.h | 1 - .../btConvexTriangleMeshShape.h | 1 - .../CollisionShapes/btEmptyShape.h | 1 - .../btPersistentManifold.h | 2 + .../btGeneric6DofConstraint.cpp | 1 + .../ConstraintSolver/btHingeConstraint.cpp | 2 +- .../btPoint2PointConstraint.cpp | 2 +- .../btSequentialImpulseConstraintSolver.cpp | 2 +- .../Dynamics/btDiscreteDynamicsWorld.cpp | 59 ++++----- .../Dynamics/btDiscreteDynamicsWorld.h | 6 +- src/BulletDynamics/Dynamics/btRigidBody.h | 2 - src/LinearMath/btAlignedObjectArray.h | 123 ++++++++++++++++++ src/LinearMath/btIDebugDraw.h | 3 + src/LinearMath/btQuickprof.h | 93 +++++++------ 54 files changed, 512 insertions(+), 246 deletions(-) diff --git a/Demos/BasicDemo/BasicDemo.cpp b/Demos/BasicDemo/BasicDemo.cpp index ba2a8628b..7f12eac9c 100644 --- a/Demos/BasicDemo/BasicDemo.cpp +++ b/Demos/BasicDemo/BasicDemo.cpp @@ -117,8 +117,9 @@ void BasicDemo::initPhysics() m_dispatcher = new btCollisionDispatcher(true); - +//#define USE_SWEEP_AND_PRUNE 1 #ifdef USE_SWEEP_AND_PRUNE +#define maxProxies 8192 btVector3 worldAabbMin(-10000,-10000,-10000); btVector3 worldAabbMax(10000,10000,10000); m_overlappingPairCache = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); diff --git a/Demos/BasicDemo/BasicDemo.h b/Demos/BasicDemo/BasicDemo.h index acad21c27..21b7cba7f 100644 --- a/Demos/BasicDemo/BasicDemo.h +++ b/Demos/BasicDemo/BasicDemo.h @@ -17,7 +17,6 @@ subject to the following restrictions: #include "DemoApplication.h" -#include class btCollisionShape; class btOverlappingPairCache; @@ -30,7 +29,7 @@ class BasicDemo : public DemoApplication { //keep the collision shapes, for deletion/cleanup - std::vector m_collisionShapes; + btAlignedObjectArray m_collisionShapes; btOverlappingPairCache* m_overlappingPairCache; diff --git a/Demos/BspDemo/BspConverter.cpp b/Demos/BspDemo/BspConverter.cpp index 9b4d94137..c85a35e1a 100644 --- a/Demos/BspDemo/BspConverter.cpp +++ b/Demos/BspDemo/BspConverter.cpp @@ -17,6 +17,9 @@ subject to the following restrictions: #include "BspLoader.h" #include "LinearMath/btVector3.h" #include "LinearMath/btGeometryUtil.h" +#include +#include + void BspConverter::convertBsp(BspLoader& bspLoader,float scaling) { diff --git a/Demos/BspDemo/BspConverter.h b/Demos/BspDemo/BspConverter.h index 743d46da9..775309330 100644 --- a/Demos/BspDemo/BspConverter.h +++ b/Demos/BspDemo/BspConverter.h @@ -17,7 +17,6 @@ subject to the following restrictions: #define BSP_CONVERTER_H class BspLoader; -#include #include "LinearMath/btVector3.h" #include "LinearMath/btAlignedObjectArray.h" diff --git a/Demos/BspDemo/BspDemo.cpp b/Demos/BspDemo/BspDemo.cpp index fc836a4ef..17f3f8393 100644 --- a/Demos/BspDemo/BspDemo.cpp +++ b/Demos/BspDemo/BspDemo.cpp @@ -195,9 +195,9 @@ void BspDemo::initPhysics(char* bspfilename) void BspDemo::clientMoveAndDisplay() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - float dt = m_clock.getTimeMicroseconds() * 0.000001f; m_clock.reset(); + m_dynamicsWorld->stepSimulation(dt); renderme(); diff --git a/Demos/BspDemo/BspLoader.cpp b/Demos/BspDemo/BspLoader.cpp index 65ffc845e..c5f274913 100644 --- a/Demos/BspDemo/BspLoader.cpp +++ b/Demos/BspDemo/BspLoader.cpp @@ -22,6 +22,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "BspLoader.h" +#include +#include typedef struct { @@ -45,6 +47,20 @@ bool tokenready; // only true if UnGetToken was just called int extrasize = 100; +BspLoader::BspLoader() + :m_num_entities(0) +{ + m_Endianness = getMachineEndianness(); + if (m_Endianness == BSP_BIG_ENDIAN) + { + printf("Machine is BIG_ENDIAN\n"); + } else + { + printf("Machine is Little Endian\n"); + } +} + + bool BspLoader::loadBSPFile( void* memoryBuffer) { BSPHeader *header = (BSPHeader*) memoryBuffer; diff --git a/Demos/BspDemo/BspLoader.h b/Demos/BspDemo/BspLoader.h index f2ceed470..cf57e64f9 100644 --- a/Demos/BspDemo/BspLoader.h +++ b/Demos/BspDemo/BspLoader.h @@ -25,6 +25,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #ifndef BSP_LOADER_H #define BSP_LOADER_H +#include "LinearMath/btAlignedObjectArray.h" + #define BSPMAXTOKEN 1024 #define BSPMAX_KEY 32 #define BSPMAX_VALUE 1024 @@ -49,7 +51,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #define HEADER_LUMPS 17 #define MAX_QPATH 64 -#include typedef struct { @@ -172,18 +173,8 @@ class BspLoader public: - BspLoader() - :m_num_entities(0) - { - m_Endianness = getMachineEndianness(); - if (m_Endianness == BSP_BIG_ENDIAN) - { - printf("Machine is BIG_ENDIAN\n"); - } else - { - printf("Machine is Little Endian\n"); - } - } + BspLoader(); + bool loadBSPFile( void* memoryBuffer); const char* getValueForKey( const BSPEntity *ent, const char *key ) const; @@ -236,53 +227,53 @@ class BspLoader public: //easier for conversion int m_num_entities; - std::vector m_entities; + btAlignedObjectArray m_entities; int m_nummodels; - std::vector m_dmodels; + btAlignedObjectArray m_dmodels; int m_numShaders; - std::vector m_dshaders; + btAlignedObjectArray m_dshaders; int m_entdatasize; - std::vector m_dentdata; + btAlignedObjectArray m_dentdata; int m_numleafs; - std::vector m_dleafs; + btAlignedObjectArray m_dleafs; int m_numplanes; - std::vector m_dplanes; + btAlignedObjectArray m_dplanes; int m_numnodes; - std::vector m_dnodes; + btAlignedObjectArray m_dnodes; int m_numleafsurfaces; - std::vector m_dleafsurfaces; + btAlignedObjectArray m_dleafsurfaces; int m_numleafbrushes; - std::vector m_dleafbrushes; + btAlignedObjectArray m_dleafbrushes; int m_numbrushes; - std::vector m_dbrushes; + btAlignedObjectArray m_dbrushes; int m_numbrushsides; - std::vector m_dbrushsides; + btAlignedObjectArray m_dbrushsides; int m_numLightBytes; - std::vector m_lightBytes; + btAlignedObjectArray m_lightBytes; int m_numGridPoints; - std::vector m_gridData; + btAlignedObjectArray m_gridData; int m_numVisBytes; - std::vector m_visBytes; + btAlignedObjectArray m_visBytes; int m_numDrawIndexes; - std::vector m_drawIndexes; + btAlignedObjectArray m_drawIndexes; int m_numDrawSurfaces; - std::vector m_drawSurfaces; + btAlignedObjectArray m_drawSurfaces; enum { diff --git a/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp b/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp index 6026c3cf4..9d1317e42 100644 --- a/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp +++ b/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp @@ -203,6 +203,7 @@ void CcdPhysicsDemo::clientMoveAndDisplay() #endif //USE_KINEMATIC_GROUND + float dt = m_clock.getTimeMicroseconds() * 0.000001f; m_clock.reset(); printf("dt = %f: ",dt); diff --git a/Demos/ColladaDemo/ColladaConverter.cpp b/Demos/ColladaDemo/ColladaConverter.cpp index f8603b17b..bffa01af6 100644 --- a/Demos/ColladaDemo/ColladaConverter.cpp +++ b/Demos/ColladaDemo/ColladaConverter.cpp @@ -747,7 +747,10 @@ void ColladaConverter::PreparePhysicsObject(struct btRigidBodyInput& input, bool } + if (startScale.length() < 0.001) + printf("invalid scale\n"); + colShape->setLocalScaling(startScale); btRigidBody* body= createRigidBody(isDynamics,mass,startTransform,colShape); if (body) @@ -881,7 +884,7 @@ bool ColladaConverter::saveAs(const char* filename) } //some code that de-mangles the windows filename passed in as argument -char cleaned_filename[512]; +char cleaned_filename[513]; char* getLastFileName() { return cleaned_filename; @@ -928,7 +931,7 @@ char* fixFileName(const char* lpCmdLine) out++; } - cleaned_filename[i] = '\0'; + cleaned_filename[i+1] = '\0'; return cleaned_filename; } diff --git a/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp b/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp index bee786e07..8fced2c13 100644 --- a/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp +++ b/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp @@ -192,7 +192,6 @@ void ConcaveDemo::clientMoveAndDisplay() float dt = m_clock.getTimeMicroseconds() * 0.000001f; m_clock.reset(); - m_dynamicsWorld->stepSimulation(dt); renderme(); diff --git a/Demos/ConstraintDemo/ConstraintDemo.cpp b/Demos/ConstraintDemo/ConstraintDemo.cpp index 33482de67..cc5128023 100644 --- a/Demos/ConstraintDemo/ConstraintDemo.cpp +++ b/Demos/ConstraintDemo/ConstraintDemo.cpp @@ -172,7 +172,6 @@ void ConstraintDemo::clientMoveAndDisplay() float dt = float(m_clock.getTimeMicroseconds()) * 0.000001f; m_clock.reset(); - //printf("dt = %f: ",dt); { diff --git a/Demos/MovingConcaveDemo/ConcaveDemo.h b/Demos/MovingConcaveDemo/ConcaveDemo.h index d29ae5d22..f6f736ba7 100644 --- a/Demos/MovingConcaveDemo/ConcaveDemo.h +++ b/Demos/MovingConcaveDemo/ConcaveDemo.h @@ -17,7 +17,7 @@ subject to the following restrictions: #include "DemoApplication.h" -class btCollisionAlgorithmCreateFunc; +struct btCollisionAlgorithmCreateFunc; ///ConcaveDemo shows usage of static concave triangle meshes ///It also shows per-triangle material (friction/restitution) through CustomMaterialCombinerCallback diff --git a/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp b/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp index f21c25e95..03df126b7 100644 --- a/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp +++ b/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp @@ -1868,7 +1868,6 @@ void ConcaveDemo::clientMoveAndDisplay() float dt = float(m_clock.getTimeMicroseconds()) * 0.000001f; m_clock.reset(); - m_dynamicsWorld->stepSimulation(dt); renderme(); diff --git a/Demos/OpenGL/DemoApplication.cpp b/Demos/OpenGL/DemoApplication.cpp index 15344b41f..de2fcf269 100644 --- a/Demos/OpenGL/DemoApplication.cpp +++ b/Demos/OpenGL/DemoApplication.cpp @@ -900,13 +900,16 @@ void DemoApplication::clientResetScene() { btCollisionObject* colObj = m_dynamicsWorld->getCollisionObjectArray()[i]; btRigidBody* body = btRigidBody::upcast(colObj); - if (body && body->getMotionState()) + if (body) { - btDefaultMotionState* myMotionState = (btDefaultMotionState*)body->getMotionState(); - myMotionState->m_graphicsWorldTrans = myMotionState->m_startWorldTrans; - colObj->setWorldTransform( myMotionState->m_graphicsWorldTrans ); - colObj->setInterpolationWorldTransform( myMotionState->m_startWorldTrans ); - colObj->activate(); + if (body->getMotionState()) + { + btDefaultMotionState* myMotionState = (btDefaultMotionState*)body->getMotionState(); + myMotionState->m_graphicsWorldTrans = myMotionState->m_startWorldTrans; + colObj->setWorldTransform( myMotionState->m_graphicsWorldTrans ); + colObj->setInterpolationWorldTransform( myMotionState->m_startWorldTrans ); + colObj->activate(); + } //removed cached contact points m_dynamicsWorld->getBroadphase()->cleanProxyFromPairs(colObj->getBroadphaseHandle()); diff --git a/Demos/OpenGL/DemoApplication.h b/Demos/OpenGL/DemoApplication.h index 4af74af0d..f1388462a 100644 --- a/Demos/OpenGL/DemoApplication.h +++ b/Demos/OpenGL/DemoApplication.h @@ -49,9 +49,8 @@ class DemoApplication { protected: - - hidden::Clock m_clock; + btClock m_clock; ///this is the most important class btDynamicsWorld* m_dynamicsWorld; diff --git a/Demos/OpenGL/GLDebugDrawer.cpp b/Demos/OpenGL/GLDebugDrawer.cpp index 1994fbaea..3de66b155 100644 --- a/Demos/OpenGL/GLDebugDrawer.cpp +++ b/Demos/OpenGL/GLDebugDrawer.cpp @@ -40,6 +40,11 @@ void GLDebugDrawer::setDebugMode(int debugMode) } +void GLDebugDrawer::reportErrorWarning(const char* warningString) +{ + printf(warningString); +} + void GLDebugDrawer::drawContactPoint(const btVector3& pointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color) { if (m_debugMode & btIDebugDraw::DBG_DrawContactPoints) diff --git a/Demos/OpenGL/GLDebugDrawer.h b/Demos/OpenGL/GLDebugDrawer.h index 96451cc1f..015812033 100644 --- a/Demos/OpenGL/GLDebugDrawer.h +++ b/Demos/OpenGL/GLDebugDrawer.h @@ -19,6 +19,8 @@ public: virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color); + virtual void reportErrorWarning(const char* warningString); + virtual void setDebugMode(int debugMode); virtual int getDebugMode() const { return m_debugMode;} diff --git a/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp b/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp index 7f17b3e1c..01da0965d 100644 --- a/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp +++ b/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp @@ -143,10 +143,8 @@ void UserCollisionAlgorithm::clientMoveAndDisplay() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - float dt = m_clock.getTimeMicroseconds() * 0.000001f; m_clock.reset(); - m_dynamicsWorld->stepSimulation(dt); diff --git a/Demos/VehicleDemo/VehicleDemo.cpp b/Demos/VehicleDemo/VehicleDemo.cpp index 4c7782bc8..933cd95fd 100644 --- a/Demos/VehicleDemo/VehicleDemo.cpp +++ b/Demos/VehicleDemo/VehicleDemo.cpp @@ -325,7 +325,6 @@ void VehicleDemo::clientMoveAndDisplay() float dt = m_clock.getTimeMicroseconds() * 0.000001f; m_clock.reset(); - if (m_dynamicsWorld) { //during idle mode, just run 1 simulation step maximum diff --git a/Extras/AlternativeCollisionAlgorithms/BoxBoxDetector.cpp b/Extras/AlternativeCollisionAlgorithms/BoxBoxDetector.cpp index 002690375..ae851693b 100644 --- a/Extras/AlternativeCollisionAlgorithms/BoxBoxDetector.cpp +++ b/Extras/AlternativeCollisionAlgorithms/BoxBoxDetector.cpp @@ -25,6 +25,7 @@ #include "BulletCollision/CollisionShapes/btBoxShape.h" #include +#include BoxBoxDetector::BoxBoxDetector(btBoxShape* box1,btBoxShape* box2) : m_box1(box1), diff --git a/Extras/GIMPACTBullet/btConcaveConcaveCollisionAlgorithm.cpp b/Extras/GIMPACTBullet/btConcaveConcaveCollisionAlgorithm.cpp index 27ff9fb96..285aac89a 100644 --- a/Extras/GIMPACTBullet/btConcaveConcaveCollisionAlgorithm.cpp +++ b/Extras/GIMPACTBullet/btConcaveConcaveCollisionAlgorithm.cpp @@ -296,7 +296,7 @@ class btConcaveTriangleCallback : public btTriangleCallback public: btCollisionObject* m_body; mat4f m_transform; - std::vector m_triangles; + btAlignedObjectArray m_triangles; btConcaveTriangleCallback(btCollisionObject* body) { diff --git a/Extras/GIMPACTBullet/btConcaveConcaveCollisionAlgorithm.h b/Extras/GIMPACTBullet/btConcaveConcaveCollisionAlgorithm.h index 8f5c5a934..952a8185a 100644 --- a/Extras/GIMPACTBullet/btConcaveConcaveCollisionAlgorithm.h +++ b/Extras/GIMPACTBullet/btConcaveConcaveCollisionAlgorithm.h @@ -26,13 +26,13 @@ class btDispatcher; #include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" #include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" - +#include "LinearMath/btAlignedObjectArray.h" /// btConcaveConcaveCollisionAlgorithm supports collision between btBvhTriangleMeshShape shapes class btConcaveConcaveCollisionAlgorithm : public btCollisionAlgorithm { protected: - std::vector m_mainfoldsPtr; + btAlignedObjectArray m_mainfoldsPtr; public: btConcaveConcaveCollisionAlgorithm( const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1); diff --git a/Extras/GIMPACTBullet/btGIMPACTMeshShape.h b/Extras/GIMPACTBullet/btGIMPACTMeshShape.h index ce42629a4..d333e369c 100644 --- a/Extras/GIMPACTBullet/btGIMPACTMeshShape.h +++ b/Extras/GIMPACTBullet/btGIMPACTMeshShape.h @@ -18,7 +18,8 @@ subject to the following restrictions: #include "BulletCollision/CollisionShapes/btConcaveShape.h" #include "BulletCollision/CollisionShapes/btStridingMeshInterface.h" -#include +#include "LinearMath/btAlignedObjectArray.h" + //#define GIMPACT_SHAPE_PROXYTYPE (MAX_BROADPHASE_COLLISION_TYPES + 1) @@ -29,7 +30,7 @@ Each mesh part must have a GIMPACT trimesh data (GIM_TRIMESH_DATA). typedef unsigned long BT_GIMPACT_TRIMESH_DATA_HANDLE; -class BT_GIMPACT_TRIMESH_DATA_HANDLE_ARRAY: public std::vector +class BT_GIMPACT_TRIMESH_DATA_HANDLE_ARRAY: public btAlignedObjectArray { public: @@ -57,7 +58,7 @@ Each mesh part must have a GIMPACT trimesh (GIM_TRIMESH). typedef void * BT_GIMPACT_TRIMESH_HANDLE; -class BT_GIMPACT_TRIMESH_HANDLE_ARRAY: public std::vector +class BT_GIMPACT_TRIMESH_HANDLE_ARRAY: public btAlignedObjectArray { public: diff --git a/Extras/quickstep/OdeConstraintSolver.cpp b/Extras/quickstep/OdeConstraintSolver.cpp index 4d3dea7c2..43d433369 100644 --- a/Extras/quickstep/OdeConstraintSolver.cpp +++ b/Extras/quickstep/OdeConstraintSolver.cpp @@ -25,6 +25,7 @@ subject to the following restrictions: #include "OdeJoint.h" #include "OdeContactJoint.h" #include "OdeSolverBody.h" +#include #include "LinearMath/btIDebugDraw.h" diff --git a/src/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp b/src/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp index 63e6069d7..e415df922 100644 --- a/src/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp +++ b/src/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp @@ -50,6 +50,7 @@ void btAxisSweep3::setAabb(btBroadphaseProxy* proxy,const btVector3& aabbMin,con btAxisSweep3::btAxisSweep3(const btPoint3& worldAabbMin,const btPoint3& worldAabbMax, int maxHandles) :btOverlappingPairCache() { + m_invalidPair = 0; //assert(bounds.HasVolume()); // 1 handle is reserved as sentinel @@ -249,6 +250,97 @@ void btAxisSweep3::removeHandle(unsigned short handle) } +extern int gOverlappingPairs; + +void btAxisSweep3::processAllOverlappingPairs(btOverlapCallback* callback) +{ + + //perform a sort, to find duplicates and to sort 'invalid' pairs to the end + m_overlappingPairArray.heapSort(btBroadphasePairSortPredicate()); + + //remove the 'invalid' ones +#ifdef USE_POPBACK_REMOVAL + while (m_invalidPair>0) + { + m_invalidPair--; + m_overlappingPairArray.pop_back(); + } +#else + m_overlappingPairArray.resize(m_overlappingPairArray.size() - m_invalidPair); + m_invalidPair = 0; +#endif + int i; + + btBroadphasePair previousPair; + previousPair.m_pProxy0 = 0; + previousPair.m_pProxy1 = 0; + previousPair.m_algorithm = 0; + + + for (i=0;iprocessOverlap(pair); + } else + { + needsRemoval = true; + } + } else + { + //remove duplicate + needsRemoval = true; + //should have no algorithm + btAssert(!pair.m_algorithm); + } + + if (needsRemoval) + { + cleanOverlappingPair(pair); + + // m_overlappingPairArray.swap(i,m_overlappingPairArray.size()-1); + // m_overlappingPairArray.pop_back(); + pair.m_pProxy0 = 0; + pair.m_pProxy1 = 0; + m_invalidPair++; + gOverlappingPairs--; + } + + } +} + + +bool btAxisSweep3::testOverlap(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1) +{ + const Handle* pHandleA = static_cast(proxy0); + const Handle* pHandleB = static_cast(proxy1); + + //optimization 1: check the array index (memory address), instead of the m_pos + + for (int axis = 0; axis < 3; axis++) + { + if (pHandleA->m_maxEdges[axis] < pHandleB->m_minEdges[axis] || + pHandleB->m_maxEdges[axis] < pHandleA->m_minEdges[axis]) + { + return false; + } + } + return true; +} + bool btAxisSweep3::testOverlap(int ignoreAxis,const Handle* pHandleA, const Handle* pHandleB) { //optimization 1: check the array index (memory address), instead of the m_pos @@ -379,10 +471,12 @@ void btAxisSweep3::sortMinUp(int axis, unsigned short edge, bool updateOverlaps) // if next edge is maximum remove any overlap between the two handles if (updateOverlaps) { + /* Handle* handle0 = getHandle(pEdge->m_handle); Handle* handle1 = getHandle(pNext->m_handle); btBroadphasePair tmpPair(*handle0,*handle1); removeOverlappingPair(tmpPair); + */ } @@ -421,6 +515,8 @@ void btAxisSweep3::sortMaxDown(int axis, unsigned short edge, bool updateOverlap // if previous edge was a minimum remove any overlap between the two handles if (updateOverlaps) { + //this is done during the overlappingpairarray iteration/narrowphase collision + /* Handle* handle0 = getHandle(pEdge->m_handle); Handle* handle1 = getHandle(pPrev->m_handle); btBroadphasePair* pair = findPair(handle0,handle1); @@ -430,6 +526,8 @@ void btAxisSweep3::sortMaxDown(int axis, unsigned short edge, bool updateOverlap { removeOverlappingPair(*pair); } + */ + } // update edge reference in other handle diff --git a/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h b/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h index bc6e8b0d4..18fcf4cda 100644 --- a/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h +++ b/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h @@ -72,6 +72,7 @@ private: Edge* m_pEdges[3]; // edge arrays for the 3 axes (each array has m_maxHandles * 2 + 2 sentinel entries) + int m_invalidPair; // allocation/deallocation unsigned short allocHandle(); @@ -80,6 +81,7 @@ private: bool testOverlap(int ignoreAxis,const Handle* pHandleA, const Handle* pHandleB); + //Overlap* AddOverlap(unsigned short handleA, unsigned short handleB); //void RemoveOverlap(unsigned short handleA, unsigned short handleB); @@ -96,7 +98,7 @@ public: virtual void refreshOverlappingPairs() { - //this is replace by sweep and prune + //this is performed incrementally by sweep and prune (add pair), and during pair traversal (remove pair) } unsigned short addHandle(const btPoint3& aabbMin,const btPoint3& aabbMax, void* pOwner,short int collisionFilterGroup,short int collisionFilterMask); @@ -104,11 +106,13 @@ public: void updateHandle(unsigned short handle, const btPoint3& aabbMin,const btPoint3& aabbMax); inline Handle* getHandle(unsigned short index) const {return m_pHandles + index;} + void processAllOverlappingPairs(btOverlapCallback* callback); //Broadphase Interface virtual btBroadphaseProxy* createProxy( const btVector3& min, const btVector3& max,int shapeType,void* userPtr ,short int collisionFilterGroup,short int collisionFilterMask); virtual void destroyProxy(btBroadphaseProxy* proxy); virtual void setAabb(btBroadphaseProxy* proxy,const btVector3& aabbMin,const btVector3& aabbMax); + bool testOverlap(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1); }; diff --git a/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h b/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h index 8b080f3f1..e4c24f019 100644 --- a/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h +++ b/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h @@ -16,6 +16,7 @@ subject to the following restrictions: #ifndef BROADPHASE_PROXY_H #define BROADPHASE_PROXY_H +#include "../../LinearMath/btScalar.h" //for SIMD_FORCE_INLINE /// btDispatcher uses these types @@ -164,13 +165,33 @@ struct btBroadphasePair mutable btCollisionAlgorithm* m_algorithm; }; - +/* //comparison for set operation, see Solid DT_Encounter -inline bool operator<(const btBroadphasePair& a, const btBroadphasePair& b) +SIMD_FORCE_INLINE bool operator<(const btBroadphasePair& a, const btBroadphasePair& b) { return a.m_pProxy0 < b.m_pProxy0 || (a.m_pProxy0 == b.m_pProxy0 && a.m_pProxy1 < b.m_pProxy1); } +*/ + + +class btBroadphasePairSortPredicate +{ + public: + + bool operator() ( const btBroadphasePair& a, const btBroadphasePair& b ) + { + return a.m_pProxy0 > b.m_pProxy0 || + (a.m_pProxy0 == b.m_pProxy0 && a.m_pProxy1 > b.m_pProxy1) || + (a.m_pProxy0 == b.m_pProxy0 && a.m_pProxy1 == b.m_pProxy1 && a.m_algorithm > b.m_algorithm); + } +}; + + +SIMD_FORCE_INLINE bool operator==(const btBroadphasePair& a, const btBroadphasePair& b) +{ + return (a.m_pProxy0 == b.m_pProxy0) && (a.m_pProxy1 == b.m_pProxy1); +} #endif //BROADPHASE_PROXY_H diff --git a/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp b/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp index e52bb914f..6653b8b30 100644 --- a/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp +++ b/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp @@ -39,15 +39,15 @@ btOverlappingPairCache::~btOverlappingPairCache() void btOverlappingPairCache::removeOverlappingPair(btBroadphasePair& findPair) { - std::set::iterator it = m_overlappingPairSet.find(findPair); -// assert(it != m_overlappingPairSet.end()); - - if (it != m_overlappingPairSet.end()) + int findIndex = m_overlappingPairArray.findLinearSearch(findPair); + if (findIndex < m_overlappingPairArray.size()) { gOverlappingPairs--; - btBroadphasePair* pair = (btBroadphasePair*)(&(*it)); - cleanOverlappingPair(*pair); - m_overlappingPairSet.erase(it); + btBroadphasePair& pair = m_overlappingPairArray[findIndex]; + cleanOverlappingPair(pair); + + m_overlappingPairArray.swap(findIndex,m_overlappingPairArray.size()-1); + m_overlappingPairArray.pop_back(); } } @@ -78,7 +78,7 @@ void btOverlappingPairCache::addOverlappingPair(btBroadphaseProxy* proxy0,btBroa btBroadphasePair pair(*proxy0,*proxy1); - m_overlappingPairSet.insert(pair); + m_overlappingPairArray.push_back(pair); gOverlappingPairs++; } @@ -93,13 +93,15 @@ void btOverlappingPairCache::addOverlappingPair(btBroadphaseProxy* proxy0,btBroa return 0; btBroadphasePair tmpPair(*proxy0,*proxy1); - std::set::iterator it = m_overlappingPairSet.find(tmpPair); - if ((it == m_overlappingPairSet.end())) - return 0; + int findIndex = m_overlappingPairArray.findLinearSearch(tmpPair); - //assert(it != m_overlappingPairSet.end()); - btBroadphasePair* pair = (btBroadphasePair*)(&(*it)); - return pair; + if (findIndex < m_overlappingPairArray.size()) + { + //assert(it != m_overlappingPairSet.end()); + btBroadphasePair* pair = &m_overlappingPairArray[findIndex]; + return pair; + } + return 0; } @@ -143,6 +145,8 @@ void btOverlappingPairCache::cleanProxyFromPairs(btBroadphaseProxy* proxy) void btOverlappingPairCache::removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy) { + assert(0); + //todo, implement more efficient class RemovePairCallback : public btOverlapCallback { btBroadphaseProxy* m_obsoleteProxy; @@ -170,30 +174,23 @@ void btOverlappingPairCache::removeOverlappingPairsContainingProxy(btBroadphaseP void btOverlappingPairCache::processAllOverlappingPairs(btOverlapCallback* callback) { - std::set::iterator it = m_overlappingPairSet.begin(); - for (; !(it==m_overlappingPairSet.end());) + + int i; + + for (i=0;iprocessOverlap(*pair)) { cleanOverlappingPair(*pair); - std::set::iterator it2 = it; - //why does next line not compile under OS X?? -#ifdef MAC_OSX_FIXED_STL_SET - it2++; - it = m_overlappingPairSet.erase(it); - assert(it == it2); -#else - it++; - m_overlappingPairSet.erase(it2); -#endif //MAC_OSX_FIXED_STL_SET - + m_overlappingPairArray.swap(i,m_overlappingPairArray.size()-1); + m_overlappingPairArray.pop_back(); gOverlappingPairs--; } else { - it++; + i++; } } } diff --git a/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h b/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h index cd8aa095b..534f31881 100644 --- a/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h +++ b/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h @@ -21,7 +21,7 @@ subject to the following restrictions: #include "btBroadphaseInterface.h" #include "btBroadphaseProxy.h" #include "../../LinearMath/btPoint3.h" -#include +#include "../../LinearMath/btAlignedObjectArray.h" struct btOverlapCallback @@ -37,8 +37,9 @@ virtual ~btOverlapCallback() ///Typically managed by the Broadphase, Axis3Sweep or btSimpleBroadphase class btOverlappingPairCache : public btBroadphaseInterface { +protected: //avoid brute-force finding all the time - std::set m_overlappingPairSet; + btAlignedObjectArray m_overlappingPairArray; //during the dispatch, check that user doesn't destroy/create proxy bool m_blockedForChanges; @@ -48,7 +49,7 @@ class btOverlappingPairCache : public btBroadphaseInterface btOverlappingPairCache(); virtual ~btOverlappingPairCache(); - void processAllOverlappingPairs(btOverlapCallback*); + virtual void processAllOverlappingPairs(btOverlapCallback*); void removeOverlappingPair(btBroadphasePair& pair); diff --git a/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp b/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp index 6281e93ee..8bb127c9d 100644 --- a/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp +++ b/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp @@ -20,7 +20,7 @@ subject to the following restrictions: #include "LinearMath/btVector3.h" #include "LinearMath/btTransform.h" #include "LinearMath/btMatrix3x3.h" -#include +#include void btSimpleBroadphase::validate() diff --git a/src/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h b/src/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h index b4a46ca61..07e6eaf55 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h +++ b/src/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h @@ -16,9 +16,8 @@ subject to the following restrictions: #ifndef COLLISION_CREATE_FUNC #define COLLISION_CREATE_FUNC -#include - -typedef std::vector btCollisionObjectArray; +#include "../../LinearMath/btAlignedObjectArray.h" +typedef btAlignedObjectArray btCollisionObjectArray; class btCollisionAlgorithm; class btCollisionObject; diff --git a/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp b/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp index 309357939..c4824d7c5 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp +++ b/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp @@ -25,7 +25,6 @@ subject to the following restrictions: #include "BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h" #include "BulletCollision/CollisionShapes/btCollisionShape.h" #include "BulletCollision/CollisionDispatch/btCollisionObject.h" -#include #include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h" int gNumManifold = 0; @@ -135,20 +134,17 @@ void btCollisionDispatcher::releaseManifold(btPersistentManifold* manifold) gNumManifold--; //printf("releaseManifold: gNumManifold %d\n",gNumManifold); - clearManifold(manifold); - std::vector::iterator i = - std::find(m_manifoldsPtr.begin(), m_manifoldsPtr.end(), manifold); - if (!(i == m_manifoldsPtr.end())) + ///todo: this can be improved a lot, linear search might be slow part! + int findIndex = m_manifoldsPtr.findLinearSearch(manifold); + if (findIndex < m_manifoldsPtr.size()) { - std::swap(*i, m_manifoldsPtr.back()); + m_manifoldsPtr.swap(findIndex,m_manifoldsPtr.size()-1); m_manifoldsPtr.pop_back(); delete manifold; - } - } diff --git a/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h b/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h index 6c5cf8429..ca5aba8f0 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h +++ b/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h @@ -22,7 +22,7 @@ subject to the following restrictions: #include "../CollisionDispatch/btManifoldResult.h" #include "../BroadphaseCollision/btBroadphaseProxy.h" - +#include "../../LinearMath/btAlignedObjectArray.h" class btIDebugDraw; class btOverlappingPairCache; @@ -43,7 +43,7 @@ class btCollisionDispatcher : public btDispatcher { int m_count; - std::vector m_manifoldsPtr; + btAlignedObjectArray m_manifoldsPtr; bool m_useIslands; diff --git a/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp b/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp index d63644e43..57becfd85 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp +++ b/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp @@ -31,7 +31,6 @@ subject to the following restrictions: #include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" #include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" -#include btCollisionWorld::btCollisionWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache, int stackSize) :m_dispatcher1(dispatcher), @@ -50,13 +49,10 @@ btCollisionWorld::~btCollisionWorld() delete m_stackAlloc; //clean up remaining objects - std::vector::iterator i; - - for (i=m_collisionObjects.begin(); - !(i==m_collisionObjects.end()); i++) - + int i; + for (i=0;igetBroadphaseHandle(); if (bp) @@ -89,9 +85,7 @@ void btCollisionWorld::addCollisionObject(btCollisionObject* collisionObject,sho { //check that the object isn't already added - std::vector::iterator i = std::find(m_collisionObjects.begin(), m_collisionObjects.end(), collisionObject); - assert(i == m_collisionObjects.end()); - + btAssert( m_collisionObjects.findLinearSearch(collisionObject) == m_collisionObjects.size()); m_collisionObjects.push_back(collisionObject); @@ -131,7 +125,7 @@ void btCollisionWorld::performDiscreteCollisionDetection() //update aabb (of all moved objects) btVector3 aabbMin,aabbMax; - for (size_t i=0;igetCollisionShape()->getAabb(m_collisionObjects[i]->getWorldTransform(),aabbMin,aabbMax); m_broadphasePairCache->setAabb(m_collisionObjects[i]->getBroadphaseHandle(),aabbMin,aabbMax); @@ -169,13 +163,9 @@ void btCollisionWorld::removeCollisionObject(btCollisionObject* collisionObject) } - std::vector::iterator i = std::find(m_collisionObjects.begin(), m_collisionObjects.end(), collisionObject); - - if (!(i == m_collisionObjects.end())) - { - std::swap(*i, m_collisionObjects.back()); - m_collisionObjects.pop_back(); - } + //swapremove + m_collisionObjects.remove(collisionObject); + } @@ -324,13 +314,10 @@ void btCollisionWorld::rayTest(const btVector3& rayFromWorld, const btVector3& r /// go over all objects, and if the ray intersects their aabb, do a ray-shape query using convexCaster (CCD) - std::vector::iterator iter; - - for (iter=m_collisionObjects.begin(); - !(iter==m_collisionObjects.end()); iter++) + int i; + for (i=0;iGetRigidcollisionObject(); btVector3 collisionObjectAabbMin,collisionObjectAabbMax; diff --git a/src/BulletCollision/CollisionDispatch/btCollisionWorld.h b/src/BulletCollision/CollisionDispatch/btCollisionWorld.h index d8e28bb35..eb0bd2b22 100644 --- a/src/BulletCollision/CollisionDispatch/btCollisionWorld.h +++ b/src/BulletCollision/CollisionDispatch/btCollisionWorld.h @@ -72,10 +72,7 @@ class btBroadphaseInterface; #include "btCollisionObject.h" #include "btCollisionDispatcher.h" //for definition of btCollisionObjectArray #include "../BroadphaseCollision/btOverlappingPairCache.h" - -#include - - +#include "../../LinearMath/btAlignedObjectArray.h" ///CollisionWorld is interface and container for the collision detection class btCollisionWorld @@ -84,7 +81,7 @@ class btCollisionWorld protected: - std::vector m_collisionObjects; + btAlignedObjectArray m_collisionObjects; btDispatcher* m_dispatcher1; diff --git a/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h b/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h index ac1914a46..7091b233b 100644 --- a/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h +++ b/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h @@ -23,14 +23,14 @@ subject to the following restrictions: #include "../NarrowPhaseCollision/btPersistentManifold.h" class btDispatcher; #include "../BroadphaseCollision/btBroadphaseProxy.h" -#include #include "btCollisionCreateFunc.h" +#include "../../LinearMath/btAlignedObjectArray.h" /// btCompoundCollisionAlgorithm supports collision between CompoundCollisionShapes and other collision shapes /// Place holder, not fully implemented yet class btCompoundCollisionAlgorithm : public btCollisionAlgorithm { - std::vector m_childCollisionAlgorithms; + btAlignedObjectArray m_childCollisionAlgorithms; bool m_isSwapped; public: diff --git a/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp b/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp index 70631c627..f1a7eb0dc 100644 --- a/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp +++ b/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp @@ -8,7 +8,6 @@ #include "BulletCollision/CollisionDispatch/btCollisionWorld.h" #include -#include btSimulationIslandManager::btSimulationIslandManager() @@ -57,14 +56,12 @@ void btSimulationIslandManager::updateActivationState(btCollisionWorld* colWorld // put the index into m_controllers into m_tag { - std::vector::iterator i; int index = 0; - for (i=colWorld->getCollisionObjectArray().begin(); - !(i==colWorld->getCollisionObjectArray().end()); i++) + int i; + for (i=0;igetCollisionObjectArray().size(); i++) { - - btCollisionObject* collisionObject= (*i); + btCollisionObject* collisionObject= colWorld->getCollisionObjectArray()[i]; collisionObject->setIslandTag(index); collisionObject->setHitFraction(btScalar(1.)); index++; @@ -88,14 +85,11 @@ void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* col { - std::vector::iterator i; - int index = 0; - for (i=colWorld->getCollisionObjectArray().begin(); - !(i==colWorld->getCollisionObjectArray().end()); i++) + int i; + for (i=0;igetCollisionObjectArray().size();i++) { - btCollisionObject* collisionObject= (*i); - + btCollisionObject* collisionObject= colWorld->getCollisionObjectArray()[i]; if (collisionObject->mergesSimulationIslands()) { collisionObject->setIslandTag( m_unionFind.find(index) ); @@ -127,6 +121,24 @@ bool btPersistentManifoldSortPredicate(const btPersistentManifold* lhs, const bt } +/// function object that routes calls to operator< +class btPersistentManifoldSortPredicate +{ + public: + + bool operator() ( const btPersistentManifold* lhs, const btPersistentManifold* rhs ) + { + int rIslandId0,lIslandId0; + rIslandId0 = getIslandId(rhs); + lIslandId0 = getIslandId(lhs); + return lIslandId0 < rIslandId0; + } +}; + + + + + // // todo: this is random access, it can be walked 'cache friendly'! // @@ -224,7 +236,7 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher, } } - std::vector islandmanifold; + btAlignedObjectArray islandmanifold; int i; int maxNumManifolds = dispatcher->getNumManifolds(); islandmanifold.reserve(maxNumManifolds); @@ -261,7 +273,10 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher, // Sort manifolds, based on islands // Sort the vector using predicate and std::sort - std::sort(islandmanifold.begin(), islandmanifold.end(), btPersistentManifoldSortPredicate); + //std::sort(islandmanifold.begin(), islandmanifold.end(), btPersistentManifoldSortPredicate); + + //we should do radix sort, it it much faster (O(n) instead of O (n log2(n)) + islandmanifold.heapSort(btPersistentManifoldSortPredicate); //now process all active islands (sets of manifolds for now) diff --git a/src/BulletCollision/CollisionDispatch/btUnionFind.cpp b/src/BulletCollision/CollisionDispatch/btUnionFind.cpp index 046f348a1..622543357 100644 --- a/src/BulletCollision/CollisionDispatch/btUnionFind.cpp +++ b/src/BulletCollision/CollisionDispatch/btUnionFind.cpp @@ -15,7 +15,6 @@ subject to the following restrictions: #include "btUnionFind.h" #include -#include @@ -50,11 +49,16 @@ void btUnionFind::reset(int N) } } -bool btUnionFindElementSortPredicate(const btElement& lhs, const btElement& rhs) -{ - return lhs.m_id < rhs.m_id; -} +class btUnionFindElementSortPredicate +{ + public: + + bool operator() ( const btElement& lhs, const btElement& rhs ) + { + return lhs.m_id < rhs.m_id; + } +}; ///this is a special operation, destroying the content of btUnionFind. ///it sorts the elements, based on island id, in order to make it easy to iterate over islands @@ -71,7 +75,9 @@ void btUnionFind::sortIslands() } // Sort the vector using predicate and std::sort - std::sort(m_elements.begin(), m_elements.end(), btUnionFindElementSortPredicate); + //std::sort(m_elements.begin(), m_elements.end(), btUnionFindElementSortPredicate); + //perhaps use radix sort? + m_elements.heapSort(btUnionFindElementSortPredicate()); } diff --git a/src/BulletCollision/CollisionDispatch/btUnionFind.h b/src/BulletCollision/CollisionDispatch/btUnionFind.h index b1baca9ff..b6c30f7a7 100644 --- a/src/BulletCollision/CollisionDispatch/btUnionFind.h +++ b/src/BulletCollision/CollisionDispatch/btUnionFind.h @@ -16,7 +16,8 @@ subject to the following restrictions: #ifndef UNION_FIND_H #define UNION_FIND_H -#include +#include "../../LinearMath/btAlignedObjectArray.h" + struct btElement { int m_id; @@ -29,7 +30,7 @@ struct btElement class btUnionFind { private: - std::vector m_elements; + btAlignedObjectArray m_elements; public: diff --git a/src/BulletCollision/CollisionShapes/btCompoundShape.h b/src/BulletCollision/CollisionShapes/btCompoundShape.h index 15c93e53b..2d384bd21 100644 --- a/src/BulletCollision/CollisionShapes/btCompoundShape.h +++ b/src/BulletCollision/CollisionShapes/btCompoundShape.h @@ -21,7 +21,6 @@ subject to the following restrictions: #include "../../LinearMath/btVector3.h" #include "../../LinearMath/btTransform.h" #include "../../LinearMath/btMatrix3x3.h" -#include #include "btCollisionMargin.h" #include "../../LinearMath/btAlignedObjectArray.h" diff --git a/src/BulletCollision/CollisionShapes/btConvexShape.h b/src/BulletCollision/CollisionShapes/btConvexShape.h index bf640aa37..5f7cfc7a4 100644 --- a/src/BulletCollision/CollisionShapes/btConvexShape.h +++ b/src/BulletCollision/CollisionShapes/btConvexShape.h @@ -21,7 +21,6 @@ subject to the following restrictions: #include "../../LinearMath/btVector3.h" #include "../../LinearMath/btTransform.h" #include "../../LinearMath/btMatrix3x3.h" -#include #include "btCollisionMargin.h" //todo: get rid of this btConvexCastResult thing! diff --git a/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h b/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h index 372f3d4b7..a0db2797b 100644 --- a/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h +++ b/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h @@ -5,7 +5,6 @@ #include "btPolyhedralConvexShape.h" #include "../BroadphaseCollision/btBroadphaseProxy.h" // for the types -#include /// btConvexTriangleMeshShape is a convex hull of a triangle mesh. If you just have a point cloud, you can use btConvexHullShape instead. /// It uses the btStridingMeshInterface instead of a point cloud. This can avoid the duplication of the triangle mesh data. diff --git a/src/BulletCollision/CollisionShapes/btEmptyShape.h b/src/BulletCollision/CollisionShapes/btEmptyShape.h index 572692e64..8ec534449 100644 --- a/src/BulletCollision/CollisionShapes/btEmptyShape.h +++ b/src/BulletCollision/CollisionShapes/btEmptyShape.h @@ -21,7 +21,6 @@ subject to the following restrictions: #include "../../LinearMath/btVector3.h" #include "../../LinearMath/btTransform.h" #include "../../LinearMath/btMatrix3x3.h" -#include #include "btCollisionMargin.h" diff --git a/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h b/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h index a727226c6..eea34f2ba 100644 --- a/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h +++ b/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h @@ -137,4 +137,6 @@ public: + + #endif //PERSISTENT_MANIFOLD_H diff --git a/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp b/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp index e1c7fb168..3e87dbf95 100644 --- a/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp +++ b/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp @@ -17,6 +17,7 @@ subject to the following restrictions: #include "btGeneric6DofConstraint.h" #include "BulletDynamics/Dynamics/btRigidBody.h" #include "LinearMath/btTransformUtil.h" +#include "new.h" static const btScalar kSign[] = { btScalar(1.0), btScalar(-1.0), btScalar(1.0) }; static const int kAxisA[] = { 1, 0, 0 }; diff --git a/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp b/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp index ccd2d9ee8..ea2dbde33 100644 --- a/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp +++ b/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp @@ -17,7 +17,7 @@ subject to the following restrictions: #include "btHingeConstraint.h" #include "BulletDynamics/Dynamics/btRigidBody.h" #include "LinearMath/btTransformUtil.h" - +#include "new.h" btHingeConstraint::btHingeConstraint(): m_enableAngularMotor(false) diff --git a/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp b/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp index e2c4c54f1..40531861e 100644 --- a/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp +++ b/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp @@ -16,7 +16,7 @@ subject to the following restrictions: #include "btPoint2PointConstraint.h" #include "BulletDynamics/Dynamics/btRigidBody.h" - +#include "new.h" diff --git a/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp b/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp index cab15203a..bee3c24de 100644 --- a/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp +++ b/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp @@ -24,7 +24,7 @@ subject to the following restrictions: #include "btJacobianEntry.h" #include "LinearMath/btMinMax.h" #include "BulletDynamics/ConstraintSolver/btTypedConstraint.h" - +#include "new.h" #ifdef USE_PROFILE #include "LinearMath/btQuickprof.h" diff --git a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp index 404cf243f..792912d96 100644 --- a/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp +++ b/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp @@ -16,7 +16,6 @@ subject to the following restrictions: #include "btDiscreteDynamicsWorld.h" - //collision detection #include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" #include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" @@ -54,8 +53,6 @@ subject to the following restrictions: -#include - btDiscreteDynamicsWorld::btDiscreteDynamicsWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache,btConstraintSolver* constraintSolver) @@ -84,7 +81,7 @@ btDiscreteDynamicsWorld::~btDiscreteDynamicsWorld() void btDiscreteDynamicsWorld::saveKinematicState(btScalar timeStep) { - for (unsigned int i=0;igetDebugMode() & btIDebugDraw::DBG_DrawWireframe) @@ -155,7 +152,7 @@ void btDiscreteDynamicsWorld::synchronizeMotionStates() if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawWireframe) { - for (unsigned int i=0;im_vehicles.size();i++) + for ( int i=0;im_vehicles.size();i++) { for (int v=0;vgetNumWheels();v++) { @@ -294,7 +291,7 @@ void btDiscreteDynamicsWorld::internalSingleStepSimulation(btScalar timeStep) void btDiscreteDynamicsWorld::setGravity(const btVector3& gravity) { m_gravity = gravity; - for (unsigned int i=0;iupdateVehicle( timeStep); @@ -345,7 +342,7 @@ void btDiscreteDynamicsWorld::updateActivationState(btScalar timeStep) { BEGIN_PROFILE("updateActivationState"); - for (unsigned int i=0;i::iterator cit = std::find(m_constraints.begin(),m_constraints.end(),constraint); - if (!(cit==m_constraints.end())) - { - m_constraints.erase(cit); - } + m_constraints.remove(constraint); } void btDiscreteDynamicsWorld::addVehicle(btRaycastVehicle* vehicle) @@ -394,11 +387,7 @@ void btDiscreteDynamicsWorld::addVehicle(btRaycastVehicle* vehicle) void btDiscreteDynamicsWorld::removeVehicle(btRaycastVehicle* vehicle) { - std::vector::iterator vit = std::find(m_vehicles.begin(),m_vehicles.end(),vehicle); - if (!(vit==m_vehicles.end())) - { - m_vehicles.erase(vit); - } + m_vehicles.remove(vehicle); } inline int btGetConstraintIslandId(const btTypedConstraint* lhs) @@ -420,6 +409,7 @@ static bool btSortConstraintOnIslandPredicate(const btTypedConstraint* lhs, cons return lIslandId0 < rIslandId0; } + void btDiscreteDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo) { @@ -481,20 +471,23 @@ void btDiscreteDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo) }; - - - //sorted version of all btTypedConstraint, based on islandId - std::vector sortedConstraints; + btAlignedObjectArray sortedConstraints; sortedConstraints.resize( m_constraints.size()); int i; for (i=0;i::less()); + //std::sort(sortedConstraints.begin(),sortedConstraints.end(),btSortConstraintOnIslandPredicate); + btTypedConstraint** constraintsPtr = getNumConstraints() ? &sortedConstraints[0] : 0; @@ -586,7 +579,7 @@ void btDiscreteDynamicsWorld::updateAabbs() btVector3 colorvec(1,0,0); btTransform predictedTrans; - for (unsigned int i=0;igetCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb); - btSimpleBroadphase* bp = (btSimpleBroadphase*)m_broadphasePairCache; + btBroadphaseInterface* bp = (btBroadphaseInterface*)m_broadphasePairCache; //moving objects should be moderately sized, probably something wrong if not if ( colObj->isStaticObject() || ((maxAabb-minAabb).length2() < btScalar(1e12))) @@ -610,13 +603,13 @@ void btDiscreteDynamicsWorld::updateAabbs() body->setActivationState(DISABLE_SIMULATION); static bool reportMe = true; - if (reportMe) + if (reportMe && m_debugDrawer) { reportMe = false; - printf("Overflow in AABB, object removed from simulation \n"); - printf("If you can reproduce this, please email bugs@continuousphysics.com\n"); - printf("Please include above information, your Platform, version of OS.\n"); - printf("Thanks.\n"); + m_debugDrawer->reportErrorWarning("Overflow in AABB, object removed from simulation"); + m_debugDrawer->reportErrorWarning("If you can reproduce this, please email bugs@continuousphysics.com\n"); + m_debugDrawer->reportErrorWarning("Please include above information, your Platform, version of OS.\n"); + m_debugDrawer->reportErrorWarning("Thanks.\n"); } @@ -636,7 +629,7 @@ void btDiscreteDynamicsWorld::integrateTransforms(btScalar timeStep) { BEGIN_PROFILE("integrateTransforms"); btTransform predictedTrans; - for (unsigned int i=0;i ///btDiscreteDynamicsWorld provides discrete rigid body simulation ///those classes replace the obsolete CcdPhysicsEnvironment/CcdPhysicsController @@ -40,7 +40,7 @@ protected: btSimulationIslandManager* m_islandManager; - std::vector m_constraints; + btAlignedObjectArray m_constraints; btIDebugDraw* m_debugDrawer; @@ -56,7 +56,7 @@ protected: btContactSolverInfo m_solverInfo; - std::vector m_vehicles; + btAlignedObjectArray m_vehicles; int m_profileTimings; diff --git a/src/BulletDynamics/Dynamics/btRigidBody.h b/src/BulletDynamics/Dynamics/btRigidBody.h index 4775a8089..9da545adb 100644 --- a/src/BulletDynamics/Dynamics/btRigidBody.h +++ b/src/BulletDynamics/Dynamics/btRigidBody.h @@ -16,7 +16,6 @@ subject to the following restrictions: #ifndef RIGIDBODY_H #define RIGIDBODY_H -#include #include "../../LinearMath/btPoint3.h" #include "../../LinearMath/btTransform.h" #include "../../BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" @@ -28,7 +27,6 @@ class btMotionState; extern btScalar gLinearAirDamping; -extern bool gUseEpa; extern btScalar gDeactivationTime; extern bool gDisableDeactivation; diff --git a/src/LinearMath/btAlignedObjectArray.h b/src/LinearMath/btAlignedObjectArray.h index 7ecf027ac..e2f630623 100644 --- a/src/LinearMath/btAlignedObjectArray.h +++ b/src/LinearMath/btAlignedObjectArray.h @@ -74,6 +74,8 @@ class btAlignedObjectArray } } + + public: @@ -172,6 +174,127 @@ class btAlignedObjectArray } } + + class less + { + public: + + bool operator() ( const T& a, const T& b ) + { + return ( a < b ); + } + }; + + + ///heap sort from http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Sort/Heap/ + template + void downHeap(T *pArr, int k, int n,L CompareFunc) + { + /* PRE: a[k+1..N] is a heap */ + /* POST: a[k..N] is a heap */ + + T temp = pArr[k - 1]; + /* k has child(s) */ + while (k <= n/2) + { + int child = 2*k; + + if ((child < n) && CompareFunc(pArr[child - 1] , pArr[child])) + { + child++; + } + /* pick larger child */ + if (CompareFunc(temp , pArr[child - 1])) + { + /* move child up */ + pArr[k - 1] = pArr[child - 1]; + k = child; + } + else + { + break; + } + } + pArr[k - 1] = temp; + } /*downHeap*/ + + void swap(int index0,int index1) + { + T temp = m_data[index0]; + m_data[index0] = m_data[index1]; + m_data[index1] = temp; + } + + template + void heapSort(L CompareFunc) + { + /* sort a[0..N-1], N.B. 0 to N-1 */ + int k; + int n = m_size; + for (k = n/2; k > 0; k--) + { + downHeap(m_data, k, n, CompareFunc); + } + + /* a[1..N] is now a heap */ + while ( n>=1 ) + { + swap(0,n-1); /* largest of a[0..n-1] */ + + + n = n - 1; + /* restore a[1..i-1] heap */ + downHeap(m_data, 1, n, CompareFunc); + } + } + + ///non-recursive binary search, assumes sorted array + int findBinarySearch(const T& key) const + { + int first = 0; + int last = size(); + + //assume sorted array + while (first <= last) { + int mid = (first + last) / 2; // compute mid point. + if (key > m_data[mid]) + first = mid + 1; // repeat search in top half. + else if (key < m_data[mid]) + last = mid - 1; // repeat search in bottom half. + else + return mid; // found it. return position ///// + } + return size(); // failed to find key + } + + + int findLinearSearch(const T& key) const + { + int index=size(); + int i; + + for (i=0;i -#include -#include -#include #ifdef __PPU__ #include @@ -51,39 +42,12 @@ typedef uint64_t __int64; #endif #define mymin(a,b) (a > b ? a : b) -namespace hidden -{ - /// A simple data structure representing a single timed block - /// of code. - struct ProfileBlock - { - ProfileBlock() - { - currentBlockStartMicroseconds = 0; - currentCycleTotalMicroseconds = 0; - lastCycleTotalMicroseconds = 0; - totalMicroseconds = 0; - } - /// The starting time (in us) of the current block update. - unsigned long int currentBlockStartMicroseconds; - - /// The accumulated time (in us) spent in this block during the - /// current profiling cycle. - unsigned long int currentCycleTotalMicroseconds; - - /// The accumulated time (in us) spent in this block during the - /// past profiling cycle. - unsigned long int lastCycleTotalMicroseconds; - - /// The total accumulated time (in us) spent in this block. - unsigned long int totalMicroseconds; - }; - - class Clock +/// basic clock +class btClock { public: - Clock() + btClock() { #ifdef USE_WINDOWS_TIMERS QueryPerformanceFrequency(&mClockFrequency); @@ -91,7 +55,7 @@ namespace hidden reset(); } - ~Clock() + ~btClock() { } @@ -118,7 +82,7 @@ namespace hidden } /// Returns the time in ms since the last call to reset or since - /// the Clock was created. + /// the btClock was created. unsigned long int getTimeMilliseconds() { #ifdef USE_WINDOWS_TIMERS @@ -248,6 +212,51 @@ namespace hidden #endif //__PPU__ }; + + +//#define USE_QUICKPROF 1 +//Don't use quickprof for now, because it contains STL. TODO: replace STL by Bullet container classes. + +#ifdef USE_QUICKPROF + + +//#include +#include +#include +#include + + + + +namespace hidden +{ + /// A simple data structure representing a single timed block + /// of code. + struct ProfileBlock + { + ProfileBlock() + { + currentBlockStartMicroseconds = 0; + currentCycleTotalMicroseconds = 0; + lastCycleTotalMicroseconds = 0; + totalMicroseconds = 0; + } + + /// The starting time (in us) of the current block update. + unsigned long int currentBlockStartMicroseconds; + + /// The accumulated time (in us) spent in this block during the + /// current profiling cycle. + unsigned long int currentCycleTotalMicroseconds; + + /// The accumulated time (in us) spent in this block during the + /// past profiling cycle. + unsigned long int lastCycleTotalMicroseconds; + + /// The total accumulated time (in us) spent in this block. + unsigned long int totalMicroseconds; + }; + }; /// A static class that manages timing for a set of profiling blocks. @@ -343,7 +352,7 @@ public: static bool mEnabled; /// The clock used to time profile blocks. - static hidden::Clock mClock; + static btClock mClock; /// The starting time (in us) of the current profiling cycle. static unsigned long int mCurrentCycleStartMicroseconds;