2015-04-28 01:35:07 +00:00
/*
Bullet Continuous Collision Detection and Physics Library
Copyright ( c ) 2003 - 2006 Erwin Coumans http : //continuousphysics.com/Bullet/
This software is provided ' as - is ' , without any express or implied warranty .
In no event will the authors be held liable for any damages arising from the use of this software .
Permission is granted to anyone to use this software for any purpose ,
including commercial applications , and to alter it and redistribute it freely ,
subject to the following restrictions :
1. The origin of this software must not be misrepresented ; you must not claim that you wrote the original software . If you use this software in a product , an acknowledgment in the product documentation would be appreciated but is not required .
2. Altered source versions must be plainly marked as such , and must not be misrepresented as being the original software .
3. This notice may not be removed or altered from any source distribution .
*/
# ifndef BT_CONVEX_CONVEX_MPR_ALGORITHM_H
# define BT_CONVEX_CONVEX_MPR_ALGORITHM_H
# include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h"
# include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
# include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
# include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
# include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
# include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h"
# include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
2018-09-23 21:17:31 +00:00
# include "LinearMath/btTransformUtil.h" //for btConvexSeparatingDistanceUtil
2015-04-28 01:35:07 +00:00
class btConvexPenetrationDepthSolver ;
///Enabling USE_SEPDISTANCE_UTIL2 requires 100% reliable distance computation. However, when using large size ratios GJK can be imprecise
///so the distance is not conservative. In that case, enabling this USE_SEPDISTANCE_UTIL2 would result in failing/missing collisions.
///Either improve GJK for large size ratios (testing a 100 units versus a 0.1 unit object) or only enable the util
///for certain pairs that have a small size ratio
///The convexConvexAlgorithm collision algorithm implements time of impact, convex closest points and penetration depth calculations between two convex objects.
///Multiple contact points are calculated by perturbing the orientation of the smallest object orthogonal to the separating normal.
///This idea was described by Gino van den Bergen in this forum topic http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=4&t=288&p=888#p888
class btConvexConvexMprAlgorithm : public btActivatingCollisionAlgorithm
{
2018-09-23 21:17:31 +00:00
bool m_ownManifold ;
btPersistentManifold * m_manifoldPtr ;
2015-04-28 01:35:07 +00:00
///cache separating vector to speedup collision detection
2018-09-23 21:17:31 +00:00
public :
btConvexConvexMprAlgorithm ( btPersistentManifold * mf , const btCollisionAlgorithmConstructionInfo & ci , const btCollisionObjectWrapper * body0Wrap , const btCollisionObjectWrapper * body1Wrap ) ;
2015-04-28 01:35:07 +00:00
virtual ~ btConvexConvexMprAlgorithm ( ) ;
2018-09-23 21:17:31 +00:00
virtual void processCollision ( const btCollisionObjectWrapper * body0Wrap , const btCollisionObjectWrapper * body1Wrap , const btDispatcherInfo & dispatchInfo , btManifoldResult * resultOut ) ;
2015-04-28 01:35:07 +00:00
2018-09-23 21:17:31 +00:00
virtual btScalar calculateTimeOfImpact ( btCollisionObject * body0 , btCollisionObject * body1 , const btDispatcherInfo & dispatchInfo , btManifoldResult * resultOut ) ;
2015-04-28 01:35:07 +00:00
2018-09-23 21:17:31 +00:00
virtual void getAllContactManifolds ( btManifoldArray & manifoldArray )
2015-04-28 01:35:07 +00:00
{
///should we use m_ownManifold to avoid adding duplicates?
if ( m_manifoldPtr & & m_ownManifold )
manifoldArray . push_back ( m_manifoldPtr ) ;
}
2018-09-23 21:17:31 +00:00
const btPersistentManifold * getManifold ( )
2015-04-28 01:35:07 +00:00
{
return m_manifoldPtr ;
}
2018-09-23 21:17:31 +00:00
struct CreateFunc : public btCollisionAlgorithmCreateFunc
2015-04-28 01:35:07 +00:00
{
CreateFunc ( ) ;
2018-09-23 21:17:31 +00:00
2015-04-28 01:35:07 +00:00
virtual ~ CreateFunc ( ) ;
2018-09-23 21:17:31 +00:00
virtual btCollisionAlgorithm * CreateCollisionAlgorithm ( btCollisionAlgorithmConstructionInfo & ci , const btCollisionObjectWrapper * body0Wrap , const btCollisionObjectWrapper * body1Wrap )
2015-04-28 01:35:07 +00:00
{
void * mem = ci . m_dispatcher1 - > allocateCollisionAlgorithm ( sizeof ( btConvexConvexMprAlgorithm ) ) ;
2018-09-23 21:17:31 +00:00
return new ( mem ) btConvexConvexMprAlgorithm ( ci . m_manifold , ci , body0Wrap , body1Wrap ) ;
2015-04-28 01:35:07 +00:00
}
} ;
} ;
2018-09-23 21:17:31 +00:00
# endif //BT_CONVEX_CONVEX_MPR_ALGORITHM_H