Пример #1
0
        private void PersistentManifoldContactDestroyed(object userPersistantData)
        {
            var contact = (Contact)userPersistantData;
            var args    = new CollisionArgs {
                Contact = contact
            };

            var colA = contact.ColliderA;
            var colB = contact.ColliderB;

            colA.Contacts.Remove(contact);
            colB.Contacts.Remove(contact);

            var colAEnded         = false;
            var previousColAState = colA.Contacts.Where(x => (x.ColliderA == colA && x.ColliderB == colB) || (x.ColliderA == colB && x.ColliderB == colA));

            if (!previousColAState.Any())
            {
                colAEnded = true;
            }

            var colBEnded         = false;
            var previousColBState = colB.Contacts.Where(x => (x.ColliderB == colB && x.ColliderA == colA) || (x.ColliderB == colA && x.ColliderA == colB));

            if (!previousColBState.Any())
            {
                colBEnded = true;
            }

            if (CacheContacts)
            {
                contactsCache.Add(new ContactEventData
                {
                    Type   = colAEnded ? ContactEventType.LastContactEnd : ContactEventType.ContactEnd,
                    Caller = colA,
                    Args   = args
                });

                contactsCache.Add(new ContactEventData
                {
                    Type   = colBEnded ? ContactEventType.LastContactEnd : ContactEventType.ContactEnd,
                    Caller = colB,
                    Args   = args
                });
            }
            else
            {
                if (colAEnded)
                {
                    colA.OnLastContactEnd(args);
                }
                colA.OnContactEnd(args);

                if (colBEnded)
                {
                    colB.OnLastContactEnd(args);
                }
                colB.OnContactEnd(args);
            }
        }
Пример #2
0
        internal void PropagateOnContactEnd(CollisionArgs args)
        {
            var e = PrivateOnContactEnd;

            if (e == null)
            {
                return;
            }
            e(this, args);
        }
Пример #3
0
        internal void OnContactChange(CollisionArgs args)
        {
            var e = PrivateContactChange;

            if (e == null)
            {
                return;
            }
            e(this, args);
        }
Пример #4
0
        internal void PropagateOnFirstContactBegin(CollisionArgs args)
        {
            var e = PrivateOnFirstContactBegin;

            if (e == null)
            {
                return;
            }
            e(this, args);
        }
Пример #5
0
        internal void OnLastContactEnd(CollisionArgs args)
        {
            var e = PrivateLastContactEnd;

            if (e == null)
            {
                return;
            }
            e(this, args);
        }
Пример #6
0
        internal void OnFirstContactStart(CollisionArgs args)
        {
            var e = PrivateFirstContactBegin;

            if (e == null)
            {
                return;
            }
            e(this, args);
        }
Пример #7
0
        static void PersistentManifoldContactDestroyed(object userPersistantData)
        {
            var contact = (Contact)userPersistantData;
            var args    = new CollisionArgs {
                Contact = contact
            };

            var colA = contact.ColliderA;
            var colB = contact.ColliderB;

            colA.Contacts.Remove(contact);
            colB.Contacts.Remove(contact);

            var colAEnded         = false;
            var previousColAState = colA.Contacts.Where(x => (x.ColliderA == colA && x.ColliderB == colB) || (x.ColliderA == colB && x.ColliderB == colA));

            if (!previousColAState.Any())
            {
                colAEnded = true;
            }

            var colBEnded         = false;
            var previousColBState = colB.Contacts.Where(x => (x.ColliderB == colB && x.ColliderA == colA) || (x.ColliderB == colA && x.ColliderA == colB));

            if (!previousColBState.Any())
            {
                colBEnded = true;
            }

            if (colAEnded)
            {
                colA.PropagateOnLastContactEnd(args);
            }
            colA.PropagateOnContactEnd(args);

            if (colBEnded)
            {
                colB.PropagateOnLastContactEnd(args);
            }
            colB.PropagateOnContactEnd(args);
        }
Пример #8
0
 void playerController_OnFirstContactBegin(object sender, CollisionArgs e)
 {
     // Stop if we collide from sides
     if (e.Contact.Normal.X < -0.5f || e.Contact.Normal.X > 0.5f)
     {
         movingToTarget = false;
     }
 }
Пример #9
0
        private void PersistentManifoldContactProcessed(BulletSharp.ManifoldPoint cp, BulletSharp.CollisionObject body0, BulletSharp.CollisionObject body1)
        {
            var colA = (Collider)body0.UserObject;
            var colB = (Collider)body1.UserObject;

            if (!colA.NeedsCollisionCheck && !colB.NeedsCollisionCheck)
            {
                return;                        //don't process at all if both the objects don't need any collision event
            }
            if (cp.UserPersistentData == null) //New contact!
            {
                var contact = new Contact
                {
                    ColliderA   = colA,
                    ColliderB   = colB,
                    Distance    = cp.Distance,
                    PositionOnA = new Vector3(cp.PositionWorldOnA.X, cp.PositionWorldOnA.Y, cp.PositionWorldOnA.Z),
                    PositionOnB = new Vector3(cp.PositionWorldOnB.X, cp.PositionWorldOnB.Y, cp.PositionWorldOnB.Z),
                    Normal      = new Vector3(cp.NormalWorldOnB.X, cp.NormalWorldOnB.Y, cp.NormalWorldOnB.Z)
                };

                //must figure if we are a really brand new collision for correct event propagation
                var colABegan         = false;
                var previousColAState = colA.Contacts.Where(x => (x.ColliderA == colA && x.ColliderB == colB) || (x.ColliderA == colB && x.ColliderB == colA));
                if (!previousColAState.Any())
                {
                    colABegan = true;
                }

                var colBBegan         = false;
                var previousColBState = colB.Contacts.Where(x => (x.ColliderB == colB && x.ColliderA == colA) || (x.ColliderB == colA && x.ColliderA == colB));
                if (!previousColBState.Any())
                {
                    colBBegan = true;
                }

                colA.Contacts.Add(contact);
                colB.Contacts.Add(contact);

                var args = new CollisionArgs {
                    Contact = contact
                };

                cp.UserPersistentData = contact;

                if (CacheContacts)
                {
                    contactsCache.Add(new ContactEventData
                    {
                        Type   = colABegan ? ContactEventType.FirstContactStart : ContactEventType.ContactStart,
                        Caller = colA,
                        Args   = args
                    });

                    contactsCache.Add(new ContactEventData
                    {
                        Type   = colBBegan ? ContactEventType.FirstContactStart : ContactEventType.ContactStart,
                        Caller = colB,
                        Args   = args
                    });
                }
                else
                {
                    if (colABegan)
                    {
                        colA.OnFirstContactStart(args);
                    }
                    colA.OnContactStart(args);

                    if (colBBegan)
                    {
                        colB.OnFirstContactStart(args);
                    }
                    colB.OnContactStart(args);
                }
            }
            else
            {
                var contact = (Contact)cp.UserPersistentData;

                contact.Distance    = cp.Distance;
                contact.PositionOnA = new Vector3(cp.PositionWorldOnA.X, cp.PositionWorldOnA.Y, cp.PositionWorldOnA.Z);
                contact.PositionOnB = new Vector3(cp.PositionWorldOnB.X, cp.PositionWorldOnB.Y, cp.PositionWorldOnB.Z);
                contact.Normal      = new Vector3(cp.NormalWorldOnB.X, cp.NormalWorldOnB.Y, cp.NormalWorldOnB.Z);

                var args = new CollisionArgs {
                    Contact = contact
                };

                if (CacheContacts)
                {
                    contactsCache.Add(new ContactEventData
                    {
                        Type   = ContactEventType.ContactChange,
                        Caller = colA,
                        Args   = args
                    });

                    contactsCache.Add(new ContactEventData
                    {
                        Type   = ContactEventType.ContactChange,
                        Caller = colB,
                        Args   = args
                    });
                }
                else
                {
                    colA.OnContactChange(args);
                    colB.OnContactChange(args);
                }
            }
        }
Пример #10
0
 internal void OnContactEnd(CollisionArgs args)
 {
     var e = PrivateContactEnd;
     if (e == null) return;
     e(this, args);
 }
Пример #11
0
 internal void OnFirstContactStart(CollisionArgs args)
 {
     var e = PrivateFirstContactBegin;
     if (e == null) return;
     e(this, args);
 }
Пример #12
0
        private void PersistentManifoldContactProcessed(BulletSharp.ManifoldPoint cp, BulletSharp.CollisionObject body0, BulletSharp.CollisionObject body1)
        {
            var colA = (Collider)body0.UserObject;
            var colB = (Collider)body1.UserObject;

            if (!colA.NeedsCollisionCheck && !colB.NeedsCollisionCheck) return; //don't process at all if both the objects don't need any collision event

            if (cp.UserPersistentData == null) //New contact!
            {
                var contact = new Contact
                {
                    ColliderA = colA,
                    ColliderB = colB,
                    Distance = cp.Distance,
                    PositionOnA = new Vector3(cp.PositionWorldOnA.X, cp.PositionWorldOnA.Y, cp.PositionWorldOnA.Z),
                    PositionOnB = new Vector3(cp.PositionWorldOnB.X, cp.PositionWorldOnB.Y, cp.PositionWorldOnB.Z),
                    Normal = new Vector3(cp.NormalWorldOnB.X, cp.NormalWorldOnB.Y, cp.NormalWorldOnB.Z)
                };

                //must figure if we are a really brand new collision for correct event propagation
                var colABegan = false;
                var previousColAState = colA.Contacts.Where(x => (x.ColliderA == colA && x.ColliderB == colB) || (x.ColliderA == colB && x.ColliderB == colA));
                if (!previousColAState.Any()) colABegan = true;

                var colBBegan = false;
                var previousColBState = colB.Contacts.Where(x => (x.ColliderB == colB && x.ColliderA == colA) || (x.ColliderB == colA && x.ColliderA == colB));
                if (!previousColBState.Any()) colBBegan = true;

                colA.Contacts.Add(contact);
                colB.Contacts.Add(contact);

                var args = new CollisionArgs { Contact = contact };

                cp.UserPersistentData = contact;

                if (CacheContacts)
                {
                    contactsCache.Add(new ContactEventData
                    {
                        Type = colABegan ? ContactEventType.FirstContactStart : ContactEventType.ContactStart,
                        Caller = colA,
                        Args = args
                    });

                    contactsCache.Add(new ContactEventData
                    {
                        Type = colBBegan ? ContactEventType.FirstContactStart : ContactEventType.ContactStart,
                        Caller = colB,
                        Args = args
                    });
                }
                else
                {
                    if (colABegan) colA.OnFirstContactStart(args);
                    colA.OnContactStart(args);

                    if (colBBegan) colB.OnFirstContactStart(args);
                    colB.OnContactStart(args);
                }
            }
            else
            {
                var contact = (Contact)cp.UserPersistentData;

                contact.Distance = cp.Distance;
                contact.PositionOnA = new Vector3(cp.PositionWorldOnA.X, cp.PositionWorldOnA.Y, cp.PositionWorldOnA.Z);
                contact.PositionOnB = new Vector3(cp.PositionWorldOnB.X, cp.PositionWorldOnB.Y, cp.PositionWorldOnB.Z);
                contact.Normal = new Vector3(cp.NormalWorldOnB.X, cp.NormalWorldOnB.Y, cp.NormalWorldOnB.Z);

                var args = new CollisionArgs { Contact = contact };

                if (CacheContacts)
                {
                    contactsCache.Add(new ContactEventData
                    {
                        Type = ContactEventType.ContactChange,
                        Caller = colA,
                        Args = args
                    });

                    contactsCache.Add(new ContactEventData
                    {
                        Type = ContactEventType.ContactChange,
                        Caller = colB,
                        Args = args
                    });
                }
                else
                {
                    colA.OnContactChange(args);
                    colB.OnContactChange(args);
                }
            }
        }
Пример #13
0
        private void PersistentManifoldContactDestroyed(object userPersistantData)
        {
            var contact = (Contact)userPersistantData;
            var args = new CollisionArgs { Contact = contact };

            var colA = contact.ColliderA;
            var colB = contact.ColliderB;

            colA.Contacts.Remove(contact);
            colB.Contacts.Remove(contact);

            var colAEnded = false;
            var previousColAState = colA.Contacts.Where(x => (x.ColliderA == colA && x.ColliderB == colB) || (x.ColliderA == colB && x.ColliderB == colA));
            if (!previousColAState.Any()) colAEnded = true;

            var colBEnded = false;
            var previousColBState = colB.Contacts.Where(x => (x.ColliderB == colB && x.ColliderA == colA) || (x.ColliderB == colA && x.ColliderA == colB));
            if (!previousColBState.Any()) colBEnded = true;

            if (CacheContacts)
            {
                contactsCache.Add(new ContactEventData
                {
                    Type = colAEnded ? ContactEventType.LastContactEnd : ContactEventType.ContactEnd,
                    Caller = colA,
                    Args = args
                });

                contactsCache.Add(new ContactEventData
                {
                    Type = colBEnded ? ContactEventType.LastContactEnd : ContactEventType.ContactEnd,
                    Caller = colB,
                    Args = args
                });
            }
            else
            {
                if (colAEnded) colA.OnLastContactEnd(args);
                colA.OnContactEnd(args);

                if (colBEnded) colB.OnLastContactEnd(args);
                colB.OnContactEnd(args);
            }
        }