예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
                }
            }
        }