internal static bool qsCompare( btBroadphasePair a, btBroadphasePair b ) { int uidA0 = 0;// a.m_pProxy0 != null ? a.m_pProxy0.m_uniqueId : -1; int uidB0 = 0;// b.m_pProxy0 != null ? b.m_pProxy0.m_uniqueId : -1; int uidA1 = 0;// a.m_pProxy1 != null ? a.m_pProxy1.m_uniqueId : -1; int uidB1 = 0;// b.m_pProxy1 != null ? b.m_pProxy1.m_uniqueId : -1; return uidA0 > uidB0 || ( a.m_pProxy0.Equals( b.m_pProxy0 ) && uidA1 > uidB1 ) || ( a.m_pProxy0 == b.m_pProxy0 && a.m_pProxy1 == b.m_pProxy1 && a.m_algorithm != b.m_algorithm ); }
internal bool Equals( btBroadphasePair a, btBroadphasePair b ) { return ( ( a.m_pProxy0 == b.m_pProxy0 ) && ( a.m_pProxy1 == b.m_pProxy1 ) ) || ( ( a.m_pProxy0 == b.m_pProxy1 ) && ( a.m_pProxy1 == b.m_pProxy0 ) ) ; }
//by default, Bullet will use this near callback void defaultNearCallback( btBroadphasePair collisionPair, btCollisionDispatcher dispatcher, btDispatcherInfo dispatchInfo ) { btCollisionObject colObj0 = (btCollisionObject)collisionPair.m_pProxy0.m_clientObject; btCollisionObject colObj1 = (btCollisionObject)collisionPair.m_pProxy1.m_clientObject; if( dispatcher.needsCollision( colObj0, colObj1 ) ) { btCollisionObjectWrapper obj0Wrap = BulletGlobals.CollisionObjectWrapperPool.Get(); obj0Wrap.Initialize( null, colObj0.getCollisionShape(), colObj0, -1, -1 ); btCollisionObjectWrapper obj1Wrap = BulletGlobals.CollisionObjectWrapperPool.Get(); obj1Wrap.Initialize( null, colObj1.getCollisionShape(), colObj1, -1, -1 ); //dispatcher will keep algorithms persistent in the collision pair if( collisionPair.m_algorithm == null ) { collisionPair.m_algorithm = dispatcher.findAlgorithm( obj0Wrap, obj1Wrap ); } if( collisionPair.m_algorithm != null ) { btManifoldResult contactPointResult = BulletGlobals.ManifoldResultPool.Get(); contactPointResult.Initialize( obj0Wrap, obj1Wrap ); if( dispatchInfo.m_dispatchFunc == btDispatcherInfo.DispatchFunc.DISPATCH_DISCRETE ) { //discrete collision detection query collisionPair.m_algorithm.processCollision( obj0Wrap , ref obj0Wrap.m_collisionObject.m_worldTransform , obj1Wrap , ref obj1Wrap.m_collisionObject.m_worldTransform , dispatchInfo, contactPointResult ); } else { //continuous collision detection query, time of impact (toi) double toi = collisionPair.m_algorithm.calculateTimeOfImpact( colObj0, colObj1, dispatchInfo, contactPointResult ); if( dispatchInfo.m_timeOfImpact > toi ) dispatchInfo.m_timeOfImpact = toi; } BulletGlobals.ManifoldResultPool.Free( contactPointResult ); } BulletGlobals.CollisionObjectWrapperPool.Free( obj0Wrap ); BulletGlobals.CollisionObjectWrapperPool.Free( obj1Wrap ); } }
internal btBroadphasePair( ref btBroadphasePair other ) { m_pProxy0 = other.m_pProxy0; m_pProxy1 = other.m_pProxy1; m_algorithm = other.m_algorithm; m_internalInfo1 = other.m_internalInfo1; }
public bool processOverlap( btBroadphasePair pair ) { m_dispatcher.m_nearCallback( pair, m_dispatcher, m_dispatchInfo ); return false; }