Revision: 16496 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16496 Author: erwin Date: 2008-09-13 09:06:43 +0200 (Sat, 13 Sep 2008)
Log Message: ----------- Upgrade to latest Bullet trunk, that is in sync with Blender/extern/bullet2. (except for one define 'WIN32_AVOID_SSE_WHEN_EMBEDDED_INSIDE_BLENDER') In case someone reads those SVN logs: you can enable some extra broadphase SSE optimizations by replacing WIN32_AVOID_SSE_WHEN_EMBEDDED_INSIDE_BLENDER by WIN32 in extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.h Thanks to Benoit Bolsee for the upstream patch/contribution. Removed some obsolete files, they were just intended for comparison/testing. Modified Paths: -------------- trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.cpp trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.h trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h trunk/blender/extern/bullet2/src/BulletCollision/CMakeLists.txt trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h trunk/blender/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.cpp trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.h trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.cpp trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.h trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h trunk/blender/extern/bullet2/src/BulletDynamics/CMakeLists.txt trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.h trunk/blender/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp trunk/blender/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h trunk/blender/extern/bullet2/src/BulletDynamics/Dynamics/btDynamicsWorld.h trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBody.cpp trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp trunk/blender/extern/bullet2/src/BulletSoftBody/btSoftBodyInternals.h trunk/blender/extern/bullet2/src/LinearMath/CMakeLists.txt trunk/blender/extern/bullet2/src/LinearMath/btAabbUtil2.h trunk/blender/extern/bullet2/src/LinearMath/btMatrix3x3.h trunk/blender/extern/bullet2/src/LinearMath/btScalar.h trunk/blender/extern/bullet2/src/btBulletCollisionCommon.h trunk/blender/extern/bullet2/src/btBulletDynamicsCommon.h Added Paths: ----------- trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h Removed Paths: ------------- trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btOdeContactJoint.cpp trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btOdeContactJoint.h trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btOdeJoint.cpp trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btOdeJoint.h trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btOdeMacros.h trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btOdeQuickstepConstraintSolver.cpp trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btOdeQuickstepConstraintSolver.h trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btOdeSolverBody.h trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btOdeTypedJoint.cpp trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btOdeTypedJoint.h trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSorLcp.cpp trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSorLcp.h Modified: trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h =================================================================== --- trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h 2008-09-13 05:24:52 UTC (rev 16495) +++ trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h 2008-09-13 07:06:43 UTC (rev 16496) @@ -27,6 +27,7 @@ #include "btOverlappingPairCallback.h" //#define DEBUG_BROADPHASE 1 +#define USE_OVERLAP_TEST_ON_REMOVES 1 /// The internal templace class btAxisSweep3Internal implements the sweep and prune broadphase. /// It uses quantized integers to represent the begin and end points for each of the 3 axis. @@ -52,9 +53,7 @@ }; public: - //This breaks the Intel compiler, see http://softwarecommunity.intel.com/isn/Community/en-US/forums/thread/30253577.aspx - class Handle : public btBroadphaseProxy - //ATTRIBUTE_ALIGNED16(class) Handle : public btBroadphaseProxy + class Handle : public btBroadphaseProxy { public: BT_DECLARE_ALIGNED_ALLOCATOR(); @@ -80,7 +79,7 @@ BP_FP_INT_TYPE m_numHandles; // number of active handles BP_FP_INT_TYPE m_maxHandles; // max number of handles Handle* m_pHandles; // handles pool - void* m_pHandlesRawPtr; + BP_FP_INT_TYPE m_firstFreeHandle; // free handles list Edge* m_pEdges[3]; // edge arrays for the 3 axes (each array has m_maxHandles * 2 + 2 sentinel entries) @@ -100,7 +99,7 @@ void freeHandle(BP_FP_INT_TYPE handle); - bool testOverlap(int ignoreAxis,const Handle* pHandleA, const Handle* pHandleB); + bool testOverlap2D(const Handle* pHandleA, const Handle* pHandleB,int axis0,int axis1); #ifdef DEBUG_BROADPHASE void debugPrintAxis(int axis,bool checkCardinality=true); @@ -273,10 +272,9 @@ m_quantize = btVector3(btScalar(maxInt),btScalar(maxInt),btScalar(maxInt)) / aabbSize; - // allocate handles buffer and put all handles on free list - m_pHandlesRawPtr = btAlignedAlloc(sizeof(Handle)*maxHandles,16); - m_pHandles = new(m_pHandlesRawPtr) Handle[maxHandles]; - + // allocate handles buffer, using btAlignedAlloc, and put all handles on free list + m_pHandles = new Handle[maxHandles]; + m_maxHandles = maxHandles; m_numHandles = 0; @@ -327,7 +325,7 @@ { btAlignedFree(m_pEdgesRawPtr[i]); } - btAlignedFree(m_pHandlesRawPtr); + delete [] m_pHandles; if (m_ownsPairCache) { @@ -603,34 +601,17 @@ } template <typename BP_FP_INT_TYPE> -bool btAxisSweep3Internal<BP_FP_INT_TYPE>::testOverlap(int ignoreAxis,const Handle* pHandleA, const Handle* pHandleB) +bool btAxisSweep3Internal<BP_FP_INT_TYPE>::testOverlap2D(const Handle* pHandleA, const Handle* pHandleB,int axis0,int axis1) { //optimization 1: check the array index (memory address), instead of the m_pos - for (int axis = 0; axis < 3; axis++) + if (pHandleA->m_maxEdges[axis0] < pHandleB->m_minEdges[axis0] || + pHandleB->m_maxEdges[axis0] < pHandleA->m_minEdges[axis0] || + pHandleA->m_maxEdges[axis1] < pHandleB->m_minEdges[axis1] || + pHandleB->m_maxEdges[axis1] < pHandleA->m_minEdges[axis1]) { - if (axis != ignoreAxis) - { - if (pHandleA->m_maxEdges[axis] < pHandleB->m_minEdges[axis] || - pHandleB->m_maxEdges[axis] < pHandleA->m_minEdges[axis]) - { - return false; - } - } + return false; } - - //optimization 2: only 2 axis need to be tested (conflicts with 'delayed removal' optimization) - - /*for (int axis = 0; axis < 3; axis++) - { - if (m_pEdges[axis][pHandleA->m_maxEdges[axis]].m_pos < m_pEdges[axis][pHandleB->m_minEdges[axis]].m_pos || - m_pEdges[axis][pHandleB->m_maxEdges[axis]].m_pos < m_pEdges[axis][pHandleA->m_minEdges[axis]].m_pos) - { - return false; - } - } - */ - return true; } @@ -700,7 +681,9 @@ if (pPrev->IsMax()) { // if previous edge is a maximum check the bounds and add an overlap if necessary - if (updateOverlaps && testOverlap(axis,pHandleEdge, pHandlePrev)) + const int axis1 = (1 << axis) & 3; + const int axis2 = (1 << axis1) & 3; + if (updateOverlaps && testOverlap2D(pHandleEdge, pHandlePrev,axis1,axis2)) { m_pairCache->addOverlappingPair(pHandleEdge,pHandlePrev); if (m_userPairCallback) @@ -748,12 +731,19 @@ if (pNext->IsMax()) { - + Handle* handle0 = getHandle(pEdge->m_handle); + Handle* handle1 = getHandle(pNext->m_handle); + const int axis1 = (1 << axis) & 3; + const int axis2 = (1 << axis1) & 3; + // if next edge is maximum remove any overlap between the two handles - if (updateOverlaps) + if (updateOverlaps +#ifdef USE_OVERLAP_TEST_ON_REMOVES + && testOverlap2D(handle0,handle1,axis1,axis2) +#endif //USE_OVERLAP_TEST_ON_REMOVES + ) { - Handle* handle0 = getHandle(pEdge->m_handle); - Handle* handle1 = getHandle(pNext->m_handle); + m_pairCache->removeOverlappingPair(handle0,handle1,dispatcher); if (m_userPairCallback) @@ -799,12 +789,20 @@ if (!pPrev->IsMax()) { // if previous edge was a minimum remove any overlap between the two handles - if (updateOverlaps) + Handle* handle0 = getHandle(pEdge->m_handle); + Handle* handle1 = getHandle(pPrev->m_handle); + const int axis1 = (1 << axis) & 3; + const int axis2 = (1 << axis1) & 3; + + if (updateOverlaps +#ifdef USE_OVERLAP_TEST_ON_REMOVES + && testOverlap2D(handle0,handle1,axis1,axis2) +#endif //USE_OVERLAP_TEST_ON_REMOVES + ) { //this is done during the overlappingpairarray iteration/narrowphase collision - Handle* handle0 = getHandle(pEdge->m_handle); - Handle* handle1 = getHandle(pPrev->m_handle); + m_pairCache->removeOverlappingPair(handle0,handle1,dispatcher); if (m_userPairCallback) m_userPairCallback->removeOverlappingPair(handle0,handle1,dispatcher); @@ -850,10 +848,13 @@ { Handle* pHandleNext = getHandle(pNext->m_handle); + const int axis1 = (1 << axis) & 3; + const int axis2 = (1 << axis1) & 3; + if (!pNext->IsMax()) { // if next edge is a minimum check the bounds and add an overlap if necessary - if (updateOverlaps && testOverlap(axis, pHandleEdge, pHandleNext)) + if (updateOverlaps && testOverlap2D(pHandleEdge, pHandleNext,axis1,axis2)) { Handle* handle0 = getHandle(pEdge->m_handle); Handle* handle1 = getHandle(pNext->m_handle); Modified: trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.cpp =================================================================== --- trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.cpp 2008-09-13 05:24:52 UTC (rev 16495) +++ trunk/blender/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.cpp 2008-09-13 07:06:43 UTC (rev 16496) @@ -663,24 +663,23 @@ Leaves: 8192 sizeof(btDbvtVolume): 32 bytes sizeof(btDbvtNode): 44 bytes -[1] btDbvtVolume intersections: 3537 ms (0%) -[2] btDbvtVolume merges: 1945 ms (0%) -[3] btDbvt::collideTT: 6646 ms (0%) -[4] btDbvt::collideTT self: 3389 ms (0%) -[5] btDbvt::collideTT xform: 7505 ms (0%) -[6] btDbvt::collideTT xform,self: 7480 ms (0%) -[7] btDbvt::collideRAY: 6307 ms (0%),(332511 r/s) -[8] insert/remove: 2105 ms (-3%),(996271 ir/s) -[9] updates (teleport): 1943 ms (0%),(1079337 u/s) -[10] updates (jitter): 1301 ms (0%),(1611953 u/s) -[11] optimize (incremental): 2510 ms (0%),(1671000 o/s) -[12] btDbvtVolume notequal: 3677 ms (0%) -[13] culling(OCL+fullsort): 2231 ms (0%),(458 t/s) -[14] culling(OCL+qsort): 3500 ms (0%),(2340 t/s) -[15] culling(KDOP+qsort): 1151 ms (0%),(7117 t/s) -[16] insert/remove batch(256): 5138 ms (0%),(816330 bir/s) -[17] btDbvtVolume proximity: 2842 ms (0%) -[18] btDbvtVolume select: 3390 ms (0%) +[1] btDbvtVolume intersections: 3499 ms (-1%) +[2] btDbvtVolume merges: 1934 ms (0%) +[3] btDbvt::collideTT: 5485 ms (-21%) +[4] btDbvt::collideTT self: 2814 ms (-20%) +[5] btDbvt::collideTT xform: 7379 ms (-1%) +[6] btDbvt::collideTT xform,self: 7270 ms (-2%) +[7] btDbvt::collideRAY: 6314 ms (0%),(332143 r/s) +[8] insert/remove: 2093 ms (0%),(1001983 ir/s) +[9] updates (teleport): 1879 ms (-3%),(1116100 u/s) +[10] updates (jitter): 1244 ms (-4%),(1685813 u/s) +[11] optimize (incremental): 2514 ms (0%),(1668000 o/s) +[12] btDbvtVolume notequal: 3659 ms (0%) +[13] culling(OCL+fullsort): 2218 ms (0%),(461 t/s) +[14] culling(OCL+qsort): 3688 ms (5%),(2221 t/s) +[15] culling(KDOP+qsort): 1139 ms (-1%),(7192 t/s) +[16] insert/remove batch(256): 5092 ms (0%),(823704 bir/s) +[17] btDbvtVolume select: 3419 ms (0%) */ struct btDbvtBenchmark @@ -787,7 +786,7 @@ //[1] btDbvtVolume intersections bool cfgBenchmark1_Enable = cfgEnable; static const int cfgBenchmark1_Iterations = 8; -static const int cfgBenchmark1_Reference = 3537; +static const int cfgBenchmark1_Reference = 3499; //[2] btDbvtVolume merges bool cfgBenchmark2_Enable = cfgEnable; static const int cfgBenchmark2_Iterations = 4; @@ -795,21 +794,21 @@ //[3] btDbvt::collideTT bool cfgBenchmark3_Enable = cfgEnable; static const int cfgBenchmark3_Iterations = 512; -static const int cfgBenchmark3_Reference = 6646; +static const int cfgBenchmark3_Reference = 5485; //[4] btDbvt::collideTT self bool cfgBenchmark4_Enable = cfgEnable; static const int cfgBenchmark4_Iterations = 512; -static const int cfgBenchmark4_Reference = 3389; +static const int cfgBenchmark4_Reference = 2814; //[5] btDbvt::collideTT xform bool cfgBenchmark5_Enable = cfgEnable; static const int cfgBenchmark5_Iterations = 512; static const btScalar cfgBenchmark5_OffsetScale = 2; -static const int cfgBenchmark5_Reference = 7505; +static const int cfgBenchmark5_Reference = 7379; //[6] btDbvt::collideTT xform,self bool cfgBenchmark6_Enable = cfgEnable; static const int cfgBenchmark6_Iterations = 512; static const btScalar cfgBenchmark6_OffsetScale = 2; -static const int cfgBenchmark6_Reference = 7480; +static const int cfgBenchmark6_Reference = 7270; //[7] btDbvt::collideRAY bool cfgBenchmark7_Enable = cfgEnable; static const int cfgBenchmark7_Passes = 32; @@ -824,13 +823,13 @@ bool cfgBenchmark9_Enable = cfgEnable; static const int cfgBenchmark9_Passes = 32; static const int cfgBenchmark9_Iterations = 65536; -static const int cfgBenchmark9_Reference = 1943; +static const int cfgBenchmark9_Reference = 1879; //[10] updates (jitter) bool cfgBenchmark10_Enable = cfgEnable; @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs