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); } }
internal void PropagateOnContactEnd(CollisionArgs args) { var e = PrivateOnContactEnd; if (e == null) { return; } e(this, args); }
internal void OnContactChange(CollisionArgs args) { var e = PrivateContactChange; if (e == null) { return; } e(this, args); }
internal void PropagateOnFirstContactBegin(CollisionArgs args) { var e = PrivateOnFirstContactBegin; if (e == null) { return; } e(this, args); }
internal void OnLastContactEnd(CollisionArgs args) { var e = PrivateLastContactEnd; if (e == null) { return; } e(this, args); }
internal void OnFirstContactStart(CollisionArgs args) { var e = PrivateFirstContactBegin; if (e == null) { return; } e(this, args); }
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); }
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; } }
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); } } }
internal void OnContactEnd(CollisionArgs args) { var e = PrivateContactEnd; if (e == null) return; e(this, args); }
internal void OnFirstContactStart(CollisionArgs args) { var e = PrivateFirstContactBegin; if (e == null) return; e(this, args); }
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); } } }
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); } }