Update Bullet to version 2.80 (bullet svn revision 2537)
authorSergej Reich <sergej.reich@googlemail.com>
Fri, 8 Jun 2012 16:13:01 +0000 (16:13 +0000)
committerSergej Reich <sergej.reich@googlemail.com>
Fri, 8 Jun 2012 16:13:01 +0000 (16:13 +0000)
Remove Jamfiles and other unused files that stuck around during previous updates.

Add patches for local changes to the patches directory.

Update readme.txt, it had outdated infromation.

194 files changed:
extern/bullet2/CMakeLists.txt
extern/bullet2/patches/ghost_softbody.patch [new file with mode: 0644]
extern/bullet2/patches/pvs_warning_fixes.patch [new file with mode: 0644]
extern/bullet2/readme.txt
extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h
extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h
extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h
extern/bullet2/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h
extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.h
extern/bullet2/src/BulletCollision/BroadphaseCollision/btDispatcher.h
extern/bullet2/src/BulletCollision/BroadphaseCollision/btMultiSapBroadphase.cpp
extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h
extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h
extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h
extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btBoxBoxDetector.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionConfiguration.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp
extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp
extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp
extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp
extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp
extern/bullet2/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp
extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp
extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp
extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h
extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.cpp
extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.h
extern/bullet2/src/BulletCollision/CollisionShapes/btBox2dShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.cpp
extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp
extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionMargin.h
extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp
extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPolyhedron.cpp [new file with mode: 0644]
extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPolyhedron.h [new file with mode: 0644]
extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.cpp
extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.cpp
extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp
extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btMaterial.h
extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h
extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp
extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btShapeHull.h
extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp
extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h
extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.h
extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h
extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleInfoMap.h
extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h
extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h
extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleShape.h
extern/bullet2/src/BulletCollision/Gimpact/btContactProcessing.cpp
extern/bullet2/src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h
extern/bullet2/src/BulletCollision/Gimpact/btQuantization.h
extern/bullet2/src/BulletCollision/Gimpact/btTriangleShapeEx.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPointCollector.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp [new file with mode: 0644]
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.h [new file with mode: 0644]
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h
extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h
extern/bullet2/src/BulletDynamics/Character/btCharacterControllerInterface.h
extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btConstraintSolver.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp
extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp
extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btJacobianEntry.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp
extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverConstraint.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp
extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h
extern/bullet2/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp
extern/bullet2/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.h
extern/bullet2/src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.cpp [deleted file]
extern/bullet2/src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.h [deleted file]
extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp
extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h
extern/bullet2/src/BulletDynamics/Dynamics/btDynamicsWorld.h
extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp
extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.h
extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h
extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.h
extern/bullet2/src/BulletDynamics/Vehicle/btVehicleRaycaster.h
extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.h
extern/bullet2/src/BulletSoftBody/btDefaultSoftBodySolver.cpp
extern/bullet2/src/BulletSoftBody/btDefaultSoftBodySolver.h
extern/bullet2/src/BulletSoftBody/btSoftBody.cpp
extern/bullet2/src/BulletSoftBody/btSoftBody.h
extern/bullet2/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp
extern/bullet2/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h
extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp
extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.h
extern/bullet2/src/BulletSoftBody/btSoftBodyInternals.h
extern/bullet2/src/BulletSoftBody/btSoftBodySolvers.h
extern/bullet2/src/BulletSoftBody/btSoftRigidCollisionAlgorithm.h
extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.cpp
extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.h
extern/bullet2/src/BulletSoftBody/btSoftSoftCollisionAlgorithm.h
extern/bullet2/src/BulletSoftBody/btSparseSDF.h
extern/bullet2/src/LinearMath/btAabbUtil2.h
extern/bullet2/src/LinearMath/btAlignedAllocator.cpp
extern/bullet2/src/LinearMath/btAlignedObjectArray.h
extern/bullet2/src/LinearMath/btConvexHull.h
extern/bullet2/src/LinearMath/btConvexHullComputer.cpp [new file with mode: 0644]
extern/bullet2/src/LinearMath/btConvexHullComputer.h [new file with mode: 0644]
extern/bullet2/src/LinearMath/btDefaultMotionState.h
extern/bullet2/src/LinearMath/btGrahamScan2dConvexHull.h [new file with mode: 0644]
extern/bullet2/src/LinearMath/btHashMap.h
extern/bullet2/src/LinearMath/btIDebugDraw.h
extern/bullet2/src/LinearMath/btList.h
extern/bullet2/src/LinearMath/btMinMax.h
extern/bullet2/src/LinearMath/btPoint3.h [deleted file]
extern/bullet2/src/LinearMath/btPoolAllocator.h
extern/bullet2/src/LinearMath/btQuadWord.h
extern/bullet2/src/LinearMath/btQuaternion.h
extern/bullet2/src/LinearMath/btQuickprof.cpp
extern/bullet2/src/LinearMath/btQuickprof.h
extern/bullet2/src/LinearMath/btRandom.h
extern/bullet2/src/LinearMath/btScalar.h
extern/bullet2/src/LinearMath/btSerializer.cpp
extern/bullet2/src/LinearMath/btSerializer.h
extern/bullet2/src/LinearMath/btSimdMinMax.h [deleted file]
extern/bullet2/src/LinearMath/btTransform.h
extern/bullet2/src/LinearMath/btTransformUtil.h
extern/bullet2/src/LinearMath/btVector3.h
extern/bullet2/src/SConscript
extern/bullet2/src/btBulletDynamicsCommon.h

index ae7d282ca55ae0508843d05ccefe69596aded54e..4bf26ab37940eaffd4be156b2b43d99a68309d83 100644 (file)
@@ -43,9 +43,9 @@ set(SRC
        src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp
        src/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp
        src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp
-       src/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp
        src/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.cpp
        src/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp
+       src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp
        src/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp
        src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp
        src/BulletCollision/CollisionDispatch/btCollisionObject.cpp
@@ -54,16 +54,21 @@ set(SRC
        src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp
        src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp
        src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp
+       src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp
        src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp
        src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp
        src/BulletCollision/CollisionDispatch/btGhostObject.cpp
+       src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp
+       src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h
        src/BulletCollision/CollisionDispatch/btManifoldResult.cpp
        src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp
        src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp
        src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp
        src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp
        src/BulletCollision/CollisionDispatch/btUnionFind.cpp
+       src/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp
        src/BulletCollision/CollisionShapes/btBoxShape.cpp
+       src/BulletCollision/CollisionShapes/btBox2dShape.cpp
        src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp
        src/BulletCollision/CollisionShapes/btCapsuleShape.cpp
        src/BulletCollision/CollisionShapes/btCollisionShape.cpp
@@ -73,14 +78,16 @@ set(SRC
        src/BulletCollision/CollisionShapes/btConvexHullShape.cpp
        src/BulletCollision/CollisionShapes/btConvexInternalShape.cpp
        src/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp
+       src/BulletCollision/CollisionShapes/btConvexPolyhedron.cpp
        src/BulletCollision/CollisionShapes/btConvexShape.cpp
+       src/BulletCollision/CollisionShapes/btConvex2dShape.cpp
        src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp
        src/BulletCollision/CollisionShapes/btCylinderShape.cpp
        src/BulletCollision/CollisionShapes/btEmptyShape.cpp
        src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp
        src/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp
-       src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp
        src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp
+       src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp
        src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
        src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp
        src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp
@@ -97,11 +104,11 @@ set(SRC
        src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp
        src/BulletCollision/CollisionShapes/btUniformScalingShape.cpp
        src/BulletCollision/Gimpact/btContactProcessing.cpp
+       src/BulletCollision/Gimpact/btGenericPoolAllocator.cpp
        src/BulletCollision/Gimpact/btGImpactBvh.cpp
        src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp
        src/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp
        src/BulletCollision/Gimpact/btGImpactShape.cpp
-       src/BulletCollision/Gimpact/btGenericPoolAllocator.cpp
        src/BulletCollision/Gimpact/btTriangleShapeEx.cpp
        src/BulletCollision/Gimpact/gim_box_set.cpp
        src/BulletCollision/Gimpact/gim_contact.cpp
@@ -118,25 +125,28 @@ set(SRC
        src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
        src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp
        src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp
-       src/BulletDynamics/Character/btKinematicCharacterController.cpp
+       src/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp
+       
        src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
        src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
        src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
        src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp
+       src/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp
        src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp
        src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp
        src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp
        src/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp
        src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp
        src/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp
-       src/BulletDynamics/Dynamics/Bullet-C-API.cpp
-       src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.cpp
+       src/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp
        src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp
        src/BulletDynamics/Dynamics/btRigidBody.cpp
        src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp
+       src/BulletDynamics/Dynamics/Bullet-C-API.cpp
        src/BulletDynamics/Vehicle/btRaycastVehicle.cpp
        src/BulletDynamics/Vehicle/btWheelInfo.cpp
-       src/BulletSoftBody/btDefaultSoftBodySolver.cpp
+       src/BulletDynamics/Character/btKinematicCharacterController.cpp
+       
        src/BulletSoftBody/btSoftBody.cpp
        src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp
        src/BulletSoftBody/btSoftBodyHelpers.cpp
@@ -144,21 +154,16 @@ set(SRC
        src/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp
        src/BulletSoftBody/btSoftRigidDynamicsWorld.cpp
        src/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp
+       src/BulletSoftBody/btDefaultSoftBodySolver.cpp
+       
        src/LinearMath/btAlignedAllocator.cpp
        src/LinearMath/btConvexHull.cpp
+       src/LinearMath/btConvexHullComputer.cpp
        src/LinearMath/btGeometryUtil.cpp
        src/LinearMath/btQuickprof.cpp
        src/LinearMath/btSerializer.cpp
-       # UNUSED
-       # src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp
-       # src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp
-       # src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp
-       # src/BulletCollision/CollisionShapes/btBox2dShape.cpp
-       # src/BulletCollision/CollisionShapes/btConvex2dShape.cpp
-       # src/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp
-       # src/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp
-
-       src/Bullet-C-Api.h
+       
+       
        src/BulletCollision/BroadphaseCollision/btAxisSweep3.h
        src/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h
        src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h
@@ -171,9 +176,9 @@ set(SRC
        src/BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h
        src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h
        src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h
-       src/BulletCollision/CollisionDispatch/SphereTriangleDetector.h
        src/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h
        src/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h
+       src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h
        src/BulletCollision/CollisionDispatch/btBoxBoxDetector.h
        src/BulletCollision/CollisionDispatch/btCollisionConfiguration.h
        src/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h
@@ -183,6 +188,7 @@ set(SRC
        src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h
        src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h
        src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h
+       src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h
        src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h
        src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h
        src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h
@@ -193,7 +199,9 @@ set(SRC
        src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h
        src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h
        src/BulletCollision/CollisionDispatch/btUnionFind.h
+       src/BulletCollision/CollisionDispatch/SphereTriangleDetector.h
        src/BulletCollision/CollisionShapes/btBoxShape.h
+       src/BulletCollision/CollisionShapes/btBox2dShape.h
        src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h
        src/BulletCollision/CollisionShapes/btCapsuleShape.h
        src/BulletCollision/CollisionShapes/btCollisionMargin.h
@@ -204,15 +212,17 @@ set(SRC
        src/BulletCollision/CollisionShapes/btConvexHullShape.h
        src/BulletCollision/CollisionShapes/btConvexInternalShape.h
        src/BulletCollision/CollisionShapes/btConvexPointCloudShape.h
+       src/BulletCollision/CollisionShapes/btConvexPolyhedron.h
        src/BulletCollision/CollisionShapes/btConvexShape.h
+       src/BulletCollision/CollisionShapes/btConvex2dShape.h
        src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h
        src/BulletCollision/CollisionShapes/btCylinderShape.h
        src/BulletCollision/CollisionShapes/btEmptyShape.h
        src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h
        src/BulletCollision/CollisionShapes/btMaterial.h
        src/BulletCollision/CollisionShapes/btMinkowskiSumShape.h
-       src/BulletCollision/CollisionShapes/btMultiSphereShape.h
        src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h
+       src/BulletCollision/CollisionShapes/btMultiSphereShape.h
        src/BulletCollision/CollisionShapes/btOptimizedBvh.h
        src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h
        src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h
@@ -233,13 +243,13 @@ set(SRC
        src/BulletCollision/Gimpact/btBoxCollision.h
        src/BulletCollision/Gimpact/btClipPolygon.h
        src/BulletCollision/Gimpact/btContactProcessing.h
+       src/BulletCollision/Gimpact/btGenericPoolAllocator.h
+       src/BulletCollision/Gimpact/btGeometryOperations.h
        src/BulletCollision/Gimpact/btGImpactBvh.h
        src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h
        src/BulletCollision/Gimpact/btGImpactMassUtil.h
        src/BulletCollision/Gimpact/btGImpactQuantizedBvh.h
        src/BulletCollision/Gimpact/btGImpactShape.h
-       src/BulletCollision/Gimpact/btGenericPoolAllocator.h
-       src/BulletCollision/Gimpact/btGeometryOperations.h
        src/BulletCollision/Gimpact/btQuantization.h
        src/BulletCollision/Gimpact/btTriangleShapeEx.h
        src/BulletCollision/Gimpact/gim_array.h
@@ -273,14 +283,15 @@ set(SRC
        src/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h
        src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h
        src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h
-       src/BulletDynamics/Character/btCharacterControllerInterface.h
-       src/BulletDynamics/Character/btKinematicCharacterController.h
+       src/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.h
+       
        src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
        src/BulletDynamics/ConstraintSolver/btConstraintSolver.h
        src/BulletDynamics/ConstraintSolver/btContactConstraint.h
        src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h
        src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
        src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h
+       src/BulletDynamics/ConstraintSolver/btHinge2Constraint.h
        src/BulletDynamics/ConstraintSolver/btHingeConstraint.h
        src/BulletDynamics/ConstraintSolver/btJacobianEntry.h
        src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h
@@ -290,41 +301,45 @@ set(SRC
        src/BulletDynamics/ConstraintSolver/btSolverBody.h
        src/BulletDynamics/ConstraintSolver/btSolverConstraint.h
        src/BulletDynamics/ConstraintSolver/btTypedConstraint.h
+       src/BulletDynamics/ConstraintSolver/btUniversalConstraint.h
        src/BulletDynamics/Dynamics/btActionInterface.h
-       src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.h
        src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h
        src/BulletDynamics/Dynamics/btDynamicsWorld.h
-       src/BulletDynamics/Dynamics/btRigidBody.h
        src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h
+       src/BulletDynamics/Dynamics/btRigidBody.h
        src/BulletDynamics/Vehicle/btRaycastVehicle.h
        src/BulletDynamics/Vehicle/btVehicleRaycaster.h
        src/BulletDynamics/Vehicle/btWheelInfo.h
-       src/BulletSoftBody/btDefaultSoftBodySolver.h
+       src/BulletDynamics/Character/btCharacterControllerInterface.h
+       src/BulletDynamics/Character/btKinematicCharacterController.h
+       
        src/BulletSoftBody/btSoftBody.h
-       src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h
        src/BulletSoftBody/btSoftBodyData.h
+       src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h
        src/BulletSoftBody/btSoftBodyHelpers.h
-       src/BulletSoftBody/btSoftBodyInternals.h
        src/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h
-       src/BulletSoftBody/btSoftBodySolverVertexBuffer.h
-       src/BulletSoftBody/btSoftBodySolvers.h
        src/BulletSoftBody/btSoftRigidCollisionAlgorithm.h
        src/BulletSoftBody/btSoftRigidDynamicsWorld.h
        src/BulletSoftBody/btSoftSoftCollisionAlgorithm.h
        src/BulletSoftBody/btSparseSDF.h
+       src/BulletSoftBody/btSoftBodySolvers.h
+       src/BulletSoftBody/btDefaultSoftBodySolver.h
+       src/BulletSoftBody/btSoftBodySolverVertexBuffer.h
+       
        src/LinearMath/btAabbUtil2.h
        src/LinearMath/btAlignedAllocator.h
        src/LinearMath/btAlignedObjectArray.h
        src/LinearMath/btConvexHull.h
+       src/LinearMath/btConvexHullComputer.h
        src/LinearMath/btDefaultMotionState.h
        src/LinearMath/btGeometryUtil.h
+       src/LinearMath/btGrahamScan2dConvexHull.h
        src/LinearMath/btHashMap.h
        src/LinearMath/btIDebugDraw.h
        src/LinearMath/btList.h
        src/LinearMath/btMatrix3x3.h
        src/LinearMath/btMinMax.h
        src/LinearMath/btMotionState.h
-       src/LinearMath/btPoint3.h
        src/LinearMath/btPoolAllocator.h
        src/LinearMath/btQuadWord.h
        src/LinearMath/btQuaternion.h
@@ -332,20 +347,14 @@ set(SRC
        src/LinearMath/btRandom.h
        src/LinearMath/btScalar.h
        src/LinearMath/btSerializer.h
-       src/LinearMath/btSimdMinMax.h
        src/LinearMath/btStackAlloc.h
        src/LinearMath/btTransform.h
        src/LinearMath/btTransformUtil.h
        src/LinearMath/btVector3.h
+       
+       
        src/btBulletCollisionCommon.h
        src/btBulletDynamicsCommon.h
-       # src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h
-       # src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h
-       # src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h
-       # src/BulletCollision/CollisionShapes/btBox2dShape.h
-       # src/BulletCollision/CollisionShapes/btConvex2dShape.h
-       # src/BulletDynamics/ConstraintSolver/btHinge2Constraint.h
-       # src/BulletDynamics/ConstraintSolver/btUniversalConstraint.h
 )
 
 if(CMAKE_COMPILER_IS_GNUCXX)
diff --git a/extern/bullet2/patches/ghost_softbody.patch b/extern/bullet2/patches/ghost_softbody.patch
new file mode 100644 (file)
index 0000000..b150d57
--- /dev/null
@@ -0,0 +1,42 @@
+Index: extern/bullet2/src/BulletSoftBody/btSoftBody.cpp
+===================================================================
+--- extern/bullet2/src/BulletSoftBody/btSoftBody.cpp   (Revision 43904)
++++ extern/bullet2/src/BulletSoftBody/btSoftBody.cpp   (Revision 43905)
+@@ -2780,21 +2780,23 @@
+       {
+               const RContact&         c = psb->m_rcontacts[i];
+               const sCti&                     cti = c.m_cti;  
+-              btRigidBody* tmpRigid = btRigidBody::upcast(cti.m_colObj);
+-              const btVector3         va = tmpRigid ? tmpRigid->getVelocityInLocalPoint(c.m_c1)*dt : btVector3(0,0,0);
+-              const btVector3         vb = c.m_node->m_x-c.m_node->m_q;       
+-              const btVector3         vr = vb-va;
+-              const btScalar          dn = btDot(vr, cti.m_normal);           
+-              if(dn<=SIMD_EPSILON)
+-              {
+-                      const btScalar          dp = btMin( (btDot(c.m_node->m_x, cti.m_normal) + cti.m_offset), mrg );
+-                      const btVector3         fv = vr - (cti.m_normal * dn);
+-                      // c0 is the impulse matrix, c3 is 1 - the friction coefficient or 0, c4 is the contact hardness coefficient
+-                      const btVector3         impulse = c.m_c0 * ( (vr - (fv * c.m_c3) + (cti.m_normal * (dp * c.m_c4))) * kst );
+-                      c.m_node->m_x -= impulse * c.m_c2;
+-                      if (tmpRigid)
+-                              tmpRigid->applyImpulse(impulse,c.m_c1);
++              if (cti.m_colObj->hasContactResponse()) {
++                      btRigidBody* tmpRigid = btRigidBody::upcast(cti.m_colObj);
++                      const btVector3         va = tmpRigid ? tmpRigid->getVelocityInLocalPoint(c.m_c1)*dt : btVector3(0,0,0);
++                      const btVector3         vb = c.m_node->m_x-c.m_node->m_q;       
++                      const btVector3         vr = vb-va;
++                      const btScalar          dn = btDot(vr, cti.m_normal);           
++                      if(dn<=SIMD_EPSILON)
++                      {
++                              const btScalar          dp = btMin( (btDot(c.m_node->m_x, cti.m_normal) + cti.m_offset), mrg );
++                              const btVector3         fv = vr - (cti.m_normal * dn);
++                              // c0 is the impulse matrix, c3 is 1 - the friction coefficient or 0, c4 is the contact hardness coefficient
++                              const btVector3         impulse = c.m_c0 * ( (vr - (fv * c.m_c3) + (cti.m_normal * (dp * c.m_c4))) * kst );
++                              c.m_node->m_x -= impulse * c.m_c2;
++                              if (tmpRigid)
++                                      tmpRigid->applyImpulse(impulse,c.m_c1);
++                      }
+               }
+       }
+ }
diff --git a/extern/bullet2/patches/pvs_warning_fixes.patch b/extern/bullet2/patches/pvs_warning_fixes.patch
new file mode 100644 (file)
index 0000000..5a3fe14
--- /dev/null
@@ -0,0 +1,31 @@
+Index: extern/bullet2/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h
+===================================================================
+--- extern/bullet2/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h    (Revision 45907)
++++ extern/bullet2/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h    (Revision 45908)
+@@ -45,7 +45,9 @@
+       int     getTriangleIndex() const
+       {
+               // Get only the lower bits where the triangle index is stored
+-              return (m_PartIdTriangleIndex&~((~0)<<(31-MAX_NUM_PARTS_IN_BITS)));
++              unsigned int x = 0;
++              unsigned int y = (~(x&0))<<(31-MAX_NUM_PARTS_IN_BITS);
++              return (m_PartIdTriangleIndex&~(y));
+       }
+       int     getPartId() const
+       {
+Index: extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h
+===================================================================
+--- extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h    (Revision 45907)
++++ extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h    (Revision 45908)
+@@ -78,8 +78,10 @@
+       int     getTriangleIndex() const
+       {
+               btAssert(isLeafNode());
++              unsigned int x=0;
++              unsigned int y = (~(x&0))<<(31-MAX_NUM_PARTS_IN_BITS);
+               // Get only the lower bits where the triangle index is stored
+-              return (m_escapeIndexOrTriangleIndex&~((~0)<<(31-MAX_NUM_PARTS_IN_BITS)));
++              return (m_escapeIndexOrTriangleIndex&~(y));
+       }
+       int     getPartId() const
+       {
index e2546b049e38147b48e666d35182a7a8201c99dd..e537ac26189ffcc3ee1fd69e9abc2d25cd1075b2 100644 (file)
@@ -1,21 +1,15 @@
-***
-Apply bullet_compound_raycast.patch if not already applied in Bullet source
-This patch is needed to return correct raycast results on compound shape.
-/ben
-
-
-*** These files in extern/bullet2 are NOT part of the Blender build yet ***
-
 This is the new refactored version of Bullet physics library version 2.x
 
-Soon this will replace the old Bullet version in extern/bullet.
-First the integration in Blender Game Engine needs to be updated.
-Once that is done all build systems can be updated to use/build extern/bullet2 files.
-
 Questions? mail blender at erwincoumans.com, or check the bf-blender mailing list.
 Thanks,
 Erwin
 
+Apply patches/ghost_softbody.patch to prevent softbodies being hit by ghost objects.
+Originally committed in blender svn revision: 43905.
+
+Apply patches/pvs_warning_fixes.patch to fix warnings reported by PVS-Studio.
+Originally committed in blender svn revision: 45908.
+
 Apply patches/make_id.patch to prevent duplicated define of MAKE_ID macro in blender
 side and bullet side.
 Sergey
index 70cf3e4ace83778ca830ad2b0c6c7b6883c6005f..4f4d94b3cc7a03b4c24f80ca1e81d91014c6b36e 100644 (file)
@@ -16,8 +16,8 @@
 //
 // 3. This notice may not be removed or altered from any source distribution.
 
-#ifndef AXIS_SWEEP_3_H
-#define AXIS_SWEEP_3_H
+#ifndef BT_AXIS_SWEEP_3_H
+#define BT_AXIS_SWEEP_3_H
 
 #include "LinearMath/btVector3.h"
 #include "btOverlappingPairCache.h"
@@ -1026,7 +1026,7 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::sortMaxUp(int axis, BP_FP_INT_TYPE ed
 
 
 /// The btAxisSweep3 is an efficient implementation of the 3d axis sweep and prune broadphase.
-/// It uses arrays rather than lists for storage of the 3 axis. Also it operates using 16 bit integer coordinates instead of floats.
+/// It uses arrays rather then lists for storage of the 3 axis. Also it operates using 16 bit integer coordinates instead of floats.
 /// For large worlds and many objects, use bt32BitAxisSweep3 or btDbvtBroadphase instead. bt32BitAxisSweep3 has higher precision and allows more then 16384 objects at the cost of more memory and bit of performance.
 class btAxisSweep3 : public btAxisSweep3Internal<unsigned short int>
 {
@@ -1038,7 +1038,7 @@ public:
 
 /// The bt32BitAxisSweep3 allows higher precision quantization and more objects compared to the btAxisSweep3 sweep and prune.
 /// This comes at the cost of more memory per handle, and a bit slower performance.
-/// It uses arrays rather than lists for storage of the 3 axis.
+/// It uses arrays rather then lists for storage of the 3 axis.
 class bt32BitAxisSweep3 : public btAxisSweep3Internal<unsigned int>
 {
 public:
index fe414effbfc490fed4e1d79f28daff664ae8787c..f1bf00594d3be75ab6364271477bc38d86b34e42 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef                BROADPHASE_INTERFACE_H
-#define        BROADPHASE_INTERFACE_H
+#ifndef                BT_BROADPHASE_INTERFACE_H
+#define        BT_BROADPHASE_INTERFACE_H
 
 
 
@@ -79,4 +79,4 @@ public:
 
 };
 
-#endif //BROADPHASE_INTERFACE_H
+#endif //BT_BROADPHASE_INTERFACE_H
index 62d349739c3ce4568cc1693725c65fb9ceaedad4..bb58b82893611ea0f8dc7d390105b8bf3f4aef2d 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef BROADPHASE_PROXY_H
-#define BROADPHASE_PROXY_H
+#ifndef BT_BROADPHASE_PROXY_H
+#define BT_BROADPHASE_PROXY_H
 
 #include "LinearMath/btScalar.h" //for SIMD_FORCE_INLINE
 #include "LinearMath/btVector3.h"
@@ -246,7 +246,7 @@ class btBroadphasePairSortPredicate
 {
        public:
 
-               bool operator() ( const btBroadphasePair& a, const btBroadphasePair& b )
+               bool operator() ( const btBroadphasePair& a, const btBroadphasePair& b ) const
                {
                        const int uidA0 = a.m_pProxy0 ? a.m_pProxy0->m_uniqueId : -1;
                        const int uidB0 = b.m_pProxy0 ? b.m_pProxy0->m_uniqueId : -1;
@@ -266,5 +266,5 @@ SIMD_FORCE_INLINE bool operator==(const btBroadphasePair& a, const btBroadphaseP
 }
 
 
-#endif //BROADPHASE_PROXY_H
+#endif //BT_BROADPHASE_PROXY_H
 
index 0d8bca41c8efc9cad696fec97b8d8e80b3936e37..36eec97174f326aca4d6687775e3a5b164708ae5 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef COLLISION_ALGORITHM_H
-#define COLLISION_ALGORITHM_H
+#ifndef BT_COLLISION_ALGORITHM_H
+#define BT_COLLISION_ALGORITHM_H
 
 #include "LinearMath/btScalar.h"
 #include "LinearMath/btAlignedObjectArray.h"
@@ -77,4 +77,4 @@ public:
 };
 
 
-#endif //COLLISION_ALGORITHM_H
+#endif //BT_COLLISION_ALGORITHM_H
index 2bb8ef5d2a7faf8d905b48c503e51f4c5783004c..409da80ae1b2c8a08a5cd93f2f1aebf147b44709 100644 (file)
@@ -259,6 +259,7 @@ struct      btDbvt
 
        
        btAlignedObjectArray<sStkNN>    m_stkStack;
+       mutable btAlignedObjectArray<const btDbvtNode*> m_rayTestStack;
 
 
        // Methods
@@ -955,7 +956,7 @@ inline void         btDbvt::rayTestInternal(        const btDbvtNode* root,
 
                int                                                             depth=1;
                int                                                             treshold=DOUBLE_STACKSIZE-2;
-               btAlignedObjectArray<const btDbvtNode*> stack;
+               btAlignedObjectArray<const btDbvtNode*>&        stack = m_rayTestStack;
                stack.resize(DOUBLE_STACKSIZE);
                stack[0]=root;
                btVector3 bounds[2];
index 8ded0006c3b3e54339f3be3e45eec740928566e9..a79cf9402b1d5cd3d143ed4410dccedaa20ba338 100644 (file)
@@ -13,9 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef _DISPATCHER_H
-#define _DISPATCHER_H
-
+#ifndef BT_DISPATCHER_H
+#define BT_DISPATCHER_H
 #include "LinearMath/btScalar.h"
 
 class btCollisionAlgorithm;
@@ -27,6 +26,7 @@ class btOverlappingPairCache;
 
 class btPersistentManifold;
 class btStackAlloc;
+class btPoolAllocator;
 
 struct btDispatcherInfo
 {
@@ -40,7 +40,7 @@ struct btDispatcherInfo
                m_stepCount(0),
                m_dispatchFunc(DISPATCH_DISCRETE),
                m_timeOfImpact(btScalar(1.)),
-               m_useContinuous(false),
+               m_useContinuous(true),
                m_debugDraw(0),
                m_enableSatConvex(false),
                m_enableSPU(true),
@@ -48,7 +48,6 @@ struct btDispatcherInfo
                m_allowedCcdPenetration(btScalar(0.04)),
                m_useConvexConservativeDistanceUtil(false),
                m_convexConservativeDistanceThreshold(0.0f),
-               m_convexMaxDistanceUseCPT(false),
                m_stackAllocator(0)
        {
 
@@ -65,7 +64,6 @@ struct btDispatcherInfo
        btScalar        m_allowedCcdPenetration;
        bool            m_useConvexConservativeDistanceUtil;
        btScalar        m_convexConservativeDistanceThreshold;
-       bool            m_convexMaxDistanceUseCPT;
        btStackAlloc*   m_stackAllocator;
 };
 
@@ -98,6 +96,10 @@ public:
 
        virtual btPersistentManifold**  getInternalManifoldPointer() = 0;
 
+       virtual btPoolAllocator*        getInternalManifoldPool() = 0;
+
+       virtual const btPoolAllocator*  getInternalManifoldPool() const = 0;
+
        virtual void* allocateCollisionAlgorithm(int size)  = 0;
 
        virtual void freeCollisionAlgorithm(void* ptr) = 0;
@@ -105,4 +107,4 @@ public:
 };
 
 
-#endif //_DISPATCHER_H
+#endif //BT_DISPATCHER_H
index 6712f528e97efacc21aeec75f2288d83da6f04ab..81369fe9b50a4d97d1dae080093526032981d228 100644 (file)
@@ -341,7 +341,7 @@ class btMultiSapBroadphasePairSortPredicate
 {
        public:
 
-               bool operator() ( const btBroadphasePair& a1, const btBroadphasePair& b1 )
+               bool operator() ( const btBroadphasePair& a1, const btBroadphasePair& b1 ) const
                {
                                btMultiSapBroadphase::btMultiSapProxy* aProxy0 = a1.m_pProxy0 ? (btMultiSapBroadphase::btMultiSapProxy*)a1.m_pProxy0->m_multiSapParentProxy : 0;
                                btMultiSapBroadphase::btMultiSapProxy* aProxy1 = a1.m_pProxy1 ? (btMultiSapBroadphase::btMultiSapProxy*)a1.m_pProxy1->m_multiSapParentProxy : 0;
index 3945afb8d706a58aac69890c3d8914f689ee3997..7a3806c1d2855b865e4178e74a95e18b21d8d479 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef OVERLAPPING_PAIR_CACHE_H
-#define OVERLAPPING_PAIR_CACHE_H
+#ifndef BT_OVERLAPPING_PAIR_CACHE_H
+#define BT_OVERLAPPING_PAIR_CACHE_H
 
 
 #include "btBroadphaseInterface.h"
@@ -464,6 +464,6 @@ public:
 };
 
 
-#endif //OVERLAPPING_PAIR_CACHE_H
+#endif //BT_OVERLAPPING_PAIR_CACHE_H
 
 
index 9e247d125f588386b4c139c1394762d126de63e3..78382da79f0a83138ea03e8bb5224070c02d2f3a 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef QUANTIZED_BVH_H
-#define QUANTIZED_BVH_H
+#ifndef BT_QUANTIZED_BVH_H
+#define BT_QUANTIZED_BVH_H
 
 class btSerializer;
 
@@ -109,9 +109,9 @@ ATTRIBUTE_ALIGNED16 (struct) btOptimizedBvhNode
        //for child nodes
        int     m_subPart;
        int     m_triangleIndex;
-       int     m_padding[5];//bad, due to alignment
-
 
+//pad the size to 64 bytes
+       char    m_padding[20];
 };
 
 
@@ -339,7 +339,7 @@ public:
 
        
        ///***************************************** expert/internal use only *************************
-       void    setQuantizationValues(const btVector3& bvhAabbMin,const btVector3& bvhAabbMax,btScalar quantizationMargin=btScalar(1.5));
+       void    setQuantizationValues(const btVector3& bvhAabbMin,const btVector3& bvhAabbMax,btScalar quantizationMargin=btScalar(1.0));
        QuantizedNodeArray&     getLeafNodeArray() {                    return  m_quantizedLeafNodes;   }
        ///buildInternal is expert use only: assumes that setQuantizationValues and LeafNodeArray are initialized
        void    buildInternal();
@@ -578,4 +578,4 @@ SIMD_FORCE_INLINE   int     btQuantizedBvh::calculateSerializeBufferSizeNew() const
 
 
 
-#endif //QUANTIZED_BVH_H
+#endif //BT_QUANTIZED_BVH_H
index 3e7c7ee3b62151ea018d34e4b1f78e7790b246c4..7cb3c40a043827142aeed39f4e99d7d14a2972aa 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef SIMPLE_BROADPHASE_H
-#define SIMPLE_BROADPHASE_H
+#ifndef BT_SIMPLE_BROADPHASE_H
+#define BT_SIMPLE_BROADPHASE_H
 
 
 #include "btOverlappingPairCache.h"
@@ -167,5 +167,5 @@ public:
 
 
 
-#endif //SIMPLE_BROADPHASE_H
+#endif //BT_SIMPLE_BROADPHASE_H
 
index f656e5c323acb4ba0cfa74e1433bbd10cc9575f1..22953af43fdb0728be704749d7897c32c00bff37 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef SPHERE_TRIANGLE_DETECTOR_H
-#define SPHERE_TRIANGLE_DETECTOR_H
+#ifndef BT_SPHERE_TRIANGLE_DETECTOR_H
+#define BT_SPHERE_TRIANGLE_DETECTOR_H
 
 #include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h"
 
@@ -47,5 +47,5 @@ private:
        btScalar        m_contactBreakingThreshold;
        
 };
-#endif //SPHERE_TRIANGLE_DETECTOR_H
+#endif //BT_SPHERE_TRIANGLE_DETECTOR_H
 
index 21342175238e4c3c5cbaded2f091ba3bc7b3b289..97c5be7700391ab378a9dc6aa4f3a69705745a60 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef BOX_2D_BOX_2D__COLLISION_ALGORITHM_H
-#define BOX_2D_BOX_2D__COLLISION_ALGORITHM_H
+#ifndef BT_BOX_2D_BOX_2D__COLLISION_ALGORITHM_H
+#define BT_BOX_2D_BOX_2D__COLLISION_ALGORITHM_H
 
 #include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h"
 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
@@ -62,5 +62,5 @@ public:
 
 };
 
-#endif //BOX_2D_BOX_2D__COLLISION_ALGORITHM_H
+#endif //BT_BOX_2D_BOX_2D__COLLISION_ALGORITHM_H
 
index e7d2cc25c229d3489f056fb95d6d7e6118a4ba1d..f0bbae61e3b58509ec2710244b20e4c0acd07fad 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef BOX_BOX__COLLISION_ALGORITHM_H
-#define BOX_BOX__COLLISION_ALGORITHM_H
+#ifndef BT_BOX_BOX__COLLISION_ALGORITHM_H
+#define BT_BOX_BOX__COLLISION_ALGORITHM_H
 
 #include "btActivatingCollisionAlgorithm.h"
 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
@@ -62,5 +62,5 @@ public:
 
 };
 
-#endif //BOX_BOX__COLLISION_ALGORITHM_H
+#endif //BT_BOX_BOX__COLLISION_ALGORITHM_H
 
index 605294d47bd41ec9da3f18367710ec1bcf5a7eb1..3c941f7deb233f76049d38ca903e51bbc3d270f5 100644 (file)
@@ -16,8 +16,8 @@ subject to the following restrictions:
 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 BOX_BOX_DETECTOR_H
-#define BOX_BOX_DETECTOR_H
+#ifndef BT_BOX_BOX_DETECTOR_H
+#define BT_BOX_BOX_DETECTOR_H
 
 
 class btBoxShape;
index 1db51a36d03312802103a2d958295536e0a09487..f63e0923b783f938d133ace270497d59943f5bcd 100644 (file)
@@ -15,6 +15,7 @@ subject to the following restrictions:
 
 #ifndef BT_COLLISION_CONFIGURATION
 #define BT_COLLISION_CONFIGURATION
+
 struct btCollisionAlgorithmCreateFunc;
 
 class btStackAlloc;
index a6da5f61a3c67de292d75e86db3e72fb0722670f..1d7e74401dd84ced780762c0978f677a90ef2911 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef COLLISION_CREATE_FUNC
-#define COLLISION_CREATE_FUNC
+#ifndef BT_COLLISION_CREATE_FUNC
+#define BT_COLLISION_CREATE_FUNC
 
 #include "LinearMath/btAlignedObjectArray.h"
 class btCollisionAlgorithm;
@@ -41,5 +41,5 @@ struct btCollisionAlgorithmCreateFunc
                return 0;
        }
 };
-#endif //COLLISION_CREATE_FUNC
+#endif //BT_COLLISION_CREATE_FUNC
 
index 9fed44a19f73ee19e3833e1424c6b01ccf68f433..29674f3be46e2cfe0bc5b5f6e3cc00e1cb7254d5 100644 (file)
@@ -92,8 +92,16 @@ btPersistentManifold*        btCollisionDispatcher::getNewManifold(void* b0,void* b1)
                mem = m_persistentManifoldPoolAllocator->allocate(sizeof(btPersistentManifold));
        } else
        {
-               mem = btAlignedAlloc(sizeof(btPersistentManifold),16);
-
+               //we got a pool memory overflow, by default we fallback to dynamically allocate memory. If we require a contiguous contact pool then assert.
+               if ((m_dispatcherFlags&CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION)==0)
+               {
+                       mem = btAlignedAlloc(sizeof(btPersistentManifold),16);
+               } else
+               {
+                       btAssert(0);
+                       //make sure to increase the m_defaultMaxPersistentManifoldPoolSize in the btDefaultCollisionConstructionInfo/btDefaultCollisionConfiguration
+                       return 0;
+               }
        }
        btPersistentManifold* manifold = new(mem) btPersistentManifold (body0,body1,0,contactBreakingThreshold,contactProcessingThreshold);
        manifold->m_index1a = m_manifoldsPtr.size();
@@ -172,8 +180,7 @@ bool        btCollisionDispatcher::needsCollision(btCollisionObject* body0,btCollisionO
        if (!(m_dispatcherFlags & btCollisionDispatcher::CD_STATIC_STATIC_REPORTED))
        {
                //broadphase filtering already deals with this
-               if ((body0->isStaticObject() || body0->isKinematicObject()) &&
-                       (body1->isStaticObject() || body1->isKinematicObject()))
+               if (body0->isStaticOrKinematicObject() && body1->isStaticOrKinematicObject())
                {
                        m_dispatcherFlags |= btCollisionDispatcher::CD_STATIC_STATIC_REPORTED;
                        printf("warning btCollisionDispatcher::needsCollision: static-static collision!\n");
index 3c4f039504a36f4c87c04c9b36860991ba8eefad..5accad9a993bcac450c915e0df621c931eed344b 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef COLLISION__DISPATCHER_H
-#define COLLISION__DISPATCHER_H
+#ifndef BT_COLLISION__DISPATCHER_H
+#define BT_COLLISION__DISPATCHER_H
 
 #include "BulletCollision/BroadphaseCollision/btDispatcher.h"
 #include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
@@ -67,7 +67,8 @@ public:
        enum DispatcherFlags
        {
                CD_STATIC_STATIC_REPORTED = 1,
-               CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD = 2
+               CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD = 2,
+               CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION = 4
        };
 
        int     getDispatcherFlags() const
@@ -90,7 +91,7 @@ public:
 
        btPersistentManifold**  getInternalManifoldPointer()
        {
-               return &m_manifoldsPtr[0];
+               return m_manifoldsPtr.size()? &m_manifoldsPtr[0] : 0;
        }
 
         btPersistentManifold* getManifoldByIndexInternal(int index)
@@ -155,7 +156,17 @@ public:
                m_collisionConfiguration = config;
        }
 
+       virtual btPoolAllocator*        getInternalManifoldPool()
+       {
+               return m_persistentManifoldPoolAllocator;
+       }
+
+       virtual const btPoolAllocator*  getInternalManifoldPool() const
+       {
+               return m_persistentManifoldPoolAllocator;
+       }
+
 };
 
-#endif //COLLISION__DISPATCHER_H
+#endif //BT_COLLISION__DISPATCHER_H
 
index 5de829824ff0b908d9ecd61da05e020b2e824c83..3a11c967ac9c498a498ad1b6e61abbfe24839032 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef COLLISION_OBJECT_H
-#define COLLISION_OBJECT_H
+#ifndef BT_COLLISION_OBJECT_H
+#define BT_COLLISION_OBJECT_H
 
 #include "LinearMath/btTransform.h"
 
@@ -521,4 +521,4 @@ SIMD_FORCE_INLINE   int     btCollisionObject::calculateSerializeBufferSize() const
 
 
 
-#endif //COLLISION_OBJECT_H
+#endif //BT_COLLISION_OBJECT_H
index bfe8d4f52fb172702fae8629906814d93d576e59..66b93b88efa05763fe6b0968ec0f0ade16a4e8fd 100644 (file)
@@ -33,6 +33,7 @@ subject to the following restrictions:
 #include "LinearMath/btQuickprof.h"
 #include "LinearMath/btStackAlloc.h"
 #include "LinearMath/btSerializer.h"
+#include "BulletCollision/CollisionShapes/btConvexPolyhedron.h"
 
 //#define DISABLE_DBVT_COMPOUNDSHAPE_RAYCAST_ACCELERATION
 
@@ -154,7 +155,7 @@ void        btCollisionWorld::updateSingleAabb(btCollisionObject* colObj)
        minAabb -= contactThreshold;
        maxAabb += contactThreshold;
 
-       if(getDispatchInfo().m_convexMaxDistanceUseCPT)
+       if(getDispatchInfo().m_useContinuous && colObj->getInternalType()==btCollisionObject::CO_RIGID_BODY && !colObj->isStaticOrKinematicObject())
        {
                btVector3 minAabb2,maxAabb2;
                colObj->getCollisionShape()->getAabb(colObj->getInterpolationWorldTransform(),minAabb2,maxAabb2);
@@ -662,68 +663,103 @@ void     btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
                                triangleMesh->performConvexcast(&tccb,convexFromLocal,convexToLocal,boxMinLocal, boxMaxLocal);
                        } else
                        {
-                               //BT_PROFILE("convexSweepConcave");
-                               btConcaveShape* concaveShape = (btConcaveShape*)collisionShape;
-                               btTransform worldTocollisionObject = colObjWorldTransform.inverse();
-                               btVector3 convexFromLocal = worldTocollisionObject * convexFromTrans.getOrigin();
-                               btVector3 convexToLocal = worldTocollisionObject * convexToTrans.getOrigin();
-                               // rotation of box in local mesh space = MeshRotation^-1 * ConvexToRotation
-                               btTransform rotationXform = btTransform(worldTocollisionObject.getBasis() * convexToTrans.getBasis());
-
-                               //ConvexCast::CastResult
-                               struct BridgeTriangleConvexcastCallback : public btTriangleConvexcastCallback
+                               if (collisionShape->getShapeType()==STATIC_PLANE_PROXYTYPE)
                                {
-                                       btCollisionWorld::ConvexResultCallback* m_resultCallback;
-                                       btCollisionObject*      m_collisionObject;
-                                       btConcaveShape* m_triangleMesh;
-
-                                       BridgeTriangleConvexcastCallback(const btConvexShape* castShape, const btTransform& from,const btTransform& to,
-                                               btCollisionWorld::ConvexResultCallback* resultCallback, btCollisionObject* collisionObject,btConcaveShape*      triangleMesh, const btTransform& triangleToWorld):
-                                       btTriangleConvexcastCallback(castShape, from,to, triangleToWorld, triangleMesh->getMargin()),
-                                               m_resultCallback(resultCallback),
-                                               m_collisionObject(collisionObject),
-                                               m_triangleMesh(triangleMesh)
+                                       btConvexCast::CastResult castResult;
+                                       castResult.m_allowedPenetration = allowedPenetration;
+                                       castResult.m_fraction = resultCallback.m_closestHitFraction;
+                                       btStaticPlaneShape* planeShape = (btStaticPlaneShape*) collisionShape;
+                                       btContinuousConvexCollision convexCaster1(castShape,planeShape);
+                                       btConvexCast* castPtr = &convexCaster1;
+
+                                       if (castPtr->calcTimeOfImpact(convexFromTrans,convexToTrans,colObjWorldTransform,colObjWorldTransform,castResult))
                                        {
+                                               //add hit
+                                               if (castResult.m_normal.length2() > btScalar(0.0001))
+                                               {
+                                                       if (castResult.m_fraction < resultCallback.m_closestHitFraction)
+                                                       {
+                                                               castResult.m_normal.normalize();
+                                                               btCollisionWorld::LocalConvexResult localConvexResult
+                                                                       (
+                                                                       collisionObject,
+                                                                       0,
+                                                                       castResult.m_normal,
+                                                                       castResult.m_hitPoint,
+                                                                       castResult.m_fraction
+                                                                       );
+
+                                                               bool normalInWorldSpace = true;
+                                                               resultCallback.addSingleResult(localConvexResult, normalInWorldSpace);
+                                                       }
+                                               }
                                        }
 
-
-                                       virtual btScalar reportHit(const btVector3& hitNormalLocal, const btVector3& hitPointLocal, btScalar hitFraction, int partId, int triangleIndex )
+                               } else
+                               {
+                                       //BT_PROFILE("convexSweepConcave");
+                                       btConcaveShape* concaveShape = (btConcaveShape*)collisionShape;
+                                       btTransform worldTocollisionObject = colObjWorldTransform.inverse();
+                                       btVector3 convexFromLocal = worldTocollisionObject * convexFromTrans.getOrigin();
+                                       btVector3 convexToLocal = worldTocollisionObject * convexToTrans.getOrigin();
+                                       // rotation of box in local mesh space = MeshRotation^-1 * ConvexToRotation
+                                       btTransform rotationXform = btTransform(worldTocollisionObject.getBasis() * convexToTrans.getBasis());
+
+                                       //ConvexCast::CastResult
+                                       struct BridgeTriangleConvexcastCallback : public btTriangleConvexcastCallback
                                        {
-                                               btCollisionWorld::LocalShapeInfo        shapeInfo;
-                                               shapeInfo.m_shapePart = partId;
-                                               shapeInfo.m_triangleIndex = triangleIndex;
-                                               if (hitFraction <= m_resultCallback->m_closestHitFraction)
+                                               btCollisionWorld::ConvexResultCallback* m_resultCallback;
+                                               btCollisionObject*      m_collisionObject;
+                                               btConcaveShape* m_triangleMesh;
+
+                                               BridgeTriangleConvexcastCallback(const btConvexShape* castShape, const btTransform& from,const btTransform& to,
+                                                       btCollisionWorld::ConvexResultCallback* resultCallback, btCollisionObject* collisionObject,btConcaveShape*      triangleMesh, const btTransform& triangleToWorld):
+                                               btTriangleConvexcastCallback(castShape, from,to, triangleToWorld, triangleMesh->getMargin()),
+                                                       m_resultCallback(resultCallback),
+                                                       m_collisionObject(collisionObject),
+                                                       m_triangleMesh(triangleMesh)
                                                {
+                                               }
 
-                                                       btCollisionWorld::LocalConvexResult convexResult
-                                                               (m_collisionObject,
-                                                               &shapeInfo,
-                                                               hitNormalLocal,
-                                                               hitPointLocal,
-                                                               hitFraction);
 
-                                                       bool    normalInWorldSpace = false;
+                                               virtual btScalar reportHit(const btVector3& hitNormalLocal, const btVector3& hitPointLocal, btScalar hitFraction, int partId, int triangleIndex )
+                                               {
+                                                       btCollisionWorld::LocalShapeInfo        shapeInfo;
+                                                       shapeInfo.m_shapePart = partId;
+                                                       shapeInfo.m_triangleIndex = triangleIndex;
+                                                       if (hitFraction <= m_resultCallback->m_closestHitFraction)
+                                                       {
 
-                                                       return m_resultCallback->addSingleResult(convexResult,normalInWorldSpace);
-                                               }
-                                               return hitFraction;
-                                       }
+                                                               btCollisionWorld::LocalConvexResult convexResult
+                                                                       (m_collisionObject,
+                                                                       &shapeInfo,
+                                                                       hitNormalLocal,
+                                                                       hitPointLocal,
+                                                                       hitFraction);
 
-                               };
+                                                               bool    normalInWorldSpace = false;
 
-                               BridgeTriangleConvexcastCallback tccb(castShape, convexFromTrans,convexToTrans,&resultCallback,collisionObject,concaveShape, colObjWorldTransform);
-                               tccb.m_hitFraction = resultCallback.m_closestHitFraction;
-                               tccb.m_allowedPenetration = allowedPenetration;
-                               btVector3 boxMinLocal, boxMaxLocal;
-                               castShape->getAabb(rotationXform, boxMinLocal, boxMaxLocal);
+                                                               return m_resultCallback->addSingleResult(convexResult,normalInWorldSpace);
+                                                       }
+                                                       return hitFraction;
+                                               }
+
+                                       };
 
-                               btVector3 rayAabbMinLocal = convexFromLocal;
-                               rayAabbMinLocal.setMin(convexToLocal);
-                               btVector3 rayAabbMaxLocal = convexFromLocal;
-                               rayAabbMaxLocal.setMax(convexToLocal);
-                               rayAabbMinLocal += boxMinLocal;
-                               rayAabbMaxLocal += boxMaxLocal;
-                               concaveShape->processAllTriangles(&tccb,rayAabbMinLocal,rayAabbMaxLocal);
+                                       BridgeTriangleConvexcastCallback tccb(castShape, convexFromTrans,convexToTrans,&resultCallback,collisionObject,concaveShape, colObjWorldTransform);
+                                       tccb.m_hitFraction = resultCallback.m_closestHitFraction;
+                                       tccb.m_allowedPenetration = allowedPenetration;
+                                       btVector3 boxMinLocal, boxMaxLocal;
+                                       castShape->getAabb(rotationXform, boxMinLocal, boxMaxLocal);
+
+                                       btVector3 rayAabbMinLocal = convexFromLocal;
+                                       rayAabbMinLocal.setMin(convexToLocal);
+                                       btVector3 rayAabbMaxLocal = convexFromLocal;
+                                       rayAabbMaxLocal.setMax(convexToLocal);
+                                       rayAabbMinLocal += boxMinLocal;
+                                       rayAabbMaxLocal += boxMaxLocal;
+                                       concaveShape->processAllTriangles(&tccb,rayAabbMinLocal,rayAabbMaxLocal);
+                               }
                        }
                } else {
                        ///@todo : use AABB tree or other BVH acceleration structure!
@@ -1162,15 +1198,14 @@ public:
                  wv1 = m_worldTrans*triangle[1];
                  wv2 = m_worldTrans*triangle[2];
                  btVector3 center = (wv0+wv1+wv2)*btScalar(1./3.);
-
-                 btVector3 normal = (wv1-wv0).cross(wv2-wv0);
-                 normal.normalize();
-                 btVector3 normalColor(1,1,0);
-                 m_debugDrawer->drawLine(center,center+normal,normalColor);
-
-
-
-                
+          
+          if (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawNormals )
+          {
+                   btVector3 normal = (wv1-wv0).cross(wv2-wv0);
+                   normal.normalize();
+                   btVector3 normalColor(1,1,0);
+                   m_debugDrawer->drawLine(center,center+normal,normalColor);
+          }
                  m_debugDrawer->drawLine(wv0,wv1,m_color);
                  m_debugDrawer->drawLine(wv1,wv2,m_color);
                  m_debugDrawer->drawLine(wv2,wv0,m_color);
@@ -1195,126 +1230,162 @@ void btCollisionWorld::debugDrawObject(const btTransform& worldTransform, const
 
        } else
        {
-               switch (shape->getShapeType())
-               {
 
-               case BOX_SHAPE_PROXYTYPE:
-                       {
-                               const btBoxShape* boxShape = static_cast<const btBoxShape*>(shape);
-                               btVector3 halfExtents = boxShape->getHalfExtentsWithMargin();
-                               getDebugDrawer()->drawBox(-halfExtents,halfExtents,worldTransform,color);
-                               break;
-                       }
+               /// for polyhedral shapes
+               if (shape->isPolyhedral())
+               {
+                       btPolyhedralConvexShape* polyshape = (btPolyhedralConvexShape*) shape;
 
-               case SPHERE_SHAPE_PROXYTYPE:
+                       int i;
+                       if (polyshape->getConvexPolyhedron())
                        {
-                               const btSphereShape* sphereShape = static_cast<const btSphereShape*>(shape);
-                               btScalar radius = sphereShape->getMargin();//radius doesn't include the margin, so draw with margin
+                               const btConvexPolyhedron* poly = polyshape->getConvexPolyhedron();
+                               for (i=0;i<poly->m_faces.size();i++)
+                               {
+                                       btVector3 centroid(0,0,0);
+                                       int numVerts = poly->m_faces[i].m_indices.size();
+                                       if (numVerts)
+                                       {
+                                               int lastV = poly->m_faces[i].m_indices[numVerts-1];
+                                               for (int v=0;v<poly->m_faces[i].m_indices.size();v++)
+                                               {
+                                                       int curVert = poly->m_faces[i].m_indices[v];
+                                                       centroid+=poly->m_vertices[curVert];
+                                                       getDebugDrawer()->drawLine(worldTransform*poly->m_vertices[lastV],worldTransform*poly->m_vertices[curVert],color);
+                                                       lastV = curVert;
+                                               }
+                                       }
+                                       centroid*= btScalar(1.f)/btScalar(numVerts);
+                    if (getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawNormals)
+                    {
+                                         btVector3 normalColor(1,1,0);
+                                         btVector3 faceNormal(poly->m_faces[i].m_plane[0],poly->m_faces[i].m_plane[1],poly->m_faces[i].m_plane[2]);
+                                         getDebugDrawer()->drawLine(worldTransform*centroid,worldTransform*(centroid+faceNormal),normalColor);
+                    }
+                                       
+                               }
 
-                               getDebugDrawer()->drawSphere(radius, worldTransform, color);
-                               break;
-                       }
-               case MULTI_SPHERE_SHAPE_PROXYTYPE:
+                               
+                       } else
                        {
-                               const btMultiSphereShape* multiSphereShape = static_cast<const btMultiSphereShape*>(shape);
-
-                               btTransform childTransform;
-                               childTransform.setIdentity();
-
-                               for (int i = multiSphereShape->getSphereCount()-1; i>=0;i--)
+                               for (i=0;i<polyshape->getNumEdges();i++)
                                {
-                                       childTransform.setOrigin(multiSphereShape->getSpherePosition(i));
-                                       getDebugDrawer()->drawSphere(multiSphereShape->getSphereRadius(i), worldTransform*childTransform, color);
+                                       btVector3 a,b;
+                                       polyshape->getEdge(i,a,b);
+                                       btVector3 wa = worldTransform * a;
+                                       btVector3 wb = worldTransform * b;
+                                       getDebugDrawer()->drawLine(wa,wb,color);
                                }
-
-                               break;
                        }
-               case CAPSULE_SHAPE_PROXYTYPE:
-                       {
-                               const btCapsuleShape* capsuleShape = static_cast<const btCapsuleShape*>(shape);
 
-                               btScalar radius = capsuleShape->getRadius();
-                               btScalar halfHeight = capsuleShape->getHalfHeight();
 
-                               int upAxis = capsuleShape->getUpAxis();
-                               getDebugDrawer()->drawCapsule(radius, halfHeight, upAxis, worldTransform, color);
-                               break;
-                       }
-               case CONE_SHAPE_PROXYTYPE:
+               }
+               else
+               {
+                       switch (shape->getShapeType())
                        {
-                               const btConeShape* coneShape = static_cast<const btConeShape*>(shape);
-                               btScalar radius = coneShape->getRadius();//+coneShape->getMargin();
-                               btScalar height = coneShape->getHeight();//+coneShape->getMargin();
 
-                               int upAxis= coneShape->getConeUpIndex();
-                               getDebugDrawer()->drawCone(radius, height, upAxis, worldTransform, color);
-                               break;
+                       case BOX_SHAPE_PROXYTYPE:
+                               {
+                                       const btBoxShape* boxShape = static_cast<const btBoxShape*>(shape);
+                                       btVector3 halfExtents = boxShape->getHalfExtentsWithMargin();
+                                       getDebugDrawer()->drawBox(-halfExtents,halfExtents,worldTransform,color);
+                                       break;
+                               }
 
-                       }
-               case CYLINDER_SHAPE_PROXYTYPE:
-                       {
-                               const btCylinderShape* cylinder = static_cast<const btCylinderShape*>(shape);
-                               int upAxis = cylinder->getUpAxis();
-                               btScalar radius = cylinder->getRadius();
-                               btScalar halfHeight = cylinder->getHalfExtentsWithMargin()[upAxis];
-                               getDebugDrawer()->drawCylinder(radius, halfHeight, upAxis, worldTransform, color);
-                               break;
-                       }
+                       case SPHERE_SHAPE_PROXYTYPE:
+                               {
+                                       const btSphereShape* sphereShape = static_cast<const btSphereShape*>(shape);
+                                       btScalar radius = sphereShape->getMargin();//radius doesn't include the margin, so draw with margin
 
-               case STATIC_PLANE_PROXYTYPE:
-                       {
-                               const btStaticPlaneShape* staticPlaneShape = static_cast<const btStaticPlaneShape*>(shape);
-                               btScalar planeConst = staticPlaneShape->getPlaneConstant();
-                               const btVector3& planeNormal = staticPlaneShape->getPlaneNormal();
-                               getDebugDrawer()->drawPlane(planeNormal, planeConst,worldTransform, color);
-                               break;
+                                       getDebugDrawer()->drawSphere(radius, worldTransform, color);
+                                       break;
+                               }
+                       case MULTI_SPHERE_SHAPE_PROXYTYPE:
+                               {
+                                       const btMultiSphereShape* multiSphereShape = static_cast<const btMultiSphereShape*>(shape);
 
-                       }
-               default:
-                       {
+                                       btTransform childTransform;
+                                       childTransform.setIdentity();
 
-                               if (shape->isConcave())
-                               {
-                                       btConcaveShape* concaveMesh = (btConcaveShape*) shape;
+                                       for (int i = multiSphereShape->getSphereCount()-1; i>=0;i--)
+                                       {
+                                               childTransform.setOrigin(multiSphereShape->getSpherePosition(i));
+                                               getDebugDrawer()->drawSphere(multiSphereShape->getSphereRadius(i), worldTransform*childTransform, color);
+                                       }
 
-                                       ///@todo pass camera, for some culling? no -> we are not a graphics lib
-                                       btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
-                                       btVector3 aabbMin(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
+                                       break;
+                               }
+                       case CAPSULE_SHAPE_PROXYTYPE:
+                               {
+                                       const btCapsuleShape* capsuleShape = static_cast<const btCapsuleShape*>(shape);
 
-                                       DebugDrawcallback drawCallback(getDebugDrawer(),worldTransform,color);
-                                       concaveMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax);
+                                       btScalar radius = capsuleShape->getRadius();
+                                       btScalar halfHeight = capsuleShape->getHalfHeight();
 
+                                       int upAxis = capsuleShape->getUpAxis();
+                                       getDebugDrawer()->drawCapsule(radius, halfHeight, upAxis, worldTransform, color);
+                                       break;
                                }
+                       case CONE_SHAPE_PROXYTYPE:
+                               {
+                                       const btConeShape* coneShape = static_cast<const btConeShape*>(shape);
+                                       btScalar radius = coneShape->getRadius();//+coneShape->getMargin();
+                                       btScalar height = coneShape->getHeight();//+coneShape->getMargin();
 
-                               if (shape->getShapeType() == CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE)
+                                       int upAxis= coneShape->getConeUpIndex();
+                                       getDebugDrawer()->drawCone(radius, height, upAxis, worldTransform, color);
+                                       break;
+
+                               }
+                       case CYLINDER_SHAPE_PROXYTYPE:
                                {
-                                       btConvexTriangleMeshShape* convexMesh = (btConvexTriangleMeshShape*) shape;
-                                       //todo: pass camera for some culling                    
-                                       btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
-                                       btVector3 aabbMin(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
-                                       //DebugDrawcallback drawCallback;
-                                       DebugDrawcallback drawCallback(getDebugDrawer(),worldTransform,color);
-                                       convexMesh->getMeshInterface()->InternalProcessAllTriangles(&drawCallback,aabbMin,aabbMax);
+                                       const btCylinderShape* cylinder = static_cast<const btCylinderShape*>(shape);
+                                       int upAxis = cylinder->getUpAxis();
+                                       btScalar radius = cylinder->getRadius();
+                                       btScalar halfHeight = cylinder->getHalfExtentsWithMargin()[upAxis];
+                                       getDebugDrawer()->drawCylinder(radius, halfHeight, upAxis, worldTransform, color);
+                                       break;
                                }
 
+                       case STATIC_PLANE_PROXYTYPE:
+                               {
+                                       const btStaticPlaneShape* staticPlaneShape = static_cast<const btStaticPlaneShape*>(shape);
+                                       btScalar planeConst = staticPlaneShape->getPlaneConstant();
+                                       const btVector3& planeNormal = staticPlaneShape->getPlaneNormal();
+                                       getDebugDrawer()->drawPlane(planeNormal, planeConst,worldTransform, color);
+                                       break;
 
-                               /// for polyhedral shapes
-                               if (shape->isPolyhedral())
+                               }
+                       default:
                                {
-                                       btPolyhedralConvexShape* polyshape = (btPolyhedralConvexShape*) shape;
 
-                                       int i;
-                                       for (i=0;i<polyshape->getNumEdges();i++)
+                                       if (shape->isConcave())
                                        {
-                                               btVector3 a,b;
-                                               polyshape->getEdge(i,a,b);
-                                               btVector3 wa = worldTransform * a;
-                                               btVector3 wb = worldTransform * b;
-                                               getDebugDrawer()->drawLine(wa,wb,color);
+                                               btConcaveShape* concaveMesh = (btConcaveShape*) shape;
+
+                                               ///@todo pass camera, for some culling? no -> we are not a graphics lib
+                                               btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
+                                               btVector3 aabbMin(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
+
+                                               DebugDrawcallback drawCallback(getDebugDrawer(),worldTransform,color);
+                                               concaveMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax);
 
                                        }
 
+                                       if (shape->getShapeType() == CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE)
+                                       {
+                                               btConvexTriangleMeshShape* convexMesh = (btConvexTriangleMeshShape*) shape;
+                                               //todo: pass camera for some culling                    
+                                               btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
+                                               btVector3 aabbMin(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
+                                               //DebugDrawcallback drawCallback;
+                                               DebugDrawcallback drawCallback(getDebugDrawer(),worldTransform,color);
+                                               convexMesh->getMeshInterface()->InternalProcessAllTriangles(&drawCallback,aabbMin,aabbMax);
+                                       }
+
 
+                                       
                                }
                        }
                }
@@ -1327,7 +1398,7 @@ void      btCollisionWorld::debugDrawWorld()
        if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawContactPoints)
        {
                int numManifolds = getDispatcher()->getNumManifolds();
-               btVector3 color(0,0,0);
+               btVector3 color(1,0.65,0);
                for (int i=0;i<numManifolds;i++)
                {
                        btPersistentManifold* contactManifold = getDispatcher()->getManifoldByIndexInternal(i);
@@ -1343,7 +1414,7 @@ void      btCollisionWorld::debugDrawWorld()
                }
        }
 
-       if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & (btIDebugDraw::DBG_DrawWireframe | btIDebugDraw::DBG_DrawAabb))
+       if (getDebugDrawer() && (getDebugDrawer()->getDebugMode() & (btIDebugDraw::DBG_DrawWireframe | btIDebugDraw::DBG_DrawAabb)))
        {
                int i;
 
@@ -1352,7 +1423,7 @@ void      btCollisionWorld::debugDrawWorld()
                        btCollisionObject* colObj = m_collisionObjects[i];
                        if ((colObj->getCollisionFlags() & btCollisionObject::CF_DISABLE_VISUALIZE_OBJECT)==0)
                        {
-                               if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawWireframe)
+                               if (getDebugDrawer() && (getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawWireframe))
                                {
                                        btVector3 color(btScalar(1.),btScalar(1.),btScalar(1.));
                                        switch(colObj->getActivationState())
@@ -1386,12 +1457,14 @@ void    btCollisionWorld::debugDrawWorld()
 
                                        btVector3 minAabb2,maxAabb2;
 
-                                       colObj->getCollisionShape()->getAabb(colObj->getInterpolationWorldTransform(),minAabb2,maxAabb2);
-                                       minAabb2 -= contactThreshold;
-                                       maxAabb2 += contactThreshold;
-
-                                       minAabb.setMin(minAabb2);
-                                       maxAabb.setMax(maxAabb2);
+                                       if(getDispatchInfo().m_useContinuous && colObj->getInternalType()==btCollisionObject::CO_RIGID_BODY && !colObj->isStaticOrKinematicObject())
+                                       {
+                                               colObj->getCollisionShape()->getAabb(colObj->getInterpolationWorldTransform(),minAabb2,maxAabb2);
+                                               minAabb2 -= contactThreshold;
+                                               maxAabb2 += contactThreshold;
+                                               minAabb.setMin(minAabb2);
+                                               maxAabb.setMax(maxAabb2);
+                                       }
 
                                        m_debugDrawer->drawAabb(minAabb,maxAabb,colorvec);
                                }
index b42e2c40b2114b94bc41918615729d784151bfe9..0a92d2d6e158d2bcba926ec734553fb37923e44c 100644 (file)
@@ -62,8 +62,8 @@ subject to the following restrictions:
  
  
 
-#ifndef COLLISION_WORLD_H
-#define COLLISION_WORLD_H
+#ifndef BT_COLLISION_WORLD_H
+#define BT_COLLISION_WORLD_H
 
 class btStackAlloc;
 class btCollisionShape;
@@ -506,4 +506,4 @@ public:
 };
 
 
-#endif //COLLISION_WORLD_H
+#endif //BT_COLLISION_WORLD_H
index 255e0af668ca36619c67c034d65db73fee2cd3f4..404574989ab0061c0ba8e2e868989c15df524a2e 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef COMPOUND_COLLISION_ALGORITHM_H
-#define COMPOUND_COLLISION_ALGORITHM_H
+#ifndef BT_COMPOUND_COLLISION_ALGORITHM_H
+#define BT_COMPOUND_COLLISION_ALGORITHM_H
 
 #include "btActivatingCollisionAlgorithm.h"
 #include "BulletCollision/BroadphaseCollision/btDispatcher.h"
@@ -83,4 +83,4 @@ public:
 
 };
 
-#endif //COMPOUND_COLLISION_ALGORITHM_H
+#endif //BT_COMPOUND_COLLISION_ALGORITHM_H
index 5738401401e1c0d5f5164355e2d35607de228e57..53d13b87151faacbb93255f3d6507b1e4809d843 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef CONVEX_2D_CONVEX_2D_ALGORITHM_H
-#define CONVEX_2D_CONVEX_2D_ALGORITHM_H
+#ifndef BT_CONVEX_2D_CONVEX_2D_ALGORITHM_H
+#define BT_CONVEX_2D_CONVEX_2D_ALGORITHM_H
 
 #include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h"
 #include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
@@ -92,4 +92,4 @@ public:
 
 };
 
-#endif //CONVEX_2D_CONVEX_2D_ALGORITHM_H
+#endif //BT_CONVEX_2D_CONVEX_2D_ALGORITHM_H
index 268ec4b6c7e9a0e195119e427c6d89881d47b687..d2b2c221426943561a02a9175d3c3f16ed68ad98 100644 (file)
@@ -91,7 +91,7 @@ void btConvexTriangleCallback::processTriangle(btVector3* triangle,int partId, i
        btCollisionObject* ob = static_cast<btCollisionObject*>(m_triBody);
 
 
-       
+#if 0  
        ///debug drawing of the overlapping triangles
        if (m_dispatchInfoPtr && m_dispatchInfoPtr->m_debugDraw && (m_dispatchInfoPtr->m_debugDraw->getDebugMode() &btIDebugDraw::DBG_DrawWireframe ))
        {
@@ -100,17 +100,8 @@ void btConvexTriangleCallback::processTriangle(btVector3* triangle,int partId, i
                m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[0]),tr(triangle[1]),color);
                m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[1]),tr(triangle[2]),color);
                m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[2]),tr(triangle[0]),color);
-
-               //btVector3 center = triangle[0] + triangle[1]+triangle[2];
-               //center *= btScalar(0.333333);
-               //m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[0]),tr(center),color);
-               //m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[1]),tr(center),color);
-               //m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[2]),tr(center),color);
-
        }
-
-
-       //btCollisionObject* colObj = static_cast<btCollisionObject*>(m_convexProxy->m_clientObject);
+#endif
        
        if (m_convexBody->getCollisionShape()->isConvex())
        {
@@ -119,7 +110,7 @@ void btConvexTriangleCallback::processTriangle(btVector3* triangle,int partId, i
                
                btCollisionShape* tmpShape = ob->getCollisionShape();
                ob->internalSetTemporaryCollisionShape( &tm );
-               
+
                btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(m_convexBody,m_triBody,m_manifoldPtr);
 
                if (m_resultOut->getBody0Internal() == m_triBody)
index 984a4c39e8e21004061750a5fa7a6776a7136764..f718d1dec259f80a74c4de84f183ef9644f13428 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef CONVEX_CONCAVE_COLLISION_ALGORITHM_H
-#define CONVEX_CONCAVE_COLLISION_ALGORITHM_H
+#ifndef BT_CONVEX_CONCAVE_COLLISION_ALGORITHM_H
+#define BT_CONVEX_CONCAVE_COLLISION_ALGORITHM_H
 
 #include "btActivatingCollisionAlgorithm.h"
 #include "BulletCollision/BroadphaseCollision/btDispatcher.h"
@@ -113,4 +113,4 @@ public:
 
 };
 
-#endif //CONVEX_CONCAVE_COLLISION_ALGORITHM_H
+#endif //BT_CONVEX_CONCAVE_COLLISION_ALGORITHM_H
index 94385fed909f6c059d0759421032798dd659fe40..dd1f3e2490f2746c2d21f6d85f2d895558a04a5a 100644 (file)
@@ -17,6 +17,7 @@ subject to the following restrictions:
 ///If you experience problems with capsule-capsule collision, try to define BT_DISABLE_CAPSULE_CAPSULE_COLLIDER and report it in the Bullet forums
 ///with reproduction case
 //define BT_DISABLE_CAPSULE_CAPSULE_COLLIDER 1
+//#define ZERO_MARGIN
 
 #include "btConvexConvexAlgorithm.h"
 
@@ -26,6 +27,8 @@ subject to the following restrictions:
 #include "BulletCollision/CollisionDispatch/btCollisionObject.h"
 #include "BulletCollision/CollisionShapes/btConvexShape.h"
 #include "BulletCollision/CollisionShapes/btCapsuleShape.h"
+#include "BulletCollision/CollisionShapes/btTriangleShape.h"
+
 
 
 #include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
@@ -48,7 +51,7 @@ subject to the following restrictions:
 
 #include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h"
 #include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h"
-
+#include "BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.h"
 
 
 ///////////
@@ -331,6 +334,8 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl
 #endif //BT_DISABLE_CAPSULE_CAPSULE_COLLIDER
 
 
+
+
 #ifdef USE_SEPDISTANCE_UTIL2
        if (dispatchInfo.m_useConvexConservativeDistanceUtil)
        {
@@ -357,13 +362,14 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl
        } else
 #endif //USE_SEPDISTANCE_UTIL2
        {
-               if (dispatchInfo.m_convexMaxDistanceUseCPT)
-               {
-                       input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactProcessingThreshold();
-               } else
-               {
-                       input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactBreakingThreshold();
-               }
+               //if (dispatchInfo.m_convexMaxDistanceUseCPT)
+               //{
+               //      input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactProcessingThreshold();
+               //} else
+               //{
+               input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactBreakingThreshold();
+//             }
+
                input.m_maximumDistanceSquared*= input.m_maximumDistanceSquared;
        }
 
@@ -371,7 +377,7 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl
        input.m_transformA = body0->getWorldTransform();
        input.m_transformB = body1->getWorldTransform();
 
-       gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
+
 
        
 
@@ -389,6 +395,155 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl
        }
 #endif //USE_SEPDISTANCE_UTIL2
 
+       if (min0->isPolyhedral() && min1->isPolyhedral())
+       {
+
+
+               struct btDummyResult : public btDiscreteCollisionDetectorInterface::Result
+               {
+                       virtual void setShapeIdentifiersA(int partId0,int index0){}
+                       virtual void setShapeIdentifiersB(int partId1,int index1){}
+                       virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth) 
+                       {
+                       }
+               };
+               
+               btDummyResult dummy;
+
+
+               btPolyhedralConvexShape* polyhedronA = (btPolyhedralConvexShape*) min0;
+               btPolyhedralConvexShape* polyhedronB = (btPolyhedralConvexShape*) min1;
+               if (polyhedronA->getConvexPolyhedron() && polyhedronB->getConvexPolyhedron())
+               {
+
+
+                       
+
+                       btScalar threshold = m_manifoldPtr->getContactBreakingThreshold();
+
+                       btScalar minDist = -1e30f;
+                       btVector3 sepNormalWorldSpace;
+                       bool foundSepAxis  = true;
+
+                       if (dispatchInfo.m_enableSatConvex)
+                       {
+                               foundSepAxis = btPolyhedralContactClipping::findSeparatingAxis(
+                                       *polyhedronA->getConvexPolyhedron(), *polyhedronB->getConvexPolyhedron(),
+                                       body0->getWorldTransform(), 
+                                       body1->getWorldTransform(),
+                                       sepNormalWorldSpace);
+                       } else
+                       {
+#ifdef ZERO_MARGIN
+                               gjkPairDetector.setIgnoreMargin(true);
+                               gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
+#else
+                               //gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
+                               gjkPairDetector.getClosestPoints(input,dummy,dispatchInfo.m_debugDraw);
+#endif //ZERO_MARGIN
+                               btScalar l2 = gjkPairDetector.getCachedSeparatingAxis().length2();
+                               if (l2>SIMD_EPSILON)
+                               {
+                                       sepNormalWorldSpace = gjkPairDetector.getCachedSeparatingAxis()*(1.f/l2);
+                                       //minDist = -1e30f;//gjkPairDetector.getCachedSeparatingDistance();
+                                       minDist = gjkPairDetector.getCachedSeparatingDistance()-min0->getMargin()-min1->getMargin();
+       
+#ifdef ZERO_MARGIN
+                                       foundSepAxis = true;//gjkPairDetector.getCachedSeparatingDistance()<0.f;
+#else
+                                       foundSepAxis = gjkPairDetector.getCachedSeparatingDistance()<(min0->getMargin()+min1->getMargin());
+#endif
+                               }
+                       }
+                       if (foundSepAxis)
+                       {
+//                             printf("sepNormalWorldSpace=%f,%f,%f\n",sepNormalWorldSpace.getX(),sepNormalWorldSpace.getY(),sepNormalWorldSpace.getZ());
+
+                               btPolyhedralContactClipping::clipHullAgainstHull(sepNormalWorldSpace, *polyhedronA->getConvexPolyhedron(), *polyhedronB->getConvexPolyhedron(),
+                                       body0->getWorldTransform(), 
+                                       body1->getWorldTransform(), minDist-threshold, threshold, *resultOut);
+                               
+                       }
+                       if (m_ownManifold)
+                       {
+                               resultOut->refreshContactPoints();
+                       }
+                       return;
+
+               } else
+               {
+                       //we can also deal with convex versus triangle (without connectivity data)
+                       if (polyhedronA->getConvexPolyhedron() && polyhedronB->getShapeType()==TRIANGLE_SHAPE_PROXYTYPE)
+                       {
+
+                               btVertexArray vertices;
+                               btTriangleShape* tri = (btTriangleShape*)polyhedronB;
+                               vertices.push_back(     body1->getWorldTransform()*tri->m_vertices1[0]);
+                               vertices.push_back(     body1->getWorldTransform()*tri->m_vertices1[1]);
+                               vertices.push_back(     body1->getWorldTransform()*tri->m_vertices1[2]);
+                               
+                               //tri->initializePolyhedralFeatures();
+
+                               btScalar threshold = m_manifoldPtr->getContactBreakingThreshold();
+
+                               btVector3 sepNormalWorldSpace;
+                               btScalar minDist =-1e30f;
+                               btScalar maxDist = threshold;
+                               
+                               bool foundSepAxis = false;
+                               if (0)
+                               {
+                                       polyhedronB->initializePolyhedralFeatures();
+                                        foundSepAxis = btPolyhedralContactClipping::findSeparatingAxis(
+                                       *polyhedronA->getConvexPolyhedron(), *polyhedronB->getConvexPolyhedron(),
+                                       body0->getWorldTransform(), 
+                                       body1->getWorldTransform(),
+                                       sepNormalWorldSpace);
+                               //       printf("sepNormalWorldSpace=%f,%f,%f\n",sepNormalWorldSpace.getX(),sepNormalWorldSpace.getY(),sepNormalWorldSpace.getZ());
+
+                               } else
+                               {
+#ifdef ZERO_MARGIN
+                                       gjkPairDetector.setIgnoreMargin(true);
+                                       gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
+#else
+                                       gjkPairDetector.getClosestPoints(input,dummy,dispatchInfo.m_debugDraw);
+#endif//ZERO_MARGIN
+                                       
+                                       btScalar l2 = gjkPairDetector.getCachedSeparatingAxis().length2();
+                                       if (l2>SIMD_EPSILON)
+                                       {
+                                               sepNormalWorldSpace = gjkPairDetector.getCachedSeparatingAxis()*(1.f/l2);
+                                               //minDist = gjkPairDetector.getCachedSeparatingDistance();
+                                               //maxDist = threshold;
+                                               minDist = gjkPairDetector.getCachedSeparatingDistance()-min0->getMargin()-min1->getMargin();
+                                               foundSepAxis = true;
+                                       }
+                               }
+
+                               
+                       if (foundSepAxis)
+                       {
+                               btPolyhedralContactClipping::clipFaceAgainstHull(sepNormalWorldSpace, *polyhedronA->getConvexPolyhedron(), 
+                                       body0->getWorldTransform(), vertices, minDist-threshold, maxDist, *resultOut);
+                       }
+                               
+                               
+                               if (m_ownManifold)
+                               {
+                                       resultOut->refreshContactPoints();
+                               }
+                               
+                               return;
+                       }
+                       
+               }
+
+
+       }
+       
+       gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
+
        //now perform 'm_numPerturbationIterations' collision queries with the perturbated collision objects
        
        //perform perturbation when more then 'm_minimumPointsPerturbationThreshold' points
@@ -398,66 +553,70 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl
                int i;
                btVector3 v0,v1;
                btVector3 sepNormalWorldSpace;
+               btScalar l2 = gjkPairDetector.getCachedSeparatingAxis().length2();
        
-               sepNormalWorldSpace = gjkPairDetector.getCachedSeparatingAxis().normalized();
-               btPlaneSpace1(sepNormalWorldSpace,v0,v1);
-
-
-               bool perturbeA = true;
-               const btScalar angleLimit = 0.125f * SIMD_PI;
-               btScalar perturbeAngle;
-               btScalar radiusA = min0->getAngularMotionDisc();
-               btScalar radiusB = min1->getAngularMotionDisc();
-               if (radiusA < radiusB)
-               {
-                       perturbeAngle = gContactBreakingThreshold /radiusA;
-                       perturbeA = true;
-               } else
+               if (l2>SIMD_EPSILON)
                {
-                       perturbeAngle = gContactBreakingThreshold / radiusB;
-                       perturbeA = false;
-               }
-               if ( perturbeAngle > angleLimit ) 
-                               perturbeAngle = angleLimit;
+                       sepNormalWorldSpace = gjkPairDetector.getCachedSeparatingAxis()*(1.f/l2);
+                       
+                       btPlaneSpace1(sepNormalWorldSpace,v0,v1);
 
-               btTransform unPerturbedTransform;
-               if (perturbeA)
-               {
-                       unPerturbedTransform = input.m_transformA;
-               } else
-               {
-                       unPerturbedTransform = input.m_transformB;
-               }
-               
-               for ( i=0;i<m_numPerturbationIterations;i++)
-               {
-                       if (v0.length2()>SIMD_EPSILON)
+
+                       bool perturbeA = true;
+                       const btScalar angleLimit = 0.125f * SIMD_PI;
+                       btScalar perturbeAngle;
+                       btScalar radiusA = min0->getAngularMotionDisc();
+                       btScalar radiusB = min1->getAngularMotionDisc();
+                       if (radiusA < radiusB)
                        {
-                       btQuaternion perturbeRot(v0,perturbeAngle);
-                       btScalar iterationAngle = i*(SIMD_2_PI/btScalar(m_numPerturbationIterations));
-                       btQuaternion rotq(sepNormalWorldSpace,iterationAngle);
-                       
-                       
+                               perturbeAngle = gContactBreakingThreshold /radiusA;
+                               perturbeA = true;
+                       } else
+                       {
+                               perturbeAngle = gContactBreakingThreshold / radiusB;
+                               perturbeA = false;
+                       }
+                       if ( perturbeAngle > angleLimit ) 
+                                       perturbeAngle = angleLimit;
+
+                       btTransform unPerturbedTransform;
                        if (perturbeA)
                        {
-                               input.m_transformA.setBasis(  btMatrix3x3(rotq.inverse()*perturbeRot*rotq)*body0->getWorldTransform().getBasis());
-                               input.m_transformB = body1->getWorldTransform();
-#ifdef DEBUG_CONTACTS
-                               dispatchInfo.m_debugDraw->drawTransform(input.m_transformA,10.0);
-#endif //DEBUG_CONTACTS
+                               unPerturbedTransform = input.m_transformA;
                        } else
                        {
-                               input.m_transformA = body0->getWorldTransform();
-                               input.m_transformB.setBasis( btMatrix3x3(rotq.inverse()*perturbeRot*rotq)*body1->getWorldTransform().getBasis());
-#ifdef DEBUG_CONTACTS
-                               dispatchInfo.m_debugDraw->drawTransform(input.m_transformB,10.0);
-#endif
+                               unPerturbedTransform = input.m_transformB;
                        }
                        
-                       btPerturbedContactResult perturbedResultOut(resultOut,input.m_transformA,input.m_transformB,unPerturbedTransform,perturbeA,dispatchInfo.m_debugDraw);
-                       gjkPairDetector.getClosestPoints(input,perturbedResultOut,dispatchInfo.m_debugDraw);
+                       for ( i=0;i<m_numPerturbationIterations;i++)
+                       {
+                               if (v0.length2()>SIMD_EPSILON)
+                               {
+                               btQuaternion perturbeRot(v0,perturbeAngle);
+                               btScalar iterationAngle = i*(SIMD_2_PI/btScalar(m_numPerturbationIterations));
+                               btQuaternion rotq(sepNormalWorldSpace,iterationAngle);
+                               
+                               
+                               if (perturbeA)
+                               {
+                                       input.m_transformA.setBasis(  btMatrix3x3(rotq.inverse()*perturbeRot*rotq)*body0->getWorldTransform().getBasis());
+                                       input.m_transformB = body1->getWorldTransform();
+       #ifdef DEBUG_CONTACTS
+                                       dispatchInfo.m_debugDraw->drawTransform(input.m_transformA,10.0);
+       #endif //DEBUG_CONTACTS
+                               } else
+                               {
+                                       input.m_transformA = body0->getWorldTransform();
+                                       input.m_transformB.setBasis( btMatrix3x3(rotq.inverse()*perturbeRot*rotq)*body1->getWorldTransform().getBasis());
+       #ifdef DEBUG_CONTACTS
+                                       dispatchInfo.m_debugDraw->drawTransform(input.m_transformB,10.0);
+       #endif
+                               }
+                               
+                               btPerturbedContactResult perturbedResultOut(resultOut,input.m_transformA,input.m_transformB,unPerturbedTransform,perturbeA,dispatchInfo.m_debugDraw);
+                               gjkPairDetector.getClosestPoints(input,perturbedResultOut,dispatchInfo.m_debugDraw);
+                               }
                        }
-                       
                }
        }
 
@@ -487,7 +646,7 @@ btScalar    btConvexConvexAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,
 {
        (void)resultOut;
        (void)dispatchInfo;
-       ///rather than checking ALL pairs, only calculate TOI when motion exceeds threshold
+       ///Rather then checking ALL pairs, only calculate TOI when motion exceeds threshold
     
        ///Linear motion for one of objects needs to exceed m_ccdSquareMotionThreshold
        ///col0->m_worldTransform,
index d38aff6862c580b344d970e74a3db1ed1c460fed..4380b80eb4d92f29aa51b83a4997cf0ef30f1da0 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef CONVEX_CONVEX_ALGORITHM_H
-#define CONVEX_CONVEX_ALGORITHM_H
+#ifndef BT_CONVEX_CONVEX_ALGORITHM_H
+#define BT_CONVEX_CONVEX_ALGORITHM_H
 
 #include "btActivatingCollisionAlgorithm.h"
 #include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
@@ -106,4 +106,4 @@ public:
 
 };
 
-#endif //CONVEX_CONVEX_ALGORITHM_H
+#endif //BT_CONVEX_CONVEX_ALGORITHM_H
index dda85dc693fa0611726b1bb34b81935b6c267f35..b2e9bfaf593dbb33794f1e9f2c28a9cbeaf69d3c 100644 (file)
@@ -96,23 +96,41 @@ void btConvexPlaneCollisionAlgorithm::processCollision (btCollisionObject* body0
        if (!m_manifoldPtr)
                return;
 
-    btCollisionObject* convexObj = m_isSwapped? body1 : body0;
+       btCollisionObject* convexObj = m_isSwapped? body1 : body0;
        btCollisionObject* planeObj = m_isSwapped? body0: body1;
 
        btConvexShape* convexShape = (btConvexShape*) convexObj->getCollisionShape();
        btStaticPlaneShape* planeShape = (btStaticPlaneShape*) planeObj->getCollisionShape();
 
-    
+       bool hasCollision = false;
        const btVector3& planeNormal = planeShape->getPlaneNormal();
-       //const btScalar& planeConstant = planeShape->getPlaneConstant();
+       const btScalar& planeConstant = planeShape->getPlaneConstant();
+       btTransform planeInConvex;
+       planeInConvex= convexObj->getWorldTransform().inverse() * planeObj->getWorldTransform();
+       btTransform convexInPlaneTrans;
+       convexInPlaneTrans= planeObj->getWorldTransform().inverse() * convexObj->getWorldTransform();
+
+       btVector3 vtx = convexShape->localGetSupportingVertex(planeInConvex.getBasis()*-planeNormal);
+       btVector3 vtxInPlane = convexInPlaneTrans(vtx);
+       btScalar distance = (planeNormal.dot(vtxInPlane) - planeConstant);
+
+       btVector3 vtxInPlaneProjected = vtxInPlane - distance*planeNormal;
+       btVector3 vtxInPlaneWorld = planeObj->getWorldTransform() * vtxInPlaneProjected;
 
-       //first perform a collision query with the non-perturbated collision objects
+       hasCollision = distance < m_manifoldPtr->getContactBreakingThreshold();
+       resultOut->setPersistentManifold(m_manifoldPtr);
+       if (hasCollision)
        {
-               btQuaternion rotq(0,0,0,1);
-               collideSingleContact(rotq,body0,body1,dispatchInfo,resultOut);
+               /// report a contact. internally this will be kept persistent, and contact reduction is done
+               btVector3 normalOnSurfaceB = planeObj->getWorldTransform().getBasis() * planeNormal;
+               btVector3 pOnB = vtxInPlaneWorld;
+               resultOut->addContactPoint(normalOnSurfaceB,pOnB,distance);
        }
 
-       if (resultOut->getPersistentManifold()->getNumContacts()<m_minimumPointsPerturbationThreshold)
+       //the perturbation algorithm doesn't work well with implicit surfaces such as spheres, cylinder and cones:
+       //they keep on rolling forever because of the additional off-center contact points
+       //so only enable the feature for polyhedral shapes (btBoxShape, btConvexHullShape etc)
+       if (convexShape->isPolyhedral() && resultOut->getPersistentManifold()->getNumContacts()<m_minimumPointsPerturbationThreshold)
        {
                btVector3 v0,v1;
                btPlaneSpace1(planeNormal,v0,v1);
index f49ac45e772e0cc7ede4af2244950407226f3488..b9494f5ad3bff89e04098df446c82327dd575dae 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef CONVEX_PLANE_COLLISION_ALGORITHM_H
-#define CONVEX_PLANE_COLLISION_ALGORITHM_H
+#ifndef BT_CONVEX_PLANE_COLLISION_ALGORITHM_H
+#define BT_CONVEX_PLANE_COLLISION_ALGORITHM_H
 
 #include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
@@ -61,7 +61,7 @@ public:
                        
                CreateFunc() 
                        : m_numPerturbationIterations(1),
-                       m_minimumPointsPerturbationThreshold(1)
+                       m_minimumPointsPerturbationThreshold(0)
                {
                }
                
@@ -80,5 +80,5 @@ public:
 
 };
 
-#endif //CONVEX_PLANE_COLLISION_ALGORITHM_H
+#endif //BT_CONVEX_PLANE_COLLISION_ALGORITHM_H
 
index c27d8ce0752a9f3c1998eb8546f8ba93fbb2869e..7faee6faf50c307fdd319e34d178ff04d7e77ac6 100644 (file)
@@ -296,3 +296,14 @@ void btDefaultCollisionConfiguration::setConvexConvexMultipointIterations(int nu
        convexConvex->m_numPerturbationIterations = numPerturbationIterations;
        convexConvex->m_minimumPointsPerturbationThreshold = minimumPointsPerturbationThreshold;
 }
+
+void   btDefaultCollisionConfiguration::setPlaneConvexMultipointIterations(int numPerturbationIterations, int minimumPointsPerturbationThreshold)
+{
+       btConvexPlaneCollisionAlgorithm::CreateFunc* cpCF = (btConvexPlaneCollisionAlgorithm::CreateFunc*)m_convexPlaneCF;
+       cpCF->m_numPerturbationIterations = numPerturbationIterations;
+       cpCF->m_minimumPointsPerturbationThreshold = minimumPointsPerturbationThreshold;
+       
+       btConvexPlaneCollisionAlgorithm::CreateFunc* pcCF = (btConvexPlaneCollisionAlgorithm::CreateFunc*)m_planeConvexCF;
+       pcCF->m_numPerturbationIterations = numPerturbationIterations;
+       pcCF->m_minimumPointsPerturbationThreshold = minimumPointsPerturbationThreshold;
+}
index 6aa0d8c270f4149a297506f72897d954331d2d8c..81ed424a3dbc8ed548d1e8f604dae68affc24b00 100644 (file)
@@ -129,6 +129,8 @@ public:
        ///@todo we could add a per-object setting of those parameters, for level-of-detail collision detection.
        void    setConvexConvexMultipointIterations(int numPerturbationIterations=3, int minimumPointsPerturbationThreshold = 3);
 
+       void    setPlaneConvexMultipointIterations(int numPerturbationIterations=3, int minimumPointsPerturbationThreshold = 3);
+
 };
 
 #endif //BT_DEFAULT_COLLISION_CONFIGURATION
index e54721dec2181ff966df4f11bd8dc576a2c6ff16..f03c9dc3833b9ac0889e5611f5a9faed80030d44 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef EMPTY_ALGORITH
-#define EMPTY_ALGORITH
+#ifndef BT_EMPTY_ALGORITH
+#define BT_EMPTY_ALGORITH
 #include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
 #include "btCollisionCreateFunc.h"
 #include "btCollisionDispatcher.h"
@@ -51,4 +51,4 @@ public:
 
 } ATTRIBUTE_ALIGNED(16);
 
-#endif //EMPTY_ALGORITH
+#endif //BT_EMPTY_ALGORITH
index 5cceb04dbb469b2b028701bdc4fa0ad622908b94..4353cdac0b15ca11fcdc7e37c2148a3c792fa6a0 100644 (file)
@@ -1,6 +1,7 @@
 #include "btInternalEdgeUtility.h"
 
 #include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h"
+#include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h"
 #include "BulletCollision/CollisionShapes/btTriangleShape.h"
 #include "BulletCollision/CollisionDispatch/btCollisionObject.h"
 #include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h"
@@ -9,7 +10,6 @@
 
 //#define DEBUG_INTERNAL_EDGE
 
-
 #ifdef DEBUG_INTERNAL_EDGE
 #include <stdio.h>
 #endif //DEBUG_INTERNAL_EDGE
@@ -456,8 +456,14 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject*
        if (colObj0->getCollisionShape()->getShapeType() != TRIANGLE_SHAPE_PROXYTYPE)
                return;
 
-       btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)colObj0->getRootCollisionShape();
-       btTriangleInfoMap* triangleInfoMapPtr = (btTriangleInfoMap*) trimesh->getTriangleInfoMap();
+       btBvhTriangleMeshShape* trimesh = 0;
+       
+       if( colObj0->getRootCollisionShape()->getShapeType() == SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE )
+          trimesh = ((btScaledBvhTriangleMeshShape*)colObj0->getRootCollisionShape())->getChildShape();
+   else           
+          trimesh = (btBvhTriangleMeshShape*)colObj0->getRootCollisionShape();
+          
+       btTriangleInfoMap* triangleInfoMapPtr = (btTriangleInfoMap*) trimesh->getTriangleInfoMap();
        if (!triangleInfoMapPtr)
                return;
 
@@ -501,14 +507,63 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject*
 
        btVector3 localContactNormalOnB = colObj0->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB;
        localContactNormalOnB.normalize();//is this necessary?
-
-       if ((info->m_edgeV0V1Angle)< SIMD_2_PI)
+       
+       // Get closest edge
+       int      bestedge=-1;
+       btScalar    disttobestedge=BT_LARGE_FLOAT;
+       //
+       // Edge 0 -> 1
+       if (btFabs(info->m_edgeV0V1Angle)< triangleInfoMapPtr->m_maxEdgeAngleThreshold)
+       {       
+          btVector3 nearest;
+          btNearestPointInLineSegment( cp.m_localPointB, v0, v1, nearest );
+          btScalar     len=(contact-nearest).length();
+          //
+          if( len < disttobestedge )
+          {
+             bestedge=0;
+             disttobestedge=len;
+      }              
+   }      
+       // Edge 1 -> 2
+       if (btFabs(info->m_edgeV1V2Angle)< triangleInfoMapPtr->m_maxEdgeAngleThreshold)
+       {       
+          btVector3 nearest;
+          btNearestPointInLineSegment( cp.m_localPointB, v1, v2, nearest );
+          btScalar     len=(contact-nearest).length();
+          //
+          if( len < disttobestedge )
+          {
+             bestedge=1;
+             disttobestedge=len;
+      }              
+   }      
+       // Edge 2 -> 0
+       if (btFabs(info->m_edgeV2V0Angle)< triangleInfoMapPtr->m_maxEdgeAngleThreshold)
+       {       
+          btVector3 nearest;
+          btNearestPointInLineSegment( cp.m_localPointB, v2, v0, nearest );
+          btScalar     len=(contact-nearest).length();
+          //
+          if( len < disttobestedge )
+          {
+             bestedge=2;
+             disttobestedge=len;
+      }              
+   }                   
+       
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+   btVector3 upfix=tri_normal * btVector3(0.1f,0.1f,0.1f);
+   btDebugDrawLine(tr * v0 + upfix, tr * v1 + upfix, red );
+#endif   
+       if (btFabs(info->m_edgeV0V1Angle)< triangleInfoMapPtr->m_maxEdgeAngleThreshold)
        {
 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
                btDebugDrawLine(tr*contact,tr*(contact+cp.m_normalWorldOnB*10),black);
 #endif
                btScalar len = (contact-nearest).length();
                if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
+               if( bestedge==0 )
                {
                        btVector3 edge(v0-v1);
                        isNearEdge = true;
@@ -577,7 +632,11 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject*
        btDebugDrawLine(tr*nearest,tr*cp.m_localPointB,green);
 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
 
-       if ((info->m_edgeV1V2Angle)< SIMD_2_PI)
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+   btDebugDrawLine(tr * v1 + upfix, tr * v2 + upfix , green );
+#endif   
+
+       if (btFabs(info->m_edgeV1V2Angle)< triangleInfoMapPtr->m_maxEdgeAngleThreshold)
        {
 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
                btDebugDrawLine(tr*contact,tr*(contact+cp.m_normalWorldOnB*10),black);
@@ -587,6 +646,7 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject*
 
                btScalar len = (contact-nearest).length();
                if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
+               if( bestedge==1 )
                {
                        isNearEdge = true;
 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
@@ -658,8 +718,11 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject*
 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
        btDebugDrawLine(tr*nearest,tr*cp.m_localPointB,blue);
 #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+   btDebugDrawLine(tr * v2 + upfix, tr * v0 + upfix , blue );
+#endif   
 
-       if ((info->m_edgeV2V0Angle)< SIMD_2_PI)
+       if (btFabs(info->m_edgeV2V0Angle)< triangleInfoMapPtr->m_maxEdgeAngleThreshold)
        {
 
 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
@@ -668,6 +731,7 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject*
 
                btScalar len = (contact-nearest).length();
                if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
+               if( bestedge==2 )
                {
                        isNearEdge = true;
 #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
@@ -759,11 +823,17 @@ void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject*
                                cp.m_normalWorldOnB = colObj0->getWorldTransform().getBasis()*tri_normal;
                        } else
                        {
+                               btVector3 newNormal = tri_normal *frontFacing;
+                               //if the tri_normal is pointing opposite direction as the current local contact normal, skip it
+                               btScalar d = newNormal.dot(localContactNormalOnB) ;
+                               if (d< 0)
+                               {
+                                       return;
+                               }
                                //modify the normal to be the triangle normal (or backfacing normal)
-                               cp.m_normalWorldOnB = colObj0->getWorldTransform().getBasis() *(tri_normal *frontFacing);
+                               cp.m_normalWorldOnB = colObj0->getWorldTransform().getBasis() *newNormal;
                        }
-                       
-                       
+                                               
                        // Reproject collision point along normal.
                        cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1;
                        cp.m_localPointB = colObj0->getWorldTransform().invXform(cp.m_positionWorldOnB);
index fd684c056f751e2f245de7afc5b0fbd9d56ce1dc..bf24246ea2fbe01edfb89fd12cb715b3b02729fb 100644 (file)
@@ -64,8 +64,8 @@ void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const b
        btAssert(m_manifoldPtr);
        //order in manifold needs to match
 
-//     if (depth > m_manifoldPtr->getContactBreakingThreshold())
-       if (depth > m_manifoldPtr->getContactProcessingThreshold())
+       if (depth > m_manifoldPtr->getContactBreakingThreshold())
+//     if (depth > m_manifoldPtr->getContactProcessingThreshold())
                return;
 
        bool isSwapped = m_manifoldPtr->getBody0() != m_body0;
index 927e2bc4f7625507804167c6e7adc40ca67e18d4..18199b49752ff7c7bbbd39eca2eb8ee7bae6d4eb 100644 (file)
@@ -14,8 +14,8 @@ subject to the following restrictions:
 */
 
 
-#ifndef MANIFOLD_RESULT_H
-#define MANIFOLD_RESULT_H
+#ifndef BT_MANIFOLD_RESULT_H
+#define BT_MANIFOLD_RESULT_H
 
 class btCollisionObject;
 #include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
@@ -125,4 +125,4 @@ public:
        
 };
 
-#endif //MANIFOLD_RESULT_H
+#endif //BT_MANIFOLD_RESULT_H
index bb2a7f23985b719a7fc47d9edd69bc599029212d..871c64415a239f5cb601ea668301957baa617323 100644 (file)
@@ -47,6 +47,8 @@ void btSimulationIslandManager::findUnions(btDispatcher* /* dispatcher */,btColl
        {
                btOverlappingPairCache* pairCachePtr = colWorld->getPairCache();
                const int numOverlappingPairs = pairCachePtr->getNumOverlappingPairs();
+               if (numOverlappingPairs)
+               {
                btBroadphasePair* pairPtr = pairCachePtr->getOverlappingPairArrayPtr();
                
                for (int i=0;i<numOverlappingPairs;i++)
@@ -63,6 +65,7 @@ void btSimulationIslandManager::findUnions(btDispatcher* /* dispatcher */,btColl
                                        (colObj1)->getIslandTag());
                        }
                }
+               }
        }
 }
 
@@ -190,7 +193,7 @@ class btPersistentManifoldSortPredicate
 {
        public:
 
-               SIMD_FORCE_INLINE bool operator() ( const btPersistentManifold* lhs, const btPersistentManifold* rhs )
+               SIMD_FORCE_INLINE bool operator() ( const btPersistentManifold* lhs, const btPersistentManifold* rhs ) const
                {
                        return getIslandId(lhs) < getIslandId(rhs);
                }
@@ -327,11 +330,13 @@ void btSimulationIslandManager::buildIslands(btDispatcher* dispatcher,btCollisio
                        //kinematic objects don't merge islands, but wake up all connected objects
                        if (colObj0->isKinematicObject() && colObj0->getActivationState() != ISLAND_SLEEPING)
                        {
-                               colObj1->activate();
+                               if (colObj0->hasContactResponse())
+                                       colObj1->activate();
                        }
                        if (colObj1->isKinematicObject() && colObj1->getActivationState() != ISLAND_SLEEPING)
                        {
-                               colObj0->activate();
+                               if (colObj1->hasContactResponse())
+                                       colObj0->activate();
                        }
                        if(m_splitIslands)
                        { 
@@ -362,7 +367,7 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,
        {
                btPersistentManifold** manifold = dispatcher->getInternalManifoldPointer();
                int maxNumManifolds = dispatcher->getNumManifolds();
-               callback->ProcessIsland(&collisionObjects[0],collisionObjects.size(),manifold,maxNumManifolds, -1);
+               callback->processIsland(&collisionObjects[0],collisionObjects.size(),manifold,maxNumManifolds, -1);
        }
        else
        {
@@ -372,8 +377,10 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,
 
                int numManifolds = int (m_islandmanifold.size());
 
-               //we should do radix sort, it it much faster (O(n) instead of O (n log2(n))
+               //tried a radix sort, but quicksort/heapsort seems still faster
+               //@todo rewrite island management
                m_islandmanifold.quickSort(btPersistentManifoldSortPredicate());
+               //m_islandmanifold.heapSort(btPersistentManifoldSortPredicate());
 
                //now process all active islands (sets of manifolds for now)
 
@@ -427,7 +434,7 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,
 
                        if (!islandSleeping)
                        {
-                               callback->ProcessIsland(&m_islandBodies[0],m_islandBodies.size(),startManifold,numIslandManifolds, islandId);
+                               callback->processIsland(&m_islandBodies[0],m_islandBodies.size(),startManifold,numIslandManifolds, islandId);
        //                      printf("Island callback of size:%d bodies, %d manifolds\n",islandBodies.size(),numIslandManifolds);
                        }
                        
index d059f5d6b0dcf67b94589610e61448b8da99d671..e24c6afeca1de87ca36a9b22f2c2355f977e56f2 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef SIMULATION_ISLAND_MANAGER_H
-#define SIMULATION_ISLAND_MANAGER_H
+#ifndef BT_SIMULATION_ISLAND_MANAGER_H
+#define BT_SIMULATION_ISLAND_MANAGER_H
 
 #include "BulletCollision/CollisionDispatch/btUnionFind.h"
 #include "btCollisionCreateFunc.h"
@@ -59,7 +59,7 @@ public:
        {
                virtual ~IslandCallback() {};
 
-               virtual void    ProcessIsland(btCollisionObject** bodies,int numBodies,class btPersistentManifold**     manifolds,int numManifolds, int islandId) = 0;
+               virtual void    processIsland(btCollisionObject** bodies,int numBodies,class btPersistentManifold**     manifolds,int numManifolds, int islandId) = 0;
        };
 
        void    buildAndProcessIslands(btDispatcher* dispatcher,btCollisionWorld* collisionWorld, IslandCallback* callback);
@@ -77,5 +77,5 @@ public:
 
 };
 
-#endif //SIMULATION_ISLAND_MANAGER_H
+#endif //BT_SIMULATION_ISLAND_MANAGER_H
 
index 47111d1c4af5c3cbf4c5cbe03c8af13ddfe52fd7..60286ae0aa4d1009864d0c05ec34eb1e7599833c 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef SPHERE_BOX_COLLISION_ALGORITHM_H
-#define SPHERE_BOX_COLLISION_ALGORITHM_H
+#ifndef BT_SPHERE_BOX_COLLISION_ALGORITHM_H
+#define BT_SPHERE_BOX_COLLISION_ALGORITHM_H
 
 #include "btActivatingCollisionAlgorithm.h"
 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
@@ -71,5 +71,5 @@ public:
 
 };
 
-#endif //SPHERE_BOX_COLLISION_ALGORITHM_H
+#endif //BT_SPHERE_BOX_COLLISION_ALGORITHM_H
 
index 7d07512ca66bab657b78b619b95e512e0d94c8da..e55acf277e6efcd6d741e875c738f6b290e0c000 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef SPHERE_SPHERE_COLLISION_ALGORITHM_H
-#define SPHERE_SPHERE_COLLISION_ALGORITHM_H
+#ifndef BT_SPHERE_SPHERE_COLLISION_ALGORITHM_H
+#define BT_SPHERE_SPHERE_COLLISION_ALGORITHM_H
 
 #include "btActivatingCollisionAlgorithm.h"
 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
@@ -62,5 +62,5 @@ public:
 
 };
 
-#endif //SPHERE_SPHERE_COLLISION_ALGORITHM_H
+#endif //BT_SPHERE_SPHERE_COLLISION_ALGORITHM_H
 
index 606c3635ae9fbca6593d2eeae12413a9091eebaf..7c6c4d8f8d569364680bfa3e75c42144daf85e47 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef SPHERE_TRIANGLE_COLLISION_ALGORITHM_H
-#define SPHERE_TRIANGLE_COLLISION_ALGORITHM_H
+#ifndef BT_SPHERE_TRIANGLE_COLLISION_ALGORITHM_H
+#define BT_SPHERE_TRIANGLE_COLLISION_ALGORITHM_H
 
 #include "btActivatingCollisionAlgorithm.h"
 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
@@ -65,5 +65,5 @@ public:
 
 };
 
-#endif //SPHERE_TRIANGLE_COLLISION_ALGORITHM_H
+#endif //BT_SPHERE_TRIANGLE_COLLISION_ALGORITHM_H
 
index 4c4f58d44fa5fa93cb58e07914f2a279bfe9a702..5222933595da3ea74cbde0da4e819d2091328ade 100644 (file)
@@ -53,7 +53,7 @@ class btUnionFindElementSortPredicate
 {
        public:
 
-               bool operator() ( const btElement& lhs, const btElement& rhs )
+               bool operator() ( const btElement& lhs, const btElement& rhs ) const
                {
                        return lhs.m_id < rhs.m_id;
                }
index 2cce335145bed8a09f66f17d7d76fc3c1bfc8ff5..ef2a29202f746b871faca5b4c1573a3ab803c9d8 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef UNION_FIND_H
-#define UNION_FIND_H
+#ifndef BT_UNION_FIND_H
+#define BT_UNION_FIND_H
 
 #include "LinearMath/btAlignedObjectArray.h"
 
@@ -126,4 +126,4 @@ class btUnionFind
   };
 
 
-#endif //UNION_FIND_H
+#endif //BT_UNION_FIND_H
index fc032069c035fe87189c5527e1a7eb29df773959..f4a9ca03e5c2d4da1092352d22596063cb680a97 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef OBB_BOX_2D_SHAPE_H
-#define OBB_BOX_2D_SHAPE_H
+#ifndef BT_OBB_BOX_2D_SHAPE_H
+#define BT_OBB_BOX_2D_SHAPE_H
 
 #include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.h"
 #include "BulletCollision/CollisionShapes/btCollisionMargin.h"
@@ -83,6 +83,7 @@ public:
        }
 
 
+       ///a btBox2dShape is a flat 2D box in the X-Y plane (Z extents are zero)
        btBox2dShape( const btVector3& boxHalfExtents) 
                : btPolyhedralConvexShape(),
                m_centroid(0,0,0)
@@ -97,6 +98,11 @@ public:
                m_normals[2].setValue(0,1,0);
                m_normals[3].setValue(-1,0,0);
 
+               btScalar minDimension = boxHalfExtents.getX();
+               if (minDimension>boxHalfExtents.getY())
+                       minDimension = boxHalfExtents.getY();
+               setSafeMargin(minDimension);
+
                m_shapeType = BOX_2D_SHAPE_PROXYTYPE;
                btVector3 margin(getMargin(),getMargin(),getMargin());
                m_implicitShapeDimensions = (boxHalfExtents * m_localScaling) - margin;
@@ -358,6 +364,6 @@ public:
 
 };
 
-#endif //OBB_BOX_2D_SHAPE_H
+#endif //BT_OBB_BOX_2D_SHAPE_H
 
 
index c6644efbef3eda6af8f0471277e15fd2aded361a..3859138f18afb71c201ffaedddcad4e32a40089c 100644 (file)
@@ -14,8 +14,18 @@ subject to the following restrictions:
 */
 #include "btBoxShape.h"
 
+btBoxShape::btBoxShape( const btVector3& boxHalfExtents) 
+: btPolyhedralConvexShape()
+{
+       m_shapeType = BOX_SHAPE_PROXYTYPE;
+
+       setSafeMargin(boxHalfExtents);
+
+       btVector3 margin(getMargin(),getMargin(),getMargin());
+       m_implicitShapeDimensions = (boxHalfExtents * m_localScaling) - margin;
+};
+
 
-//{ 
 
 
 void btBoxShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
index b405efc8e3ca820cc62becb075bf10ae4a18376b..0c5857dae624151e902ffe6e0c8c7061c91590c3 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef OBB_BOX_MINKOWSKI_H
-#define OBB_BOX_MINKOWSKI_H
+#ifndef BT_OBB_BOX_MINKOWSKI_H
+#define BT_OBB_BOX_MINKOWSKI_H
 
 #include "btPolyhedralConvexShape.h"
 #include "btCollisionMargin.h"
@@ -80,13 +80,7 @@ public:
        }
 
 
-       btBoxShape( const btVector3& boxHalfExtents) 
-               : btPolyhedralConvexShape()
-       {
-               m_shapeType = BOX_SHAPE_PROXYTYPE;
-               btVector3 margin(getMargin(),getMargin(),getMargin());
-               m_implicitShapeDimensions = (boxHalfExtents * m_localScaling) - margin;
-       };
+       btBoxShape( const btVector3& boxHalfExtents);
 
        virtual void setMargin(btScalar collisionMargin)
        {
@@ -145,7 +139,7 @@ public:
 
        virtual void getVertex(int i,btVector3& vtx) const
        {
-               btVector3 halfExtents = getHalfExtentsWithoutMargin();
+               btVector3 halfExtents = getHalfExtentsWithMargin();
 
                vtx = btVector3(
                                halfExtents.x() * (1-(i&1)) - halfExtents.x() * (i&1),
@@ -313,6 +307,6 @@ public:
 };
 
 
-#endif //OBB_BOX_MINKOWSKI_H
+#endif //BT_OBB_BOX_MINKOWSKI_H
 
 
index c269ef27bdb11199ccfdbd595a0a64c4f8032232..d1c2162987375196ee08e639f1308fa78faad24f 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef BVH_TRIANGLE_MESH_SHAPE_H
-#define BVH_TRIANGLE_MESH_SHAPE_H
+#ifndef BT_BVH_TRIANGLE_MESH_SHAPE_H
+#define BT_BVH_TRIANGLE_MESH_SHAPE_H
 
 #include "btTriangleMeshShape.h"
 #include "btOptimizedBvh.h"
@@ -136,4 +136,4 @@ SIMD_FORCE_INLINE   int     btBvhTriangleMeshShape::calculateSerializeBufferSize() con
 
 
 
-#endif //BVH_TRIANGLE_MESH_SHAPE_H
+#endif //BT_BVH_TRIANGLE_MESH_SHAPE_H
index 2faa11d4360f4ef323a1a0adfa21b22f0ee8b89e..864df26e9314bba3c87478d1b03c634d54b442b5 100644 (file)
@@ -55,7 +55,7 @@ btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInter
                btVector3 pos(0,0,0);
                pos[getUpAxis()] = getHalfHeight();
 
-               vtx = pos +vec*m_localScaling*(radius) - vec * getMargin();
+               vtx = pos +vec*(radius) - vec * getMargin();
                newDot = vec.dot(vtx);
                if (newDot > maxDot)
                {
@@ -67,7 +67,7 @@ btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInter
                btVector3 pos(0,0,0);
                pos[getUpAxis()] = -getHalfHeight();
 
-               vtx = pos +vec*m_localScaling*(radius) - vec * getMargin();
+               vtx = pos +vec*(radius) - vec * getMargin();
                newDot = vec.dot(vtx);
                if (newDot > maxDot)
                {
@@ -96,7 +96,7 @@ btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInter
                {
                        btVector3 pos(0,0,0);
                        pos[getUpAxis()] = getHalfHeight();
-                       vtx = pos +vec*m_localScaling*(radius) - vec * getMargin();
+                       vtx = pos +vec*(radius) - vec * getMargin();
                        newDot = vec.dot(vtx);
                        if (newDot > maxDot)
                        {
@@ -107,7 +107,7 @@ btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInter
                {
                        btVector3 pos(0,0,0);
                        pos[getUpAxis()] = -getHalfHeight();
-                       vtx = pos +vec*m_localScaling*(radius) - vec * getMargin();
+                       vtx = pos +vec*(radius) - vec * getMargin();
                        newDot = vec.dot(vtx);
                        if (newDot > maxDot)
                        {
index 18fd026041fa4b85a99075ba688b6a66c37878b9..474bf1fb49926e8e53e767df8556cb2b5e5f000d 100644 (file)
@@ -13,14 +13,15 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef COLLISION_MARGIN_H
-#define COLLISION_MARGIN_H
-
-//used by Gjk and some other algorithms
+#ifndef BT_COLLISION_MARGIN_H
+#define BT_COLLISION_MARGIN_H
 
+///The CONVEX_DISTANCE_MARGIN is a default collision margin for convex collision shapes derived from btConvexInternalShape.
+///This collision margin is used by Gjk and some other algorithms
+///Note that when creating small objects, you need to make sure to set a smaller collision margin, using the 'setMargin' API
 #define CONVEX_DISTANCE_MARGIN btScalar(0.04)// btScalar(0.1)//;//btScalar(0.01)
 
 
 
-#endif //COLLISION_MARGIN_H
+#endif //BT_COLLISION_MARGIN_H
 
index f32bd736a998b6954c9cbfccc9fad5af860b3c87..865c1067744c3c96c19ef76e03c3a81ad566ece4 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef COLLISION_SHAPE_H
-#define COLLISION_SHAPE_H
+#ifndef BT_COLLISION_SHAPE_H
+#define BT_COLLISION_SHAPE_H
 
 #include "LinearMath/btTransform.h"
 #include "LinearMath/btVector3.h"
@@ -146,5 +146,5 @@ SIMD_FORCE_INLINE   int     btCollisionShape::calculateSerializeBufferSize() const
 
 
 
-#endif //COLLISION_SHAPE_H
+#endif //BT_COLLISION_SHAPE_H
 
index 7f41dd4517bd23a5d5c13c27ddc8da5ee7a3d92a..141034a8e8c12ce507cdb1be0d32293036c7bcc8 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef COMPOUND_SHAPE_H
-#define COMPOUND_SHAPE_H
+#ifndef BT_COMPOUND_SHAPE_H
+#define BT_COMPOUND_SHAPE_H
 
 #include "btCollisionShape.h"
 
@@ -209,4 +209,4 @@ SIMD_FORCE_INLINE   int     btCompoundShape::calculateSerializeBufferSize() const
 
 
 
-#endif //COMPOUND_SHAPE_H
+#endif //BT_COMPOUND_SHAPE_H
index 2a370a47c75459fb7d36b72728503d8df5a0f3b1..2a03241c9d7d8f0e861254e8c373627cab4c5f4f 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef CONCAVE_SHAPE_H
-#define CONCAVE_SHAPE_H
+#ifndef BT_CONCAVE_SHAPE_H
+#define BT_CONCAVE_SHAPE_H
 
 #include "btCollisionShape.h"
 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
@@ -57,4 +57,4 @@ public:
 
 };
 
-#endif //CONCAVE_SHAPE_H
+#endif //BT_CONCAVE_SHAPE_H
index bd7d1443ac25ab0f59040a5bc4a6526286905f37..b69b5c5b0c845ff74fd5c358d77cfee58bd77edb 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef CONE_MINKOWSKI_H
-#define CONE_MINKOWSKI_H
+#ifndef BT_CONE_MINKOWSKI_H
+#define BT_CONE_MINKOWSKI_H
 
 #include "btConvexInternalShape.h"
 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
@@ -99,5 +99,5 @@ class btConeShapeZ : public btConeShape
        public:
                btConeShapeZ(btScalar radius,btScalar height);
 };
-#endif //CONE_MINKOWSKI_H
+#endif //BT_CONE_MINKOWSKI_H
 
index 69bc67cafab05690116b8022a74b22cf49f034aa..226245979ab10798c9f70aa16cc86c1a3389b2c5 100644 (file)
@@ -208,4 +208,48 @@ const char*        btConvexHullShape::serialize(void* dataBuffer, btSerializer* seriali
        return "btConvexHullShapeData";
 }
 
+void btConvexHullShape::project(const btTransform& trans, const btVector3& dir, btScalar& min, btScalar& max) const
+{
+#if 1
+       min = FLT_MAX;
+       max = -FLT_MAX;
+       btVector3 witnesPtMin;
+       btVector3 witnesPtMax;
+
+       int numVerts = m_unscaledPoints.size();
+       for(int i=0;i<numVerts;i++)
+       {
+               btVector3 vtx = m_unscaledPoints[i] * m_localScaling;
+               btVector3 pt = trans * vtx;
+               btScalar dp = pt.dot(dir);
+               if(dp < min)    
+               {
+                       min = dp;
+                       witnesPtMin = pt;
+               }
+               if(dp > max)    
+               {
+                       max = dp;
+                       witnesPtMax=pt;
+               }
+       }
+#else
+       btVector3 localAxis = dir*trans.getBasis();
+       btVector3 vtx1 = trans(localGetSupportingVertex(localAxis));
+       btVector3 vtx2 = trans(localGetSupportingVertex(-localAxis));
+
+       min = vtx1.dot(dir);
+       max = vtx2.dot(dir);
+#endif
+
+       if(min>max)
+       {
+               btScalar tmp = min;
+               min = max;
+               max = tmp;
+       }
+
+
+}
+
 
index bf960f4df923e6ee662f1e931cac6755a68dfedc..95a2af6a3a0f8ca787073698fbabe9e5d308ccae 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef CONVEX_HULL_SHAPE_H
-#define CONVEX_HULL_SHAPE_H
+#ifndef BT_CONVEX_HULL_SHAPE_H
+#define BT_CONVEX_HULL_SHAPE_H
 
 #include "btPolyhedralConvexShape.h"
 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
@@ -73,6 +73,8 @@ public:
        virtual void    batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
        
 
+       virtual void project(const btTransform& trans, const btVector3& dir, btScalar& min, btScalar& max) const;
+
 
        //debugging
        virtual const char*     getName()const {return "Convex";}
@@ -116,5 +118,5 @@ SIMD_FORCE_INLINE   int     btConvexHullShape::calculateSerializeBufferSize() const
 }
 
 
-#endif //CONVEX_HULL_SHAPE_H
+#endif //BT_CONVEX_HULL_SHAPE_H
 
index 1252773180494d12d1bb2559b1830447744f4fe9..85cd9ef90c77cfde69ca7c414a2eeaf92a5afdf3 100644 (file)
@@ -21,6 +21,11 @@ subject to the following restrictions:
 
 
 ///The btConvexInternalShape is an internal base class, shared by most convex shape implementations.
+///The btConvexInternalShape uses a default collision margin set to CONVEX_DISTANCE_MARGIN.
+///This collision margin used by Gjk and some other algorithms, see also btCollisionMargin.h
+///Note that when creating small shapes (derived from btConvexInternalShape), 
+///you need to make sure to set a smaller collision margin, using the 'setMargin' API
+///There is a automatic mechanism 'setSafeMargin' used by btBoxShape and btCylinderShape
 class btConvexInternalShape : public btConvexShape
 {
 
@@ -62,6 +67,23 @@ public:
                m_implicitShapeDimensions = dimensions;
        }
 
+       void    setSafeMargin(btScalar minDimension, btScalar defaultMarginMultiplier = 0.1f)
+       {
+               btScalar safeMargin = defaultMarginMultiplier*minDimension;
+               if (safeMargin < getMargin())
+               {
+                       setMargin(safeMargin);
+               }
+       }
+       void    setSafeMargin(const btVector3& halfExtents, btScalar defaultMarginMultiplier = 0.1f)
+       {
+               //see http://code.google.com/p/bullet/issues/detail?id=349
+               //this margin check could could be added to other collision shapes too,
+               //or add some assert/warning somewhere
+               btScalar minDimension=halfExtents[halfExtents.minAxis()];               
+               setSafeMargin(minDimension, defaultMarginMultiplier);
+       }
+
        ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
        void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
        {
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPolyhedron.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPolyhedron.cpp
new file mode 100644 (file)
index 0000000..1e26be5
--- /dev/null
@@ -0,0 +1,296 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2011 Advanced Micro Devices, Inc.  http://bulletphysics.org
+
+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.
+*/
+
+
+///This file was written by Erwin Coumans
+///Separating axis rest based on work from Pierre Terdiman, see
+///And contact clipping based on work from Simon Hobbs
+
+#include "btConvexPolyhedron.h"
+#include "LinearMath/btHashMap.h"
+
+btConvexPolyhedron::btConvexPolyhedron()
+{
+
+}
+btConvexPolyhedron::~btConvexPolyhedron()
+{
+
+}
+
+
+inline bool IsAlmostZero(const btVector3& v)
+{
+       if(fabsf(v.x())>1e-6 || fabsf(v.y())>1e-6 || fabsf(v.z())>1e-6) return false;
+       return true;
+}
+
+struct btInternalVertexPair
+{
+       btInternalVertexPair(short int v0,short int v1)
+               :m_v0(v0),
+               m_v1(v1)
+       {
+               if (m_v1>m_v0)
+                       btSwap(m_v0,m_v1);
+       }
+       short int m_v0;
+       short int m_v1;
+       int getHash() const
+       {
+               return m_v0+(m_v1<<16);
+       }
+       bool equals(const btInternalVertexPair& other) const
+       {
+               return m_v0==other.m_v0 && m_v1==other.m_v1;
+       }
+};
+
+struct btInternalEdge
+{
+       btInternalEdge()
+               :m_face0(-1),
+               m_face1(-1)
+       {
+       }
+       short int m_face0;
+       short int m_face1;
+};
+
+//
+
+#ifdef TEST_INTERNAL_OBJECTS
+bool btConvexPolyhedron::testContainment() const
+{
+       for(int p=0;p<8;p++)
+       {
+               btVector3 LocalPt;
+               if(p==0)                LocalPt = m_localCenter + btVector3(m_extents[0], m_extents[1], m_extents[2]);
+               else if(p==1)   LocalPt = m_localCenter + btVector3(m_extents[0], m_extents[1], -m_extents[2]);
+               else if(p==2)   LocalPt = m_localCenter + btVector3(m_extents[0], -m_extents[1], m_extents[2]);
+               else if(p==3)   LocalPt = m_localCenter + btVector3(m_extents[0], -m_extents[1], -m_extents[2]);
+               else if(p==4)   LocalPt = m_localCenter + btVector3(-m_extents[0], m_extents[1], m_extents[2]);
+               else if(p==5)   LocalPt = m_localCenter + btVector3(-m_extents[0], m_extents[1], -m_extents[2]);
+               else if(p==6)   LocalPt = m_localCenter + btVector3(-m_extents[0], -m_extents[1], m_extents[2]);
+               else if(p==7)   LocalPt = m_localCenter + btVector3(-m_extents[0], -m_extents[1], -m_extents[2]);
+
+               for(int i=0;i<m_faces.size();i++)
+               {
+                       const btVector3 Normal(m_faces[i].m_plane[0], m_faces[i].m_plane[1], m_faces[i].m_plane[2]);
+                       const btScalar d = LocalPt.dot(Normal) + m_faces[i].m_plane[3];
+                       if(d>0.0f)
+                               return false;
+               }
+       }
+       return true;
+}
+#endif
+
+void   btConvexPolyhedron::initialize()
+{
+
+       btHashMap<btInternalVertexPair,btInternalEdge> edges;
+
+       btScalar TotalArea = 0.0f;
+       
+       m_localCenter.setValue(0, 0, 0);
+       for(int i=0;i<m_faces.size();i++)
+       {
+               int numVertices = m_faces[i].m_indices.size();
+               int NbTris = numVertices;
+               for(int j=0;j<NbTris;j++)
+               {
+                       int k = (j+1)%numVertices;
+                       btInternalVertexPair vp(m_faces[i].m_indices[j],m_faces[i].m_indices[k]);
+                       btInternalEdge* edptr = edges.find(vp);
+                       btVector3 edge = m_vertices[vp.m_v1]-m_vertices[vp.m_v0];
+                       edge.normalize();
+
+                       bool found = false;
+
+                       for (int p=0;p<m_uniqueEdges.size();p++)
+                       {
+                               
+                               if (IsAlmostZero(m_uniqueEdges[p]-edge) || 
+                                       IsAlmostZero(m_uniqueEdges[p]+edge))
+                               {
+                                       found = true;
+                                       break;
+                               }
+                       }
+
+                       if (!found)
+                       {
+                               m_uniqueEdges.push_back(edge);
+                       }
+
+                       if (edptr)
+                       {
+                               btAssert(edptr->m_face0>=0);
+                               btAssert(edptr->m_face1<0);
+                               edptr->m_face1 = i;
+                       } else
+                       {
+                               btInternalEdge ed;
+                               ed.m_face0 = i;
+                               edges.insert(vp,ed);
+                       }
+               }
+       }
+
+#ifdef USE_CONNECTED_FACES
+       for(int i=0;i<m_faces.size();i++)
+       {
+               int numVertices = m_faces[i].m_indices.size();
+               m_faces[i].m_connectedFaces.resize(numVertices);
+
+               for(int j=0;j<numVertices;j++)
+               {
+                       int k = (j+1)%numVertices;
+                       btInternalVertexPair vp(m_faces[i].m_indices[j],m_faces[i].m_indices[k]);
+                       btInternalEdge* edptr = edges.find(vp);
+                       btAssert(edptr);
+                       btAssert(edptr->m_face0>=0);
+                       btAssert(edptr->m_face1>=0);
+
+                       int connectedFace = (edptr->m_face0==i)?edptr->m_face1:edptr->m_face0;
+                       m_faces[i].m_connectedFaces[j] = connectedFace;
+               }
+       }
+#endif//USE_CONNECTED_FACES
+
+       for(int i=0;i<m_faces.size();i++)
+       {
+               int numVertices = m_faces[i].m_indices.size();
+               int NbTris = numVertices-2;
+               
+               const btVector3& p0 = m_vertices[m_faces[i].m_indices[0]];
+               for(int j=1;j<=NbTris;j++)
+               {
+                       int k = (j+1)%numVertices;
+                       const btVector3& p1 = m_vertices[m_faces[i].m_indices[j]];
+                       const btVector3& p2 = m_vertices[m_faces[i].m_indices[k]];
+                       btScalar Area = ((p0 - p1).cross(p0 - p2)).length() * 0.5f;
+                       btVector3 Center = (p0+p1+p2)/3.0f;
+                       m_localCenter += Area * Center;
+                       TotalArea += Area;
+               }
+       }
+       m_localCenter /= TotalArea;
+
+
+
+
+#ifdef TEST_INTERNAL_OBJECTS
+       if(1)
+       {
+               m_radius = FLT_MAX;
+               for(int i=0;i<m_faces.size();i++)
+               {
+                       const btVector3 Normal(m_faces[i].m_plane[0], m_faces[i].m_plane[1], m_faces[i].m_plane[2]);
+                       const btScalar dist = btFabs(m_localCenter.dot(Normal) + m_faces[i].m_plane[3]);
+                       if(dist<m_radius)
+                               m_radius = dist;
+               }
+
+       
+               btScalar MinX = FLT_MAX;
+               btScalar MinY = FLT_MAX;
+               btScalar MinZ = FLT_MAX;
+               btScalar MaxX = -FLT_MAX;
+               btScalar MaxY = -FLT_MAX;
+               btScalar MaxZ = -FLT_MAX;
+               for(int i=0; i<m_vertices.size(); i++)
+               {
+                       const btVector3& pt = m_vertices[i];
+                       if(pt.x()<MinX) MinX = pt.x();
+                       if(pt.x()>MaxX) MaxX = pt.x();
+                       if(pt.y()<MinY) MinY = pt.y();
+                       if(pt.y()>MaxY) MaxY = pt.y();
+                       if(pt.z()<MinZ) MinZ = pt.z();
+                       if(pt.z()>MaxZ) MaxZ = pt.z();
+               }
+               mC.setValue(MaxX+MinX, MaxY+MinY, MaxZ+MinZ);
+               mE.setValue(MaxX-MinX, MaxY-MinY, MaxZ-MinZ);
+
+
+
+//             const btScalar r = m_radius / sqrtf(2.0f);
+               const btScalar r = m_radius / sqrtf(3.0f);
+               const int LargestExtent = mE.maxAxis();
+               const btScalar Step = (mE[LargestExtent]*0.5f - r)/1024.0f;
+               m_extents[0] = m_extents[1] = m_extents[2] = r;
+               m_extents[LargestExtent] = mE[LargestExtent]*0.5f;
+               bool FoundBox = false;
+               for(int j=0;j<1024;j++)
+               {
+                       if(testContainment())
+                       {
+                               FoundBox = true;
+                               break;
+                       }
+
+                       m_extents[LargestExtent] -= Step;
+               }
+               if(!FoundBox)
+               {
+                       m_extents[0] = m_extents[1] = m_extents[2] = r;
+               }
+               else
+               {
+                       // Refine the box
+                       const btScalar Step = (m_radius - r)/1024.0f;
+                       const int e0 = (1<<LargestExtent) & 3;
+                       const int e1 = (1<<e0) & 3;
+
+                       for(int j=0;j<1024;j++)
+                       {
+                               const btScalar Saved0 = m_extents[e0];
+                               const btScalar Saved1 = m_extents[e1];
+                               m_extents[e0] += Step;
+                               m_extents[e1] += Step;
+
+                               if(!testContainment())
+                               {
+                                       m_extents[e0] = Saved0;
+                                       m_extents[e1] = Saved1;
+                                       break;
+                               }
+                       }
+               }
+       }
+#endif
+}
+
+
+void btConvexPolyhedron::project(const btTransform& trans, const btVector3& dir, btScalar& min, btScalar& max) const
+{
+       min = FLT_MAX;
+       max = -FLT_MAX;
+       int numVerts = m_vertices.size();
+       for(int i=0;i<numVerts;i++)
+       {
+               btVector3 pt = trans * m_vertices[i];
+               btScalar dp = pt.dot(dir);
+               if(dp < min)    min = dp;
+               if(dp > max)    max = dp;
+       }
+       if(min>max)
+       {
+               btScalar tmp = min;
+               min = max;
+               max = tmp;
+       }
+}
\ No newline at end of file
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPolyhedron.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPolyhedron.h
new file mode 100644 (file)
index 0000000..08db39a
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2011 Advanced Micro Devices, Inc.  http://bulletphysics.org
+
+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.
+*/
+
+
+///This file was written by Erwin Coumans
+
+
+#ifndef _BT_POLYHEDRAL_FEATURES_H
+#define _BT_POLYHEDRAL_FEATURES_H
+
+#include "LinearMath/btTransform.h"
+#include "LinearMath/btAlignedObjectArray.h"
+
+#define TEST_INTERNAL_OBJECTS 1
+
+
+struct btFace
+{
+       btAlignedObjectArray<int>       m_indices;
+//     btAlignedObjectArray<int>       m_connectedFaces;
+       btScalar        m_plane[4];
+};
+
+
+class btConvexPolyhedron
+{
+       public:
+       btConvexPolyhedron();
+       virtual ~btConvexPolyhedron();
+
+       btAlignedObjectArray<btVector3> m_vertices;
+       btAlignedObjectArray<btFace>    m_faces;
+       btAlignedObjectArray<btVector3> m_uniqueEdges;
+
+       btVector3               m_localCenter;
+       btVector3               m_extents;
+       btScalar                m_radius;
+       btVector3               mC;
+       btVector3               mE;
+
+       void    initialize();
+       bool testContainment() const;
+
+       void project(const btTransform& trans, const btVector3& dir, btScalar& min, btScalar& max) const;
+};
+
+       
+#endif //_BT_POLYHEDRAL_FEATURES_H
+
+
index f5f3aa58aa48e0e14950a45109328068041a9589..8c67d8ebef19c77825a5f0f1dc6b24817915db6d 100644 (file)
@@ -43,6 +43,23 @@ btConvexShape::~btConvexShape()
 }
 
 
+void btConvexShape::project(const btTransform& trans, const btVector3& dir, btScalar& min, btScalar& max) const
+{
+       btVector3 localAxis = dir*trans.getBasis();
+       btVector3 vtx1 = trans(localGetSupportingVertex(localAxis));
+       btVector3 vtx2 = trans(localGetSupportingVertex(-localAxis));
+
+       min = vtx1.dot(dir);
+       max = vtx2.dot(dir);
+
+       if(min>max)
+       {
+               btScalar tmp = min;
+               min = max;
+               max = tmp;
+       }
+}
+
 
 static btVector3 convexHullSupport (const btVector3& localDirOrg, const btVector3* points, int numPoints, const btVector3& localScaling)
 {      
@@ -227,7 +244,7 @@ btVector3 btConvexShape::localGetSupportVertexWithoutMarginNonVirtual (const btV
                        pos[capsuleUpAxis] = halfHeight;
 
                        //vtx = pos +vec*(radius);
-                       vtx = pos +vec*capsuleShape->getLocalScalingNV()*(radius) - vec * capsuleShape->getMarginNV();
+                       vtx = pos +vec*(radius) - vec * capsuleShape->getMarginNV();
                        newDot = vec.dot(vtx);
                        
 
@@ -242,7 +259,7 @@ btVector3 btConvexShape::localGetSupportVertexWithoutMarginNonVirtual (const btV
                        pos[capsuleUpAxis] = -halfHeight;
 
                        //vtx = pos +vec*(radius);
-                       vtx = pos +vec*capsuleShape->getLocalScalingNV()*(radius) - vec * capsuleShape->getMarginNV();
+                       vtx = pos +vec*(radius) - vec * capsuleShape->getMarginNV();
                        newDot = vec.dot(vtx);
                        if (newDot > maxDot)
                        {
index 9c158259c1c1841cf7345f9d74bbf629303135da..290cd9fd13c4e664570cdd347cce1b8ed1a55501 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef CONVEX_SHAPE_INTERFACE1
-#define CONVEX_SHAPE_INTERFACE1
+#ifndef BT_CONVEX_SHAPE_INTERFACE1
+#define BT_CONVEX_SHAPE_INTERFACE1
 
 #include "btCollisionShape.h"
 
@@ -52,6 +52,8 @@ public:
        btScalar getMarginNonVirtual () const;
        void getAabbNonVirtual (const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const;
 
+       virtual void project(const btTransform& trans, const btVector3& dir, btScalar& min, btScalar& max) const;
+
        
        //notice that the vectors should be unit length
        virtual void    batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const= 0;
@@ -79,4 +81,4 @@ public:
 
 
 
-#endif //CONVEX_SHAPE_INTERFACE1
+#endif //BT_CONVEX_SHAPE_INTERFACE1
index f5167e74b80bf1dda79dec548457b28e0edc25e4..af5d00388e88298c52cdf7836b8c3c7451463043 100644 (file)
@@ -12,8 +12,8 @@ subject to the following restrictions:
 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 CONVEX_TRIANGLEMESH_SHAPE_H
-#define CONVEX_TRIANGLEMESH_SHAPE_H
+#ifndef BT_CONVEX_TRIANGLEMESH_SHAPE_H
+#define BT_CONVEX_TRIANGLEMESH_SHAPE_H
 
 
 #include "btPolyhedralConvexShape.h"
@@ -69,7 +69,7 @@ public:
 
 
 
-#endif //CONVEX_TRIANGLEMESH_SHAPE_H
+#endif //BT_CONVEX_TRIANGLEMESH_SHAPE_H
 
 
 
index c2e534b0b462b4760c52bf6a068cad7354798ecf..6cfe43be4da7cf1008591886a06261a913e7d010 100644 (file)
@@ -19,6 +19,8 @@ btCylinderShape::btCylinderShape (const btVector3& halfExtents)
 :btConvexInternalShape(),
 m_upAxis(1)
 {
+       setSafeMargin(halfExtents);
+
        btVector3 margin(getMargin(),getMargin(),getMargin());
        m_implicitShapeDimensions = (halfExtents * m_localScaling) - margin;
        m_shapeType = CYLINDER_SHAPE_PROXYTYPE;
index f7899265d310f0cba3cb40156d860a36e5ee5a00..125bfc78a77fb521043ad815d51fed776f4e11ce 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef CYLINDER_MINKOWSKI_H
-#define CYLINDER_MINKOWSKI_H
+#ifndef BT_CYLINDER_MINKOWSKI_H
+#define BT_CYLINDER_MINKOWSKI_H
 
 #include "btBoxShape.h"
 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
@@ -196,5 +196,5 @@ SIMD_FORCE_INLINE   const char*     btCylinderShape::serialize(void* dataBuffer, btSer
 
 
 
-#endif //CYLINDER_MINKOWSKI_H
+#endif //BT_CYLINDER_MINKOWSKI_H
 
index 9f6b4435c295e931774b5f52c62e4c51a2c9bb64..87b7b66d1e190517d3c6de8dc70ef4ed7f151871 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef EMPTY_SHAPE_H
-#define EMPTY_SHAPE_H
+#ifndef BT_EMPTY_SHAPE_H
+#define BT_EMPTY_SHAPE_H
 
 #include "btConcaveShape.h"
 
@@ -67,4 +67,4 @@ protected:
 
 
 
-#endif //EMPTY_SHAPE_H
+#endif //BT_EMPTY_SHAPE_H
index 3a1e6f4a2b9a6f8819af5ba4c51822c041f04059..95631c3019065fc5d1985ee372d3fcce5ea34a70 100644 (file)
@@ -21,7 +21,7 @@ subject to the following restrictions:
 
 btHeightfieldTerrainShape::btHeightfieldTerrainShape
 (
-int heightStickWidth, int heightStickLength, void* heightfieldData,
+int heightStickWidth, int heightStickLength, const void* heightfieldData,
 btScalar heightScale, btScalar minHeight, btScalar maxHeight,int upAxis,
 PHY_ScalarType hdt, bool flipQuadEdges
 )
@@ -33,7 +33,7 @@ PHY_ScalarType hdt, bool flipQuadEdges
 
 
 
-btHeightfieldTerrainShape::btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength,void* heightfieldData,btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges)
+btHeightfieldTerrainShape::btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength,const void* heightfieldData,btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges)
 {
        // legacy constructor: support only float or unsigned char,
        //      and min height is zero
@@ -53,7 +53,7 @@ btHeightfieldTerrainShape::btHeightfieldTerrainShape(int heightStickWidth, int h
 
 void btHeightfieldTerrainShape::initialize
 (
-int heightStickWidth, int heightStickLength, void* heightfieldData,
+int heightStickWidth, int heightStickLength, const void* heightfieldData,
 btScalar heightScale, btScalar minHeight, btScalar maxHeight, int upAxis,
 PHY_ScalarType hdt, bool flipQuadEdges
 )
index 4f5d1e35bf30a000e4c0eabaec0ef5ad61e695c1..78e231e08e6218acbf37bd9efdc2da82e9255517 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef HEIGHTFIELD_TERRAIN_SHAPE_H
-#define HEIGHTFIELD_TERRAIN_SHAPE_H
+#ifndef BT_HEIGHTFIELD_TERRAIN_SHAPE_H
+#define BT_HEIGHTFIELD_TERRAIN_SHAPE_H
 
 #include "btConcaveShape.h"
 
@@ -85,10 +85,10 @@ protected:
        btScalar m_heightScale;
        union
        {
-               unsigned char*  m_heightfieldDataUnsignedChar;
-               short*          m_heightfieldDataShort;
-               btScalar*                       m_heightfieldDataFloat;
-               void*                   m_heightfieldDataUnknown;
+               const unsigned char*    m_heightfieldDataUnsignedChar;
+               const short*            m_heightfieldDataShort;
+               const btScalar*                 m_heightfieldDataFloat;
+               const void*     m_heightfieldDataUnknown;
        };
 
        PHY_ScalarType  m_heightDataType;       
@@ -111,7 +111,7 @@ protected:
          backwards-compatible without a lot of copy/paste.
         */
        void initialize(int heightStickWidth, int heightStickLength,
-                       void* heightfieldData, btScalar heightScale,
+                       const void* heightfieldData, btScalar heightScale,
                        btScalar minHeight, btScalar maxHeight, int upAxis,
                        PHY_ScalarType heightDataType, bool flipQuadEdges);
 
@@ -123,7 +123,7 @@ public:
          heightScale is needed for any integer-based heightfield data types.
         */
        btHeightfieldTerrainShape(int heightStickWidth,int heightStickLength,
-                                 void* heightfieldData, btScalar heightScale,
+                                 const void* heightfieldData, btScalar heightScale,
                                  btScalar minHeight, btScalar maxHeight,
                                  int upAxis, PHY_ScalarType heightDataType,
                                  bool flipQuadEdges);
@@ -135,7 +135,7 @@ public:
          compatibility reasons, heightScale is calculated as maxHeight / 65535 
          (and is only used when useFloatData = false).
         */
-       btHeightfieldTerrainShape(int heightStickWidth,int heightStickLength,void* heightfieldData, btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges);
+       btHeightfieldTerrainShape(int heightStickWidth,int heightStickLength,const void* heightfieldData, btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges);
 
        virtual ~btHeightfieldTerrainShape();
 
@@ -158,4 +158,4 @@ public:
 
 };
 
-#endif //HEIGHTFIELD_TERRAIN_SHAPE_H
+#endif //BT_HEIGHTFIELD_TERRAIN_SHAPE_H
index 030e167da5050a1e0aa0562ae9526d32e3989f76..866f9b4da4d6277b6b7d4b37e033ca9d6d7b5d49 100644 (file)
@@ -15,8 +15,8 @@ subject to the following restrictions:
 
 /// This file was created by Alex Silverman
 
-#ifndef MATERIAL_H
-#define MATERIAL_H
+#ifndef BT_MATERIAL_H
+#define BT_MATERIAL_H
 
 // Material class to be used by btMultimaterialTriangleMeshShape to store triangle properties
 class btMaterial
@@ -31,5 +31,5 @@ public:
     btMaterial(btScalar fric, btScalar rest) { m_friction = fric; m_restitution = rest; }
 };
 
-#endif // MATERIAL_H
+#endif // BT_MATERIAL_H
 
index d6fd040213b7dbffdf02e7dde1801c44772caf92..6c844e8c0af715096324a68aac97783f2bf673c8 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef MINKOWSKI_SUM_SHAPE_H
-#define MINKOWSKI_SUM_SHAPE_H
+#ifndef BT_MINKOWSKI_SUM_SHAPE_H
+#define BT_MINKOWSKI_SUM_SHAPE_H
 
 #include "btConvexInternalShape.h"
 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
@@ -57,4 +57,4 @@ public:
        }
 };
 
-#endif //MINKOWSKI_SUM_SHAPE_H
+#endif //BT_MINKOWSKI_SUM_SHAPE_H
index 3db7e320889d605ed3055132199d36dc68feb505..06c5d16d941d5d6fe69670924d00c01a0d86a454 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef MULTI_SPHERE_MINKOWSKI_H
-#define MULTI_SPHERE_MINKOWSKI_H
+#ifndef BT_MULTI_SPHERE_MINKOWSKI_H
+#define BT_MULTI_SPHERE_MINKOWSKI_H
 
 #include "btConvexInternalShape.h"
 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
@@ -96,4 +96,4 @@ SIMD_FORCE_INLINE     int     btMultiSphereShape::calculateSerializeBufferSize() const
 
 
 
-#endif //MULTI_SPHERE_MINKOWSKI_H
+#endif //BT_MULTI_SPHERE_MINKOWSKI_H
index 96b2ad95b6dabf750a91a5f0a68576a5c649dc89..2b92ab7d1b7707bd9180c17cade3efa80bbeff45 100644 (file)
@@ -15,8 +15,8 @@ subject to the following restrictions:
 
 /// This file was created by Alex Silverman
 
-#ifndef BVH_TRIANGLE_MATERIAL_MESH_SHAPE_H
-#define BVH_TRIANGLE_MATERIAL_MESH_SHAPE_H
+#ifndef BT_BVH_TRIANGLE_MATERIAL_MESH_SHAPE_H
+#define BT_BVH_TRIANGLE_MATERIAL_MESH_SHAPE_H
 
 #include "btBvhTriangleMeshShape.h"
 #include "btMaterial.h"
@@ -117,4 +117,4 @@ public:
 }
 ;
 
-#endif //BVH_TRIANGLE_MATERIAL_MESH_SHAPE_H
+#endif //BT_BVH_TRIANGLE_MATERIAL_MESH_SHAPE_H
index 981b8a2652c0199003514c0c6c8ad8338f30ca2c..6f36775f7c9a56a6e5a77be25538513d177418b7 100644 (file)
@@ -43,7 +43,7 @@ void btOptimizedBvh::build(btStridingMeshInterface* triangles, bool useQuantized
 
                NodeTriangleCallback& operator=(NodeTriangleCallback& other)
                {
-                       m_triangleNodes = other.m_triangleNodes;
+                       m_triangleNodes.copyFromArray(other.m_triangleNodes);
                        return *this;
                }
                
@@ -84,7 +84,7 @@ void btOptimizedBvh::build(btStridingMeshInterface* triangles, bool useQuantized
 
                QuantizedNodeTriangleCallback& operator=(QuantizedNodeTriangleCallback& other)
                {
-                       m_triangleNodes = other.m_triangleNodes;
+                       m_triangleNodes.copyFromArray(other.m_triangleNodes);
                        m_optimizedTree = other.m_optimizedTree;
                        return *this;
                }
index 749fe6005ddd4ec0f38c4808ff715dd842a16203..715961f5528a5e78eb865372f650d06285cdde6f 100644 (file)
@@ -15,8 +15,8 @@ subject to the following restrictions:
 
 ///Contains contributions from Disney Studio's
 
-#ifndef OPTIMIZED_BVH_H
-#define OPTIMIZED_BVH_H
+#ifndef BT_OPTIMIZED_BVH_H
+#define BT_OPTIMIZED_BVH_H
 
 #include "BulletCollision/BroadphaseCollision/btQuantizedBvh.h"
 
@@ -60,6 +60,6 @@ public:
 };
 
 
-#endif //OPTIMIZED_BVH_H
+#endif //BT_OPTIMIZED_BVH_H
 
 
index b1ecb3e432c77a8ca4100f0f6199ebd62caa1ac6..82def79cf55d902227cea8a2188748cfa41e8e3d 100644 (file)
@@ -14,10 +14,289 @@ subject to the following restrictions:
 */
 
 #include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.h"
+#include "btConvexPolyhedron.h"
+#include "LinearMath/btConvexHullComputer.h"
+#include <new>
+#include "LinearMath/btGeometryUtil.h"
+#include "LinearMath/btGrahamScan2dConvexHull.h"
 
-btPolyhedralConvexShape::btPolyhedralConvexShape() :btConvexInternalShape()
+
+btPolyhedralConvexShape::btPolyhedralConvexShape() :btConvexInternalShape(),
+m_polyhedron(0)
+{
+
+}
+
+btPolyhedralConvexShape::~btPolyhedralConvexShape()
+{
+       if (m_polyhedron)
+       {
+               btAlignedFree(m_polyhedron);
+       }
+}
+
+
+bool   btPolyhedralConvexShape::initializePolyhedralFeatures()
 {
 
+       if (m_polyhedron)
+               btAlignedFree(m_polyhedron);
+       
+       void* mem = btAlignedAlloc(sizeof(btConvexPolyhedron),16);
+       m_polyhedron = new (mem) btConvexPolyhedron;
+
+               btAlignedObjectArray<btVector3> orgVertices;
+
+       for (int i=0;i<getNumVertices();i++)
+       {
+               btVector3& newVertex = orgVertices.expand();
+               getVertex(i,newVertex);
+       }
+
+#if 0
+       btAlignedObjectArray<btVector3> planeEquations;
+       btGeometryUtil::getPlaneEquationsFromVertices(orgVertices,planeEquations);
+
+       btAlignedObjectArray<btVector3> shiftedPlaneEquations;
+       for (int p=0;p<planeEquations.size();p++)
+       {
+                  btVector3 plane = planeEquations[p];
+                  plane[3] -= getMargin();
+                  shiftedPlaneEquations.push_back(plane);
+       }
+
+       btAlignedObjectArray<btVector3> tmpVertices;
+
+       btGeometryUtil::getVerticesFromPlaneEquations(shiftedPlaneEquations,tmpVertices);
+       btConvexHullComputer conv;
+       conv.compute(&tmpVertices[0].getX(), sizeof(btVector3),tmpVertices.size(),0.f,0.f);
+
+#else
+       btConvexHullComputer conv;
+       conv.compute(&orgVertices[0].getX(), sizeof(btVector3),orgVertices.size(),0.f,0.f);
+
+#endif
+
+
+
+       btAlignedObjectArray<btVector3> faceNormals;
+       int numFaces = conv.faces.size();
+       faceNormals.resize(numFaces);
+       btConvexHullComputer* convexUtil = &conv;
+
+       
+       btAlignedObjectArray<btFace>    tmpFaces;
+       tmpFaces.resize(numFaces);
+
+       int numVertices = convexUtil->vertices.size();
+       m_polyhedron->m_vertices.resize(numVertices);
+       for (int p=0;p<numVertices;p++)
+       {
+               m_polyhedron->m_vertices[p] = convexUtil->vertices[p];
+       }
+
+
+       for (int i=0;i<numFaces;i++)
+       {
+               int face = convexUtil->faces[i];
+               //printf("face=%d\n",face);
+               const btConvexHullComputer::Edge*  firstEdge = &convexUtil->edges[face];
+               const btConvexHullComputer::Edge*  edge = firstEdge;
+
+               btVector3 edges[3];
+               int numEdges = 0;
+               //compute face normals
+
+               btScalar maxCross2 = 0.f;
+               int chosenEdge = -1;
+
+               do
+               {
+                       
+                       int src = edge->getSourceVertex();
+                       tmpFaces[i].m_indices.push_back(src);
+                       int targ = edge->getTargetVertex();
+                       btVector3 wa = convexUtil->vertices[src];
+
+                       btVector3 wb = convexUtil->vertices[targ];
+                       btVector3 newEdge = wb-wa;
+                       newEdge.normalize();
+                       if (numEdges<2)
+                               edges[numEdges++] = newEdge;
+
+                       edge = edge->getNextEdgeOfFace();
+               } while (edge!=firstEdge);
+
+               btScalar planeEq = 1e30f;
+
+               
+               if (numEdges==2)
+               {
+                       faceNormals[i] = edges[0].cross(edges[1]);
+                       faceNormals[i].normalize();
+                       tmpFaces[i].m_plane[0] = faceNormals[i].getX();
+                       tmpFaces[i].m_plane[1] = faceNormals[i].getY();
+                       tmpFaces[i].m_plane[2] = faceNormals[i].getZ();
+                       tmpFaces[i].m_plane[3] = planeEq;
+
+               }
+               else
+               {
+                       btAssert(0);//degenerate?
+                       faceNormals[i].setZero();
+               }
+
+               for (int v=0;v<tmpFaces[i].m_indices.size();v++)
+               {
+                       btScalar eq = m_polyhedron->m_vertices[tmpFaces[i].m_indices[v]].dot(faceNormals[i]);
+                       if (planeEq>eq)
+                       {
+                               planeEq=eq;
+                       }
+               }
+               tmpFaces[i].m_plane[3] = -planeEq;
+       }
+
+       //merge coplanar faces and copy them to m_polyhedron
+
+       btScalar faceWeldThreshold= 0.999f;
+       btAlignedObjectArray<int> todoFaces;
+       for (int i=0;i<tmpFaces.size();i++)
+               todoFaces.push_back(i);
+
+       while (todoFaces.size())
+       {
+               btAlignedObjectArray<int> coplanarFaceGroup;
+               int refFace = todoFaces[todoFaces.size()-1];
+
+               coplanarFaceGroup.push_back(refFace);
+               btFace& faceA = tmpFaces[refFace];
+               todoFaces.pop_back();
+
+               btVector3 faceNormalA(faceA.m_plane[0],faceA.m_plane[1],faceA.m_plane[2]);
+               for (int j=todoFaces.size()-1;j>=0;j--)
+               {
+                       int i = todoFaces[j];
+                       btFace& faceB = tmpFaces[i];
+                       btVector3 faceNormalB(faceB.m_plane[0],faceB.m_plane[1],faceB.m_plane[2]);
+                       if (faceNormalA.dot(faceNormalB)>faceWeldThreshold)
+                       {
+                               coplanarFaceGroup.push_back(i);
+                               todoFaces.remove(i);
+                       }
+               }
+
+
+               bool did_merge = false;
+               if (coplanarFaceGroup.size()>1)
+               {
+                       //do the merge: use Graham Scan 2d convex hull
+
+                       btAlignedObjectArray<GrahamVector2> orgpoints;
+
+                       for (int i=0;i<coplanarFaceGroup.size();i++)
+                       {
+//                             m_polyhedron->m_faces.push_back(tmpFaces[coplanarFaceGroup[i]]);
+
+                               btFace& face = tmpFaces[coplanarFaceGroup[i]];
+                               btVector3 faceNormal(face.m_plane[0],face.m_plane[1],face.m_plane[2]);
+                               btVector3 xyPlaneNormal(0,0,1);
+
+                               btQuaternion rotationArc = shortestArcQuat(faceNormal,xyPlaneNormal);
+                               
+                               for (int f=0;f<face.m_indices.size();f++)
+                               {
+                                       int orgIndex = face.m_indices[f];
+                                       btVector3 pt = m_polyhedron->m_vertices[orgIndex];
+                                       btVector3 rotatedPt =  quatRotate(rotationArc,pt);
+                                       rotatedPt.setZ(0);
+                                       bool found = false;
+
+                                       for (int i=0;i<orgpoints.size();i++)
+                                       {
+                                               //if ((orgpoints[i].m_orgIndex == orgIndex) || ((rotatedPt-orgpoints[i]).length2()<0.0001))
+                                               if (orgpoints[i].m_orgIndex == orgIndex)
+                                               {
+                                                       found=true;
+                                                       break;
+                                               }
+                                       }
+                                       if (!found)
+                                               orgpoints.push_back(GrahamVector2(rotatedPt,orgIndex));
+                               }
+                       }
+
+                       btFace combinedFace;
+                       for (int i=0;i<4;i++)
+                               combinedFace.m_plane[i] = tmpFaces[coplanarFaceGroup[0]].m_plane[i];
+
+                       btAlignedObjectArray<GrahamVector2> hull;
+                       GrahamScanConvexHull2D(orgpoints,hull);
+
+                       for (int i=0;i<hull.size();i++)
+                       {
+                               combinedFace.m_indices.push_back(hull[i].m_orgIndex);
+                               for(int k = 0; k < orgpoints.size(); k++) {
+                                       if(orgpoints[k].m_orgIndex == hull[i].m_orgIndex) {
+                                               orgpoints[k].m_orgIndex = -1; // invalidate...
+                                               break;
+                       }
+                               }
+                       }
+                       // are there rejected vertices?
+                       bool reject_merge = false;
+                       for(int i = 0; i < orgpoints.size(); i++) {
+                               if(orgpoints[i].m_orgIndex == -1)
+                                       continue; // this is in the hull...
+                               // this vertex is rejected -- is anybody else using this vertex?
+                               for(int j = 0; j < tmpFaces.size(); j++) {
+                                       btFace& face = tmpFaces[j];
+                                       // is this a face of the current coplanar group?
+                                       bool is_in_current_group = false;
+                                       for(int k = 0; k < coplanarFaceGroup.size(); k++) {
+                                               if(coplanarFaceGroup[k] == j) {
+                                                       is_in_current_group = true;
+                                                       break;
+                                               }
+                                       }
+                                       if(is_in_current_group) // ignore this face...
+                                               continue;
+                                       // does this face use this rejected vertex?
+                                       for(int v = 0; v < face.m_indices.size(); v++) {
+                                               if(face.m_indices[v] == orgpoints[i].m_orgIndex) {
+                                                       // this rejected vertex is used in another face -- reject merge
+                                                       reject_merge = true;
+                                                       break;
+                                               }
+                                       }
+                                       if(reject_merge)
+                                               break;
+                               }
+                               if(reject_merge)
+                                       break;
+                       }
+                       if(!reject_merge) {
+                               // do this merge!
+                               did_merge = true;
+                       m_polyhedron->m_faces.push_back(combinedFace);
+                       }
+               }
+               if(!did_merge)
+               {
+                       for (int i=0;i<coplanarFaceGroup.size();i++)
+                       {
+                               m_polyhedron->m_faces.push_back(tmpFaces[coplanarFaceGroup[i]]);
+                       }
+
+               }
+
+
+
+       }
+       
+       m_polyhedron->initialize();
+
+       return true;
 }
 
 
@@ -183,11 +462,14 @@ void      btPolyhedralConvexAabbCachingShape::recalcLocalAabb()
                btVector3 vec(btScalar(0.),btScalar(0.),btScalar(0.));
                vec[i] = btScalar(1.);
                btVector3 tmp = localGetSupportingVertex(vec);
-               m_localAabbMax[i] = tmp[i]+m_collisionMargin;
+               m_localAabbMax[i] = tmp[i];
                vec[i] = btScalar(-1.);
                tmp = localGetSupportingVertex(vec);
-               m_localAabbMin[i] = tmp[i]-m_collisionMargin;
+               m_localAabbMin[i] = tmp[i];
        }
        #endif
 }
 
+
+
+
index 2c691b9565292f2481465a6e9a693299384282a0..ee2e1e28277965c221b90b0d71f41d4f80b5c3e4 100644 (file)
@@ -13,23 +13,37 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef BU_SHAPE
-#define BU_SHAPE
+#ifndef BT_POLYHEDRAL_CONVEX_SHAPE_H
+#define BT_POLYHEDRAL_CONVEX_SHAPE_H
 
 #include "LinearMath/btMatrix3x3.h"
 #include "btConvexInternalShape.h"
+class btConvexPolyhedron;
 
 
 ///The btPolyhedralConvexShape is an internal interface class for polyhedral convex shapes.
 class btPolyhedralConvexShape : public btConvexInternalShape
 {
+       
 
 protected:
        
+       btConvexPolyhedron* m_polyhedron;
+
 public:
 
        btPolyhedralConvexShape();
 
+       virtual ~btPolyhedralConvexShape();
+
+       ///optional method mainly used to generate multiple contact points by clipping polyhedral features (faces/edges)
+       virtual bool    initializePolyhedralFeatures();
+
+       const btConvexPolyhedron*       getConvexPolyhedron() const
+       {
+               return m_polyhedron;
+       }
+
        //brute force implementations
 
        virtual btVector3       localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
@@ -95,4 +109,4 @@ public:
 
 };
 
-#endif //BU_SHAPE
+#endif //BT_POLYHEDRAL_CONVEX_SHAPE_H
index 4ab28555ba87e32f2fb9d34e94aabc349fd49311..ff86ef319e9ffb003a0ba26d8291e3e07ed46b12 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef SCALED_BVH_TRIANGLE_MESH_SHAPE_H
-#define SCALED_BVH_TRIANGLE_MESH_SHAPE_H
+#ifndef BT_SCALED_BVH_TRIANGLE_MESH_SHAPE_H
+#define BT_SCALED_BVH_TRIANGLE_MESH_SHAPE_H
 
 #include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h"
 
@@ -90,4 +90,4 @@ SIMD_FORCE_INLINE     const char*     btScaledBvhTriangleMeshShape::serialize(void* data
 }
 
 
-#endif //BVH_TRIANGLE_MESH_SHAPE_H
+#endif //BT_SCALED_BVH_TRIANGLE_MESH_SHAPE_H
index 07b3500f994c2ee27aa5c91e373cfbb514916df7..642a2887435e1b058c1f8554677655fd31e834ba 100644 (file)
@@ -15,8 +15,8 @@ subject to the following restrictions:
 
 ///btShapeHull implemented by John McCutchan.
 
-#ifndef _SHAPE_HULL_H
-#define _SHAPE_HULL_H
+#ifndef BT_SHAPE_HULL_H
+#define BT_SHAPE_HULL_H
 
 #include "LinearMath/btAlignedObjectArray.h"
 #include "BulletCollision/CollisionShapes/btConvexShape.h"
@@ -56,4 +56,4 @@ public:
        }
 };
 
-#endif //_SHAPE_HULL_H
+#endif //BT_SHAPE_HULL_H
index f98372442baca503f68fc4864096c8c97ce32620..b192efeeb8dfe0a3b62ddba44eb4348c734855be 100644 (file)
@@ -12,8 +12,8 @@ subject to the following restrictions:
 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 SPHERE_MINKOWSKI_H
-#define SPHERE_MINKOWSKI_H
+#ifndef BT_SPHERE_MINKOWSKI_H
+#define BT_SPHERE_MINKOWSKI_H
 
 #include "btConvexInternalShape.h"
 #include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
@@ -70,4 +70,4 @@ public:
 };
 
 
-#endif //SPHERE_MINKOWSKI_H
+#endif //BT_SPHERE_MINKOWSKI_H
index beb53ef33a1be7501125bc5248bde16f423b148c..b13825e610d11341a7a4eee6c4f853caa6dccfe7 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef STATIC_PLANE_SHAPE_H
-#define STATIC_PLANE_SHAPE_H
+#ifndef BT_STATIC_PLANE_SHAPE_H
+#define BT_STATIC_PLANE_SHAPE_H
 
 #include "btConcaveShape.h"
 
@@ -97,7 +97,7 @@ SIMD_FORCE_INLINE     const char*     btStaticPlaneShape::serialize(void* dataBuffer, bt
 }
 
 
-#endif //STATIC_PLANE_SHAPE_H
+#endif //BT_STATIC_PLANE_SHAPE_H
 
 
 
index bc2f9f2144816609919c808f260e213197734707..dd22fc5635a95e85ac359c1ad48924a1cf129833 100644 (file)
@@ -253,9 +253,11 @@ const char*        btStridingMeshInterface::serialize(void* dataBuffer, btSerializer* s
                        memPtr->m_indices16 = 0;
                        memPtr->m_indices32 = 0;
                        memPtr->m_3indices16 = 0;
+                       memPtr->m_3indices8 = 0;
                        memPtr->m_vertices3f = 0;
                        memPtr->m_vertices3d = 0;
 
+
                        switch (gfxindextype)
                        {
                        case PHY_INTEGER:
index 9e3e2ab0f593a0c82df07db5b2a134a2947a4cb3..f2b27ade8e8308d8a4cf93c4d5032c265ebf8259 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef STRIDING_MESHINTERFACE_H
-#define STRIDING_MESHINTERFACE_H
+#ifndef BT_STRIDING_MESHINTERFACE_H
+#define BT_STRIDING_MESHINTERFACE_H
 
 #include "LinearMath/btVector3.h"
 #include "btTriangleCallback.h"
@@ -159,4 +159,4 @@ SIMD_FORCE_INLINE   int     btStridingMeshInterface::calculateSerializeBufferSize() co
 
 
 
-#endif //STRIDING_MESHINTERFACE_H
+#endif //BT_STRIDING_MESHINTERFACE_H
index 72e9f232876de39d599abaaaee3bf5516a632c1f..6b7128efc8e6f33df52a6c4f500f0afa93bfee01 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef BU_SIMPLEX_1TO4_SHAPE
-#define BU_SIMPLEX_1TO4_SHAPE
+#ifndef BT_SIMPLEX_1TO4_SHAPE
+#define BT_SIMPLEX_1TO4_SHAPE
 
 
 #include "btPolyhedralConvexShape.h"
@@ -71,4 +71,4 @@ public:
 
 };
 
-#endif //BU_SIMPLEX_1TO4_SHAPE
+#endif //BT_SIMPLEX_1TO4_SHAPE
index 0499702b05b3647b8772a9f97897b524b7e035d9..461c57f87730fe4aa615f86ff835d7cb6f81039b 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef TRIANGLE_CALLBACK_H
-#define TRIANGLE_CALLBACK_H
+#ifndef BT_TRIANGLE_CALLBACK_H
+#define BT_TRIANGLE_CALLBACK_H
 
 #include "LinearMath/btVector3.h"
 
@@ -39,4 +39,4 @@ public:
 
 
 
-#endif //TRIANGLE_CALLBACK_H
+#endif //BT_TRIANGLE_CALLBACK_H
index c64ea6e70434f271c8069547454322d6d5b5aed8..9e1544e87a4c9995b14446907170b745d0c3a46e 100644 (file)
@@ -29,9 +29,11 @@ ATTRIBUTE_ALIGNED16( struct) btIndexedMesh
 
    int                     m_numTriangles;
    const unsigned char *   m_triangleIndexBase;
+   // Size in byte of the indices for one triangle (3*sizeof(index_type) if the indices are tightly packed)
    int                     m_triangleIndexStride;
    int                     m_numVertices;
    const unsigned char *   m_vertexBase;
+   // Size of a vertex, in bytes
    int                     m_vertexStride;
 
    // The index type is set when adding an indexed mesh to the
index 282a7702e80709ed0119aa6fbc761dda4d0cca9e..1cea7045f20dda0c2bc0dee1969d5aa27a2dba93 100644 (file)
@@ -61,6 +61,7 @@ struct        btTriangleInfoMap : public btInternalTriangleInfoMap
        btScalar        m_planarEpsilon; ///used to determine if a triangle edge is planar with zero angle
        btScalar        m_equalVertexThreshold; ///used to compute connectivity: if the distance between two vertices is smaller than m_equalVertexThreshold, they are considered to be 'shared'
        btScalar        m_edgeDistanceThreshold; ///used to determine edge contacts: if the closest distance between a contact point and an edge is smaller than this distance threshold it is considered to "hit the edge"
+       btScalar        m_maxEdgeAngleThreshold; //ignore edges that connect triangles at an angle larger than this m_maxEdgeAngleThreshold
        btScalar        m_zeroAreaThreshold; ///used to determine if a triangle is degenerate (length squared of cross product of 2 triangle edges < threshold)
        
        
@@ -71,6 +72,7 @@ struct        btTriangleInfoMap : public btInternalTriangleInfoMap
                m_equalVertexThreshold = btScalar(0.0001)*btScalar(0.0001);
                m_edgeDistanceThreshold = btScalar(0.1);
                m_zeroAreaThreshold = btScalar(0.0001)*btScalar(0.0001);
+               m_maxEdgeAngleThreshold = SIMD_2_PI;
        }
        virtual ~btTriangleInfoMap() {}
 
@@ -83,6 +85,7 @@ struct        btTriangleInfoMap : public btInternalTriangleInfoMap
 
 };
 
+///those fields have to be float and not btScalar for the serialization to work properly
 struct btTriangleInfoData
 {
        int                     m_flags;
index d2624fe18e101eeeccfcea412613acc171dc5502..f623157fac124f2206bfbb754235b32984ac8797 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef TRIANGLE_MESH_H
-#define TRIANGLE_MESH_H
+#ifndef BT_TRIANGLE_MESH_H
+#define BT_TRIANGLE_MESH_H
 
 #include "btTriangleIndexVertexArray.h"
 #include "LinearMath/btVector3.h"
@@ -65,5 +65,5 @@ class btTriangleMesh : public btTriangleIndexVertexArray
                
 };
 
-#endif //TRIANGLE_MESH_H
+#endif //BT_TRIANGLE_MESH_H
 
index 2216698d275f4e09c8b981aeeb3e3239454c9047..c8caf8fe696b342d2471a73115b8cf33f6d2dc4c 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef TRIANGLE_MESH_SHAPE_H
-#define TRIANGLE_MESH_SHAPE_H
+#ifndef BT_TRIANGLE_MESH_SHAPE_H
+#define BT_TRIANGLE_MESH_SHAPE_H
 
 #include "btConcaveShape.h"
 #include "btStridingMeshInterface.h"
@@ -86,4 +86,4 @@ public:
 
 
 
-#endif //TRIANGLE_MESH_SHAPE_H
+#endif //BT_TRIANGLE_MESH_SHAPE_H
index 847147cf6b4be477767e1ea87e2e374a437d0108..71b0557384e6da7bf6fa5eaa37fb76d8a7e0d10e 100644 (file)
@@ -13,8 +13,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef OBB_TRIANGLE_MINKOWSKI_H
-#define OBB_TRIANGLE_MINKOWSKI_H
+#ifndef BT_OBB_TRIANGLE_MINKOWSKI_H
+#define BT_OBB_TRIANGLE_MINKOWSKI_H
 
 #include "btConvexShape.h"
 #include "btBoxShape.h"
@@ -178,5 +178,5 @@ public:
 
 };
 
-#endif //OBB_TRIANGLE_MINKOWSKI_H
+#endif //BT_OBB_TRIANGLE_MINKOWSKI_H
 
index c3b697bdd1e9328260be9a565e91a78c6c588b1e..eed31d839f85bf83eefd5e2e70fc98a555a9562a 100644 (file)
@@ -58,7 +58,7 @@ class CONTACT_KEY_TOKEN_COMP
 {
        public:
 
-               bool operator() ( const CONTACT_KEY_TOKEN& a, const CONTACT_KEY_TOKEN& b )
+               bool operator() ( const CONTACT_KEY_TOKEN& a, const CONTACT_KEY_TOKEN& b ) const
                {
                        return ( a < b );
                }
index ae5d55ab7d9c824c2b4592a031d53e492009a04f..6b6e07c983dde0776229acb522ff90eedd6f5b80 100644 (file)
@@ -21,8 +21,8 @@ subject to the following restrictions:
 3. This notice may not be removed or altered from any source distribution.
 */
 
-#ifndef BVH_CONCAVE_COLLISION_ALGORITHM_H
-#define BVH_CONCAVE_COLLISION_ALGORITHM_H
+#ifndef BT_GIMPACT_BVH_CONCAVE_COLLISION_ALGORITHM_H
+#define BT_GIMPACT_BVH_CONCAVE_COLLISION_ALGORITHM_H
 
 #include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h"
 #include "BulletCollision/BroadphaseCollision/btDispatcher.h"
@@ -303,4 +303,4 @@ public:
 
 
 
-#endif //BVH_CONCAVE_COLLISION_ALGORITHM_H
+#endif //BT_GIMPACT_BVH_CONCAVE_COLLISION_ALGORITHM_H
index e0487c227660969c705933f810df10f10d0e76c4..bd2633cfc591dfbfe512b4fd9a453c6f1a92725d 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef BT_QUANTIZATION_H_INCLUDED
-#define BT_QUANTIZATION_H_INCLUDED
+#ifndef BT_GIMPACT_QUANTIZATION_H_INCLUDED
+#define BT_GIMPACT_QUANTIZATION_H_INCLUDED
 
 /*! \file btQuantization.h
 *\author Francisco Leon Najera
@@ -85,4 +85,4 @@ SIMD_FORCE_INLINE btVector3 bt_unquantize(
 
 
 
-#endif // GIM_VECTOR_H_INCLUDED
+#endif // BT_GIMPACT_QUANTIZATION_H_INCLUDED
index fcc981dfb69d4a3c9df9015c77afd1d7390d1afd..973c2ed1277c4a1a07610329ca7f372d15ca330a 100644 (file)
@@ -22,8 +22,8 @@ subject to the following restrictions:
 */
 
 
-#ifndef TRIANGLE_SHAPE_EX_H
-#define TRIANGLE_SHAPE_EX_H
+#ifndef GIMPACT_TRIANGLE_SHAPE_EX_H
+#define GIMPACT_TRIANGLE_SHAPE_EX_H
 
 #include "BulletCollision/CollisionShapes/btCollisionShape.h"
 #include "BulletCollision/CollisionShapes/btTriangleShape.h"
@@ -177,4 +177,4 @@ public:
 };
 
 
-#endif //TRIANGLE_MESH_SHAPE_H
+#endif //GIMPACT_TRIANGLE_MESH_SHAPE_H
index 9ee83e7d561d9d9af06b911f504e53e2f9c09f49..91fcea57a3c8e4028dee7ff3c9840e8a1af3d2b9 100644 (file)
@@ -22,20 +22,72 @@ subject to the following restrictions:
 
 #include "btGjkPairDetector.h"
 #include "btPointCollector.h"
+#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h"
 
 
 
 btContinuousConvexCollision::btContinuousConvexCollision ( const btConvexShape*        convexA,const btConvexShape*    convexB,btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* penetrationDepthSolver)
 :m_simplexSolver(simplexSolver),
 m_penetrationDepthSolver(penetrationDepthSolver),
-m_convexA(convexA),m_convexB(convexB)
+m_convexA(convexA),m_convexB1(convexB),m_planeShape(0)
 {
 }
 
+
+btContinuousConvexCollision::btContinuousConvexCollision( const btConvexShape* convexA,const btStaticPlaneShape*       plane)
+:m_simplexSolver(0),
+m_penetrationDepthSolver(0),
+m_convexA(convexA),m_convexB1(0),m_planeShape(plane)
+{
+}
+
+
 /// This maximum should not be necessary. It allows for untested/degenerate cases in production code.
 /// You don't want your game ever to lock-up.
 #define MAX_ITERATIONS 64
 
+void btContinuousConvexCollision::computeClosestPoints( const btTransform& transA, const btTransform& transB,btPointCollector& pointCollector)
+{
+       if (m_convexB1)
+       {
+               m_simplexSolver->reset();
+               btGjkPairDetector gjk(m_convexA,m_convexB1,m_convexA->getShapeType(),m_convexB1->getShapeType(),m_convexA->getMargin(),m_convexB1->getMargin(),m_simplexSolver,m_penetrationDepthSolver);               
+               btGjkPairDetector::ClosestPointInput input;
+               input.m_transformA = transA;
+               input.m_transformB = transB;
+               gjk.getClosestPoints(input,pointCollector,0);
+       } else
+       {
+               //convex versus plane
+               const btConvexShape* convexShape = m_convexA;
+               const btStaticPlaneShape* planeShape = m_planeShape;
+               
+               bool hasCollision = false;
+               const btVector3& planeNormal = planeShape->getPlaneNormal();
+               const btScalar& planeConstant = planeShape->getPlaneConstant();
+               
+               btTransform convexWorldTransform = transA;
+               btTransform convexInPlaneTrans;
+               convexInPlaneTrans= transB.inverse() * convexWorldTransform;
+               btTransform planeInConvex;
+               planeInConvex= convexWorldTransform.inverse() * transB;
+               
+               btVector3 vtx = convexShape->localGetSupportingVertex(planeInConvex.getBasis()*-planeNormal);
+
+               btVector3 vtxInPlane = convexInPlaneTrans(vtx);
+               btScalar distance = (planeNormal.dot(vtxInPlane) - planeConstant);
+
+               btVector3 vtxInPlaneProjected = vtxInPlane - distance*planeNormal;
+               btVector3 vtxInPlaneWorld = transB * vtxInPlaneProjected;
+               btVector3 normalOnSurfaceB = transB.getBasis() * planeNormal;
+
+               pointCollector.addContactPoint(
+                       normalOnSurfaceB,
+                       vtxInPlaneWorld,
+                       distance);
+       }
+}
+
 bool   btContinuousConvexCollision::calcTimeOfImpact(
                                const btTransform& fromA,
                                const btTransform& toA,
@@ -44,7 +96,6 @@ bool  btContinuousConvexCollision::calcTimeOfImpact(
                                CastResult& result)
 {
 
-       m_simplexSolver->reset();
 
        /// compute linear and angular velocity for this interval, to interpolate
        btVector3 linVelA,angVelA,linVelB,angVelB;
@@ -53,7 +104,7 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
 
 
        btScalar boundingRadiusA = m_convexA->getAngularMotionDisc();
-       btScalar boundingRadiusB = m_convexB->getAngularMotionDisc();
+       btScalar boundingRadiusB = m_convexB1?m_convexB1->getAngularMotionDisc():0.f;
 
        btScalar maxAngularProjectedVelocity = angVelA.length() * boundingRadiusA + angVelB.length() * boundingRadiusB;
        btVector3 relLinVel = (linVelB-linVelA);
@@ -64,7 +115,6 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
                return false;
 
 
-       btScalar radius = btScalar(0.001);
 
        btScalar lambda = btScalar(0.);
        btVector3 v(1,0,0);
@@ -83,28 +133,14 @@ bool       btContinuousConvexCollision::calcTimeOfImpact(
        //first solution, using GJK
 
 
-       btTransform identityTrans;
-       identityTrans.setIdentity();
-
-       btSphereShape   raySphere(btScalar(0.0));
-       raySphere.setMargin(btScalar(0.));
-
-
+       btScalar radius = 0.001f;
 //     result.drawCoordSystem(sphereTr);
 
        btPointCollector        pointCollector1;
 
        {
-               
-               btGjkPairDetector gjk(m_convexA,m_convexB,m_convexA->getShapeType(),m_convexB->getShapeType(),m_convexA->getMargin(),m_convexB->getMargin(),m_simplexSolver,m_penetrationDepthSolver);          
-               btGjkPairDetector::ClosestPointInput input;
        
-               //we don't use margins during CCD
-       //      gjk.setIgnoreMargin(true);
-
-               input.m_transformA = fromA;
-               input.m_transformB = fromB;
-               gjk.getClosestPoints(input,pointCollector1,0);
+               computeClosestPoints(fromA,fromB,pointCollector1);
 
                hasResult = pointCollector1.m_hasResult;
                c = pointCollector1.m_pointInWorld;
@@ -113,11 +149,12 @@ bool      btContinuousConvexCollision::calcTimeOfImpact(
        if (hasResult)
        {
                btScalar dist;
-               dist = pointCollector1.m_distance;
+               dist = pointCollector1.m_distance + result.m_allowedPenetration;
                n = pointCollector1.m_normalOnBInWorld;
-
                btScalar projectedLinearVelocity = relLinVel.dot(n);
-               
+               if ((projectedLinearVelocity+ maxAngularProjectedVelocity)<=SIMD_EPSILON)
+                       return false;
+
                //not close enough
                while (dist > radius)
                {
@@ -125,19 +162,10 @@ bool      btContinuousConvexCollision::calcTimeOfImpact(
                        {
                                result.m_debugDrawer->drawSphere(c,0.2f,btVector3(1,1,1));
                        }
-                       numIter++;
-                       if (numIter > maxIter)
-                       {
-                               return false; //todo: report a failure
-                       }
                        btScalar dLambda = btScalar(0.);
 
                        projectedLinearVelocity = relLinVel.dot(n);
 
-                       //calculate safe moving fraction from distance / (linear+rotational velocity)
-                       
-                       //btScalar clippedDist  = GEN_min(angularConservativeRadius,dist);
-                       //btScalar clippedDist  = dist;
                        
                        //don't report time of impact for motion away from the contact normal (or causes minor penetration)
                        if ((projectedLinearVelocity+ maxAngularProjectedVelocity)<=SIMD_EPSILON)
@@ -182,37 +210,27 @@ bool      btContinuousConvexCollision::calcTimeOfImpact(
                        result.DebugDraw( lambda );
 
                        btPointCollector        pointCollector;
-                       btGjkPairDetector gjk(m_convexA,m_convexB,m_simplexSolver,m_penetrationDepthSolver);
-                       btGjkPairDetector::ClosestPointInput input;
-                       input.m_transformA = interpolatedTransA;
-                       input.m_transformB = interpolatedTransB;
-                       gjk.getClosestPoints(input,pointCollector,0);
+                       computeClosestPoints(interpolatedTransA,interpolatedTransB,pointCollector);
+
                        if (pointCollector.m_hasResult)
                        {
-                               if (pointCollector.m_distance < btScalar(0.))
-                               {
-                                       //degenerate ?!
-                                       result.m_fraction = lastLambda;
-                                       n = pointCollector.m_normalOnBInWorld;
-                                       result.m_normal=n;//.setValue(1,1,1);// = n;
-                                       result.m_hitPoint = pointCollector.m_pointInWorld;
-                                       return true;
-                               }
+                               dist = pointCollector.m_distance+result.m_allowedPenetration;
                                c = pointCollector.m_pointInWorld;              
                                n = pointCollector.m_normalOnBInWorld;
-                               dist = pointCollector.m_distance;
                        } else
                        {
-                               //??
+                               result.reportFailure(-1, numIter);
                                return false;
                        }
-                       
 
+                       numIter++;
+                       if (numIter > maxIter)
+                       {
+                               result.reportFailure(-2, numIter);
+                               return false;
+                       }
                }
        
-               if ((projectedLinearVelocity+ maxAngularProjectedVelocity)<=result.m_allowedPenetration)//SIMD_EPSILON)
-                       return false;
-                       
                result.m_fraction = lambda;
                result.m_normal = n;
                result.m_hitPoint = c;
@@ -221,16 +239,5 @@ bool       btContinuousConvexCollision::calcTimeOfImpact(
 
        return false;
 
-/*
-//todo:
-       //if movement away from normal, discard result
-       btVector3 move = transBLocalTo.getOrigin() - transBLocalFrom.getOrigin();
-       if (result.m_fraction < btScalar(1.))
-       {
-               if (move.dot(result.m_normal) <= btScalar(0.))
-               {
-               }
-       }
-*/
-
 }
+
index 28c2b4d61564f3eeadadcbc8e81ac1fa294cd89a..bdc0572f75af432cecb8d2f93c0a66cbb3633c66 100644 (file)
@@ -14,13 +14,14 @@ subject to the following restrictions:
 */
 
 
-#ifndef CONTINUOUS_COLLISION_CONVEX_CAST_H
-#define CONTINUOUS_COLLISION_CONVEX_CAST_H
+#ifndef BT_CONTINUOUS_COLLISION_CONVEX_CAST_H
+#define BT_CONTINUOUS_COLLISION_CONVEX_CAST_H
 
 #include "btConvexCast.h"
 #include "btSimplexSolverInterface.h"
 class btConvexPenetrationDepthSolver;
 class btConvexShape;
+class btStaticPlaneShape;
 
 /// btContinuousConvexCollision implements angular and linear time of impact for convex objects.
 /// Based on Brian Mirtich's Conservative Advancement idea (PhD thesis).
@@ -31,13 +32,18 @@ class btContinuousConvexCollision : public btConvexCast
        btSimplexSolverInterface* m_simplexSolver;
        btConvexPenetrationDepthSolver* m_penetrationDepthSolver;
        const btConvexShape*    m_convexA;
-       const btConvexShape*    m_convexB;
+       //second object is either a convex or a plane (code sharing)
+       const btConvexShape*    m_convexB1;
+       const btStaticPlaneShape*       m_planeShape;
 
+       void computeClosestPoints( const btTransform& transA, const btTransform& transB,struct btPointCollector& pointCollector);
 
 public:
 
        btContinuousConvexCollision (const btConvexShape*       shapeA,const btConvexShape*     shapeB ,btSimplexSolverInterface* simplexSolver,btConvexPenetrationDepthSolver* penetrationDepthSolver);
 
+       btContinuousConvexCollision(const btConvexShape*        shapeA,const btStaticPlaneShape*        plane );
+
        virtual bool    calcTimeOfImpact(
                                const btTransform& fromA,
                                const btTransform& toA,
@@ -48,5 +54,6 @@ public:
 
 };
 
-#endif //CONTINUOUS_COLLISION_CONVEX_CAST_H
+
+#endif //BT_CONTINUOUS_COLLISION_CONVEX_CAST_H
 
index b0bce341e4137a8bb28f8c0ea05adc84208653be..bfd79d03beb370675725d10b21695fa838e84ec5 100644 (file)
@@ -14,8 +14,8 @@ subject to the following restrictions:
 */
 
 
-#ifndef CONVEX_CAST_H
-#define CONVEX_CAST_H
+#ifndef BT_CONVEX_CAST_H
+#define BT_CONVEX_CAST_H
 
 #include "LinearMath/btTransform.h"
 #include "LinearMath/btVector3.h"
@@ -39,7 +39,7 @@ public:
                                
                virtual void    DebugDraw(btScalar      fraction) {(void)fraction;}
                virtual void    drawCoordSystem(const btTransform& trans) {(void)trans;}
-
+               virtual void    reportFailure(int errNo, int numIterations) {(void)errNo;(void)numIterations;}
                CastResult()
                        :m_fraction(btScalar(BT_LARGE_FLOAT)),
                        m_debugDrawer(0),
@@ -70,4 +70,4 @@ public:
                                        CastResult& result) = 0;
 };
 
-#endif //CONVEX_CAST_H
+#endif //BT_CONVEX_CAST_H
index 7e3fde8e291dd604a2767d490b004536a243a0e2..72eb5aec461a4094bfdef97b42c85712e4fa0ce7 100644 (file)
@@ -14,8 +14,8 @@ subject to the following restrictions:
 */
 
 
-#ifndef __CONVEX_PENETRATION_DEPTH_H
-#define __CONVEX_PENETRATION_DEPTH_H
+#ifndef BT_CONVEX_PENETRATION_DEPTH_H
+#define BT_CONVEX_PENETRATION_DEPTH_H
 
 class btStackAlloc;
 class btVector3;
@@ -38,5 +38,5 @@ public:
 
 
 };
-#endif //CONVEX_PENETRATION_DEPTH_H
+#endif //BT_CONVEX_PENETRATION_DEPTH_H
 
index bc711ad495c51dd1c437548381db957dd8e624bb..f958cc523efad0edbfdea75adf9572728762b519 100644 (file)
@@ -14,8 +14,9 @@ subject to the following restrictions:
 */
 
 
-#ifndef DISCRETE_COLLISION_DETECTOR1_INTERFACE_H
-#define DISCRETE_COLLISION_DETECTOR1_INTERFACE_H
+#ifndef BT_DISCRETE_COLLISION_DETECTOR1_INTERFACE_H
+#define BT_DISCRETE_COLLISION_DETECTOR1_INTERFACE_H
+
 #include "LinearMath/btTransform.h"
 #include "LinearMath/btVector3.h"
 class btStackAlloc;
@@ -86,4 +87,5 @@ struct btStorageResult : public btDiscreteCollisionDetectorInterface::Result
                }
 };
 
-#endif //DISCRETE_COLLISION_DETECTOR_INTERFACE1_H
+#endif //BT_DISCRETE_COLLISION_DETECTOR1_INTERFACE_H
+
index a977c9e83f7d2ff8f70c009f8f96413f7e02f613..6a42ee63b0350f09db7886f5f9ca96b21d09a82c 100644 (file)
@@ -15,8 +15,8 @@ subject to the following restrictions:
 
 
 
-#ifndef GJK_CONVEX_CAST_H
-#define GJK_CONVEX_CAST_H
+#ifndef BT_GJK_CONVEX_CAST_H
+#define BT_GJK_CONVEX_CAST_H
 
 #include "BulletCollision/CollisionShapes/btCollisionMargin.h"
 
@@ -47,4 +47,4 @@ public:
 
 };
 
-#endif //GJK_CONVEX_CAST_H
+#endif //BT_GJK_CONVEX_CAST_H
index f74261d4b215e51298e40ededd40795a1c1eac78..3268f06c2f92ca9a4db8887c8fbc6c671c46246e 100644 (file)
@@ -511,7 +511,6 @@ namespace gjkepa2_impl
                {
                        btVector3       n;
                        btScalar        d;
-