Exemple #1
0
        /// <summary>
        /// Finds any robot collisions and adds them to the list of contact points.
        /// </summary>
        /// <param name="pm"></param>
        public void OnVisitPersistentManifold(PersistentManifold pm)
        {
            if (!mainState.Tracking)
            {
                return;
            }

            if (framesPassed == -1)
            {
                framesPassed = physicsWorld.frameCount - lastFrameCount;

                for (int i = 0; i < framesPassed; i++)
                {
                    ContactPoints.Add(new List <ContactDescriptor>());
                }
            }

            BRigidBody obA         = pm.Body0.UserObject as BRigidBody;
            BRigidBody obB         = pm.Body1.UserObject as BRigidBody;
            BRigidBody robotBody   = obA != null && obA.gameObject.name.StartsWith("node") ? obA : obB != null && obB.gameObject.name.StartsWith("node") ? obB : null;
            int        numContacts = pm.NumContacts;

            if (robotBody == null || numContacts < 1)
            {
                return;
            }

            for (int i = 0; i < Math.Min(framesPassed, numContacts); i++)
            {
                ManifoldPoint mp = pm.GetContactPoint(i);

                ContactDescriptor cd = new ContactDescriptor
                {
                    AppliedImpulse = mp.AppliedImpulse,
                    Position       = (mp.PositionWorldOnA + mp.PositionWorldOnB) * 0.5f,
                    RobotBody      = robotBody
                };

                if (ContactPoints[i] != null)
                {
                    ContactPoints[i].Add(cd);
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// Generates contact information from the given byte buffer.
        /// </summary>
        /// <param name="buffer"></param>
        /// <returns></returns>
        private static List <List <KeyValuePair <ContactDescriptor, int> > > ReadContactDescriptors(byte[] buffer)
        {
            IFormatter formatter = new BinaryFormatter();

            List <List <KeyValuePair <ContactDescriptor, int> > > contacts = new List <List <KeyValuePair <ContactDescriptor, int> > >();

            BinaryReader reader = new BinaryReader(new MemoryStream(buffer));

            int numContactLists = reader.ReadInt32();

            for (int i = 0; i < numContactLists; i++)
            {
                int contactCount = reader.ReadInt32();

                if (contactCount > 0)
                {
                    List <KeyValuePair <ContactDescriptor, int> > currentContacts = new List <KeyValuePair <ContactDescriptor, int> >();

                    for (int j = 0; j < contactCount; j++)
                    {
                        ContactDescriptor contact = new ContactDescriptor
                        {
                            AppliedImpulse = reader.ReadSingle(),
                            Position       = (BulletSharp.Math.Vector3)formatter.Deserialize(reader.BaseStream)
                        };

                        currentContacts.Add(new KeyValuePair <ContactDescriptor, int>(contact, reader.ReadInt32()));
                    }

                    contacts.Add(currentContacts);
                }
                else
                {
                    contacts.Add(null);
                }
            }

            return(contacts);
        }