internal unsafe void ContactTest(PhysicsComponent component) { IntPtr buffer; int bufferSize; collisionWorld.GetCollisions(component.NativeCollisionObject, out buffer, out bufferSize); var contacts = (ContactPoint *)buffer; for (var i = 0; i < bufferSize; i++) { var contact = contacts[i]; currentFrameContacts.Add(contact); } }
unsafe internal void ContactTest(PhysicsComponent component) { foreach (var collision in component.Collisions) { skippedCollisions.Add(collision); } IntPtr buffer; int bufferSize; collisionWorld.GetCollisions(component.NativeCollisionObject, out buffer, out bufferSize); var contacts = (ContactData *)buffer; for (var i = 0; i < bufferSize; i++) { var contact = contacts[i]; var obj0 = BulletSharp.CollisionObject.GetManaged((IntPtr)contact.ColliderA); var obj1 = BulletSharp.CollisionObject.GetManaged((IntPtr)contact.ColliderB); var component0 = (PhysicsComponent)obj0.UserObject; var component1 = (PhysicsComponent)obj1.UserObject; if (((int)component0.CanCollideWith & (int)component1.CollisionGroup) != 0 || ((int)component1.CanCollideWith & (int)component0.CollisionGroup) != 0) { var skip = false; foreach (var collision in component0.Collisions) { if ((collision.ColliderA == component0 && collision.ColliderB == component1) || (collision.ColliderA == component1 && collision.ColliderB == component0)) { var oldContact = collision.Contacts[0]; oldContact.Distance = contact.Distance; oldContact.Normal = new Vector3(contact.NormalX, contact.NormalY, contact.NormalZ); oldContact.PositionOnA = new Vector3(contact.PositionOnAx, contact.PositionOnAy, contact.PositionOnAz); oldContact.PositionOnB = new Vector3(contact.PositionOnBx, contact.PositionOnBy, contact.PositionOnBz); updatedContactsCache.Add(oldContact); skippedCollisions.Remove(collision); skip = true; break; } } if (skip) { continue; } var newCollision = new Collision { Contacts = new TrackingCollection <ContactPoint>(), ColliderA = component0, ColliderB = component1 }; //todo this has to change var newContact = new ContactPoint { Collision = newCollision, Distance = contact.Distance, LifeTime = 0, Normal = new Vector3(contact.NormalX, contact.NormalY, contact.NormalZ), PositionOnA = new Vector3(contact.PositionOnAx, contact.PositionOnAy, contact.PositionOnAz), PositionOnB = new Vector3(contact.PositionOnBx, contact.PositionOnBy, contact.PositionOnBz) }; newCollision.Contacts.Add(newContact); component0.Collisions.Add(newCollision); component1.Collisions.Add(newCollision); newCollisionsCache.Add(newCollision); newContactsFastCache.Add(newContact); newCollisions.Add(newCollision); } } }