Beispiel #1
0
		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
			   );
		}
Beispiel #2
0
		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 );
			}

		}
Beispiel #4
0
        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;
			}