Esempio n. 1
0
 public ConvexPlaneCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
                                      CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, bool isSwapped,
                                      int numPerturbationIterations, int minimumPointsPerturbationThreshold)
     : base(btConvexPlaneCollisionAlgorithm_new(mf._native, ci._native, body0Wrap._native,
                                                body1Wrap._native, isSwapped, numPerturbationIterations, minimumPointsPerturbationThreshold))
 {
 }
		public ConvexPlaneCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
			CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, bool isSwapped,
			int numPerturbationIterations, int minimumPointsPerturbationThreshold)
			: base(btConvexPlaneCollisionAlgorithm_new(mf._native, ci._native, body0Wrap._native,
				body1Wrap._native, isSwapped, numPerturbationIterations, minimumPointsPerturbationThreshold))
		{
		}
        public SphereTriangleCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
                                                CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, bool swapped)
        {
            IntPtr native = btSphereTriangleCollisionAlgorithm_new(mf.Native, ci.Native,
                                                                   body0Wrap.Native, body1Wrap.Native, swapped);

            InitializeUserOwned(native);
        }
Esempio n. 4
0
        public SoftRigidCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
                                           CollisionObjectWrapper col0, CollisionObjectWrapper col1Wrap, bool isSwapped)
        {
            IntPtr native = btSoftRigidCollisionAlgorithm_new(mf.Native, ci.Native, col0.Native,
                                                              col1Wrap.Native, isSwapped);

            InitializeUserOwned(native);
        }
 public Convex2DConvex2DAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
                                  CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, VoronoiSimplexSolver simplexSolver,
                                  ConvexPenetrationDepthSolver pdSolver, int numPerturbationIterations, int minimumPointsPerturbationThreshold)
     : base(btConvex2dConvex2dAlgorithm_new(mf._native, ci._native, body0Wrap._native,
                                            body1Wrap._native, simplexSolver._native, pdSolver._native, numPerturbationIterations,
                                            minimumPointsPerturbationThreshold))
 {
 }
Esempio n. 6
0
        public SphereSphereCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
                                              CollisionObjectWrapper col0Wrap, CollisionObjectWrapper col1Wrap)
        {
            IntPtr native = btSphereSphereCollisionAlgorithm_new(mf.Native, ci.Native, col0Wrap.Native,
                                                                 col1Wrap.Native);

            InitializeUserOwned(native);
        }
Esempio n. 7
0
        public SoftSoftCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
                                          CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap)
        {
            IntPtr native = btSoftSoftCollisionAlgorithm_new2(mf.Native, ci.Native, body0Wrap.Native,
                                                              body1Wrap.Native);

            InitializeUserOwned(native);
        }
		public Convex2DConvex2DAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
			CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, VoronoiSimplexSolver simplexSolver,
			ConvexPenetrationDepthSolver pdSolver, int numPerturbationIterations, int minimumPointsPerturbationThreshold)
			: base(btConvex2dConvex2dAlgorithm_new(mf._native, ci._native, body0Wrap._native,
				body1Wrap._native, simplexSolver._native, pdSolver._native, numPerturbationIterations,
				minimumPointsPerturbationThreshold))
		{
		}
 public unsafe static void RefreshContactPoints(this PersistentManifold obj, ref OpenTK.Matrix4 trA, ref OpenTK.Matrix4 trB)
 {
     fixed(OpenTK.Matrix4 *trAPtr = &trA)
     {
         fixed(OpenTK.Matrix4 *trBPtr = &trB)
         {
             obj.RefreshContactPoints(ref *(BulletSharp.Math.Matrix *)trAPtr, ref *(BulletSharp.Math.Matrix *)trBPtr);
         }
     }
 }
        protected bool RecoverFromPenetration(CollisionWorld collisionWorld)
        {
            // Here we must refresh the overlapping paircache as the penetrating movement itself or the
            // previous recovery iteration might have used setWorldTransform and pushed us into an object
            // that is not in the previous cache contents from the last timestep, as will happen if we
            // are pushed into a new AABB overlap. Unhandled this means the next convex sweep gets stuck.
            //
            // Do this by calling the broadphase's setAabb with the moved AABB, this will update the broadphase
            // paircache and the ghostobject's internal paircache at the same time.    /BW

            Vector3 minAabb, maxAabb;

            m_convexShape.GetAabb(m_ghostObject.WorldTransform, out minAabb, out maxAabb);
            collisionWorld.Broadphase.SetAabbRef(m_ghostObject.BroadphaseHandle,
                                                 ref minAabb,
                                                 ref maxAabb,
                                                 collisionWorld.Dispatcher);

            bool penetration = false;

            collisionWorld.Dispatcher.DispatchAllCollisionPairs(m_ghostObject.OverlappingPairCache, collisionWorld.DispatchInfo, collisionWorld.Dispatcher);

            m_currentPosition = m_ghostObject.WorldTransform.Origin;

            //  btScalar maxPen = btScalar(0.0);
            for (int i = 0; i < m_ghostObject.OverlappingPairCache.NumOverlappingPairs; i++)
            {
                m_manifoldArray.Clear();

                BroadphasePair collisionPair = m_ghostObject.OverlappingPairCache.OverlappingPairArray[i];

                CollisionObject obj0 = collisionPair.Proxy0.ClientObject as CollisionObject;
                CollisionObject obj1 = collisionPair.Proxy1.ClientObject as CollisionObject;

                if ((obj0 != null && !obj0.HasContactResponse) || (obj1 != null && !obj1.HasContactResponse))
                {
                    continue;
                }

                if (!NeedsCollision(obj0, obj1))
                {
                    continue;
                }

                if (collisionPair.Algorithm != null)
                {
                    collisionPair.Algorithm.GetAllContactManifolds(m_manifoldArray);
                }

                for (int j = 0; j < m_manifoldArray.Count; j++)
                {
                    PersistentManifold manifold = m_manifoldArray[j];
                    float directionSign         = manifold.Body0 == m_ghostObject ? -1.0f : 1.0f;
                    for (int p = 0; p < manifold.NumContacts; p++)
                    {
                        ManifoldPoint pt = manifold.GetContactPoint(p);

                        float dist = pt.Distance;

                        if (dist < -m_maxPenetrationDepth)
                        {
                            // to do: cause problems on slopes, not sure if it is needed
                            //if (dist < maxPen)
                            //{
                            //  maxPen = dist;
                            //  m_touchingNormal = pt.m_normalWorldOnB * directionSign;//??

                            //}
                            m_currentPosition += pt.NormalWorldOnB * directionSign * dist * 0.2f;
                            penetration        = true;
                        }
                        else
                        {
                            //System.Console.WriteLine("touching " + dist);
                        }
                    }

                    //manifold.ClearManifold();
                }
            }
            Matrix newTrans = m_ghostObject.WorldTransform;

            newTrans.Origin = m_currentPosition;
            m_ghostObject.WorldTransform = newTrans;
            //System.Console.WriteLine("m_touchingNormal = " + m_touchingNormal);
            return(penetration);
        }
		public SphereTriangleCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
			CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, bool swapped)
			: base(btSphereTriangleCollisionAlgorithm_new(mf._native, ci._native,
				body0Wrap._native, body1Wrap._native, swapped))
		{
		}
 public SoftSoftCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
                                   CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap)
     : base(btSoftSoftCollisionAlgorithm_new2(mf.Native, ci.Native, body0Wrap.Native,
                                              body1Wrap.Native))
 {
 }
		public SphereSphereCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper col0Wrap, CollisionObjectWrapper col1Wrap)
			: base(btSphereSphereCollisionAlgorithm_new(mf._native, ci._native, col0Wrap._native, col1Wrap._native))
		{
		}
Esempio n. 14
0
 public void ReleaseManifold(PersistentManifold manifold)
 {
     btDispatcher_releaseManifold(_native, manifold._native);
 }
Esempio n. 15
0
 public void ClearManifold(PersistentManifold manifold)
 {
     btDispatcher_clearManifold(_native, manifold._native);
 }
 public abstract void OnVisitPersistentManifold(PersistentManifold pm);
 public SoftRigidCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
                                    CollisionObjectWrapper col0, CollisionObjectWrapper col1Wrap, bool isSwapped)
     : base(btSoftRigidCollisionAlgorithm_new(mf.Native, ci.Native, col0.Native,
                                              col1Wrap.Native, isSwapped))
 {
 }
 public SphereTriangleCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
                                         CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, bool swapped)
     : base(btSphereTriangleCollisionAlgorithm_new(mf._native, ci._native,
                                                   body0Wrap._native, body1Wrap._native, swapped))
 {
 }
        protected bool RecoverFromPenetration(CollisionWorld collisionWorld)
        {
            Vector3 minAabb, maxAabb;

            m_convexShape.GetAabb(m_ghostObject.WorldTransform, out minAabb, out maxAabb);
            collisionWorld.Broadphase.SetAabbRef(m_ghostObject.BroadphaseHandle,
                                                 ref minAabb,
                                                 ref maxAabb,
                                                 collisionWorld.Dispatcher);

            bool penetration = false;

            collisionWorld.Dispatcher.DispatchAllCollisionPairs(m_ghostObject.OverlappingPairCache, collisionWorld.DispatchInfo, collisionWorld.Dispatcher);

            m_currentPosition = m_ghostObject.WorldTransform.Origin;

            float maxPen = 0f;

            for (int i = 0; i < m_ghostObject.OverlappingPairCache.NumOverlappingPairs; i++)
            {
                m_manifoldArray.Clear();

                BroadphasePair collisionPair = m_ghostObject.OverlappingPairCache.OverlappingPairArray[i];

                CollisionObject obj0 = collisionPair.Proxy0.ClientObject as CollisionObject;
                CollisionObject obj1 = collisionPair.Proxy1.ClientObject as CollisionObject;

                if ((obj0 != null && !obj0.HasContactResponse) || (obj1 != null && !obj1.HasContactResponse))
                {
                    continue;
                }

                if (collisionPair.Algorithm != null)
                {
                    collisionPair.Algorithm.GetAllContactManifolds(m_manifoldArray);
                }

                for (int j = 0; j < m_manifoldArray.Count; j++)
                {
                    PersistentManifold manifold = m_manifoldArray[j];
                    float directionSign         = manifold.Body0 == m_ghostObject ? -1f : 1f;
                    for (int p = 0; p < manifold.NumContacts; p++)
                    {
                        ManifoldPoint pt = manifold.GetContactPoint(p);

                        float dist = pt.Distance;

                        if (dist < 0.0f)
                        {
                            if (dist < maxPen)
                            {
                                maxPen           = dist;
                                m_touchingNormal = pt.NormalWorldOnB * directionSign;//??
                            }
                            m_currentPosition += pt.NormalWorldOnB * directionSign * dist * 0.2f;
                            penetration        = true;
                        }
                        else
                        {
                            //printf("touching %f\n", dist);
                        }
                    }

                    //manifold.ClearManifold();
                }
            }
            Matrix newTrans = m_ghostObject.WorldTransform;

            newTrans.Origin = m_currentPosition;
            m_ghostObject.WorldTransform = newTrans;
            //	printf("m_touchingNormal = %f,%f,%f\n",m_touchingNormal[0],m_touchingNormal[1],m_touchingNormal[2]);
            return(penetration);
        }
Esempio n. 20
0
        protected bool RecoverFromPenetration(CollisionWorld collisionWorld)
        {
            Vector3 minAabb, maxAabb;

            m_convexShape.GetAabb(m_ghostObject.WorldTransform, out minAabb, out maxAabb);
            collisionWorld.Broadphase.SetAabbRef(m_ghostObject.BroadphaseHandle,
                                                 ref minAabb,
                                                 ref maxAabb,
                                                 collisionWorld.Dispatcher);

            bool penetration = false;

            collisionWorld.Dispatcher.DispatchAllCollisionPairs(m_ghostObject.OverlappingPairCache, collisionWorld.DispatchInfo, collisionWorld.Dispatcher);

            m_currentPosition = m_ghostObject.WorldTransform.Origin;

            float maxPen = 0f;

            for (int i = 0; i < m_ghostObject.OverlappingPairCache.NumOverlappingPairs; i++)
            {
                m_manifoldArray.Clear();

                BroadphasePair collisionPair = m_ghostObject.OverlappingPairCache.OverlappingPairArray[i];

                CollisionObject obj0 = collisionPair.Proxy0.ClientObject as CollisionObject;
                CollisionObject obj1 = collisionPair.Proxy1.ClientObject as CollisionObject;

                if ((obj0 != null && !obj0.HasContactResponse) || (obj1 != null && !obj1.HasContactResponse))
                {
                    continue;
                }

                collisionPair.GetAllContactManifolds(m_manifoldArray);

                for (int j = 0; j < m_manifoldArray.Count; j++)
                {
                    var manifoldId  = AlignedManifoldArray.btAlignedManifoldArray_at(m_manifoldArray._native, j);
                    var bodyId      = PersistentManifold.btPersistentManifold_getBody0(manifoldId);
                    var numContacts = PersistentManifold.btPersistentManifold_getNumContacts(manifoldId);

                    float directionSign = bodyId == m_ghostObject._native ? -1f : 1f;
                    for (int p = 0; p < numContacts; p++)
                    {
                        var   manifoldPointId = PersistentManifold.btPersistentManifold_getContactPoint(manifoldId, p);
                        float dist            = ManifoldPoint.btManifoldPoint_getDistance(manifoldPointId);
                        if (dist < 0.0f)
                        {
                            Vector3 normalWorldOnB;
                            ManifoldPoint.btManifoldPoint_getNormalWorldOnB(manifoldPointId, out normalWorldOnB);
                            if (dist < maxPen)
                            {
                                maxPen = dist;
                            }

                            var counterPenDir = normalWorldOnB * directionSign;;
                            m_currentPosition += counterPenDir * dist;
                            penetration        = true;
                            if (counterPenDir.Dot(Vector3.UnitY) > 0)
                            {
                                m_verticalVelocity = 0;
                            }
                        }
                    }
                }
            }
            Matrix newTrans = m_ghostObject.WorldTransform;

            newTrans.Origin = m_currentPosition;
            m_ghostObject.WorldTransform = newTrans;
            return(penetration);
        }
Esempio n. 21
0
 public SphereSphereCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
                                       CollisionObjectWrapper col0Wrap, CollisionObjectWrapper col1Wrap)
     : base(btSphereSphereCollisionAlgorithm_new(mf._native, ci._native, col0Wrap._native,
                                                 col1Wrap._native))
 {
 }
 public override void OnVisitPersistentManifold(PersistentManifold pm)
 {
     CollisionObject other;
     if (pm.Body0 == myCollisionObject)
     {
         other = pm.Body1;
     } else
     {
         other = pm.Body0;
     }
     PersistentManifoldList pml;
     if (!otherObjs2ManifoldMap.TryGetValue(other,out pml))
     {
         //todo get from object pool
         pml = new PersistentManifoldList();
         newContacts.Add(pml);
     }
     pml.manifolds.Add(pm);
 }
 public SphereBoxCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
                                    CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, bool isSwapped)
     : base(btSphereBoxCollisionAlgorithm_new(mf.Native, ci.Native, body0Wrap.Native,
                                              body1Wrap.Native, isSwapped))
 {
 }
Esempio n. 24
0
 public void ReleaseManifold(PersistentManifold manifold)
 {
     btDispatcher_releaseManifold(_native, manifold._native);
 }
 public SoftSoftCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap)
     : base(btSoftSoftCollisionAlgorithm_new2(mf._native, ci._native, body0Wrap._native, body1Wrap._native))
 {
 }
Esempio n. 26
0
 public void ClearManifold(PersistentManifold manifold)
 {
     btDispatcher_clearManifold(_native, manifold._native);
 }
Esempio n. 27
0
 public CollisionAlgorithm FindAlgorithm(CollisionObjectWrapper body0Wrap,
                                         CollisionObjectWrapper body1Wrap, PersistentManifold sharedManifold)
 {
     return(new CollisionAlgorithm(btDispatcher_findAlgorithm2(_native, body0Wrap._native, body1Wrap._native, sharedManifold._native)));
 }
Esempio n. 28
0
 public CollisionAlgorithm FindAlgorithm(CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap, PersistentManifold sharedManifold)
 {
     return new CollisionAlgorithm(btDispatcher_findAlgorithm2(_native, body0Wrap._native, body1Wrap._native, sharedManifold._native));
 }
		public SoftRigidCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci, CollisionObjectWrapper col0, CollisionObjectWrapper col1Wrap, bool isSwapped)
			: base(btSoftRigidCollisionAlgorithm_new(mf._native, ci._native, col0._native, col1Wrap._native, isSwapped))
		{
		}
Esempio n. 30
0
 public Box2DBox2DCollisionAlgorithm(PersistentManifold mf, CollisionAlgorithmConstructionInfo ci,
                                     CollisionObjectWrapper body0Wrap, CollisionObjectWrapper body1Wrap)
     : base(btBox2dBox2dCollisionAlgorithm_new2(mf._native, ci._native, body0Wrap._native,
                                                body1Wrap._native))
 {
 }