public virtual PersistentManifold GetNewManifold(CollisionObject b0, CollisionObject b1) { gNumManifold++; CollisionObject body0 = b0; CollisionObject body1 = b1; //optional relative contact breaking threshold, turned on by default (use setDispatcherFlags to switch off feature for improved performance) float contactBreakingThreshold = ((m_dispatcherFlags & DispatcherFlags.CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD) > 0) ? Math.Min(body0.GetCollisionShape().GetContactBreakingThreshold(BulletGlobals.gContactBreakingThreshold), body1.GetCollisionShape().GetContactBreakingThreshold(BulletGlobals.gContactBreakingThreshold)) : BulletGlobals.gContactBreakingThreshold; float contactProcessingThreshold = Math.Min(body0.GetContactProcessingThreshold(), body1.GetContactProcessingThreshold()); // nothing in our pool so create a new one and return it. // need a way to flush the pool ideally PersistentManifold manifold = BulletGlobals.PersistentManifoldPool.Get(); manifold.Initialise(body0, body1, 0, contactBreakingThreshold, contactProcessingThreshold); manifold.m_index1a = m_manifoldsPtr.Count; m_manifoldsPtr.Add(manifold); #if DEBUG if (BulletGlobals.g_streamWriter != null && BulletGlobals.debugDispatcher) { BulletGlobals.g_streamWriter.WriteLine("GetNewManifold[{0}][{1}]", manifold.m_index1a, m_manifoldsPtr.Count); } #endif return(manifold); }