示例#1
0
        public bool LookUpArbiter(RigidBody body1, RigidBody body2, out Arbiter arbiter)
        {
            this.lookUpKey.SetBodies(body1, body2);
            bool flag = !this.dictionaryKeys.ContainsKey(this.lookUpKey);
            bool result;

            if (flag)
            {
                arbiter = null;
                result  = false;
            }
            else
            {
                arbiter = this.dictionaryKeys[this.lookUpKey];
                result  = true;
            }
            return(result);
        }
示例#2
0
        public void ArbiterRemoved(Arbiter arbiter)
        {
            arbiter.body1.arbiters.Remove(arbiter);
            arbiter.body2.arbiters.Remove(arbiter);
            bool flag = arbiter.body1.island != null;

            if (flag)
            {
                arbiter.body1.island.arbiter.Remove(arbiter);
            }
            else
            {
                bool flag2 = arbiter.body2.island != null;
                if (flag2)
                {
                    arbiter.body2.island.arbiter.Remove(arbiter);
                }
            }
            this.RemoveConnection(arbiter.body1, arbiter.body2);
        }
示例#3
0
        public void ArbiterCreated(Arbiter arbiter)
        {
            this.AddConnection(arbiter.body1, arbiter.body2);
            arbiter.body1.arbiters.Add(arbiter);
            arbiter.body2.arbiters.Add(arbiter);
            bool flag = arbiter.body1.island != null;

            if (flag)
            {
                arbiter.body1.island.arbiter.Add(arbiter);
            }
            else
            {
                bool flag2 = arbiter.body2.island != null;
                if (flag2)
                {
                    arbiter.body2.island.arbiter.Add(arbiter);
                }
            }
        }
示例#4
0
        private void UpdateArbiterContacts(Arbiter arbiter)
        {
            bool flag = arbiter.contactList.Count == 0;

            if (flag)
            {
                Stack <Arbiter> obj = this.removedArbiterStack;
                lock (obj)
                {
                    this.removedArbiterStack.Push(arbiter);
                }
            }
            else
            {
                for (int i = arbiter.contactList.Count - 1; i >= 0; i--)
                {
                    Contact contact = arbiter.contactList[i];
                    contact.UpdatePosition();
                    bool flag2 = contact.penetration < -this.contactSettings.breakThreshold;
                    if (flag2)
                    {
                        Contact.Pool.GiveBack(contact);
                        arbiter.contactList.RemoveAt(i);
                    }
                    else
                    {
                        TSVector value;
                        TSVector.Subtract(ref contact.p1, ref contact.p2, out value);
                        FP fP = TSVector.Dot(ref value, ref contact.normal);
                        value -= fP * contact.normal;
                        fP     = value.sqrMagnitude;
                        bool flag3 = fP > this.contactSettings.breakThreshold * this.contactSettings.breakThreshold * 100;
                        if (flag3)
                        {
                            Contact.Pool.GiveBack(contact);
                            arbiter.contactList.RemoveAt(i);
                        }
                    }
                }
            }
        }
示例#5
0
 internal void Remove(Arbiter arbiter)
 {
     this.lookUpKey.SetBodies(arbiter.body1, arbiter.body2);
     this.keysSortedList.Remove(this.lookUpKey);
     this.dictionaryKeys.Remove(this.lookUpKey);
 }
示例#6
0
 internal void Add(ArbiterKey key, Arbiter arbiter)
 {
     this.keysSortedList.Add(key);
     this.dictionaryKeys.Add(key, arbiter);
 }
示例#7
0
        private bool RemoveBody(RigidBody body, bool removeMassPoints)
        {
            bool flag = !removeMassPoints && body.IsParticle;
            bool result;

            if (flag)
            {
                result = false;
            }
            else
            {
                bool flag2 = !this.rigidBodies.Remove(body);
                if (flag2)
                {
                    result = false;
                }
                else
                {
                    int i     = 0;
                    int count = body.arbiters.Count;
                    while (i < count)
                    {
                        Arbiter arbiter = body.arbiters[i];
                        this.arbiterMap.Remove(arbiter);
                        this.events.RaiseBodiesEndCollide(arbiter.body1, arbiter.body2);
                        this.cacheOverPairContact.SetBodies(arbiter.body1, arbiter.body2);
                        this.initialCollisions.Remove(this.cacheOverPairContact);
                        i++;
                    }
                    int j      = 0;
                    int count2 = body.arbitersTrigger.Count;
                    while (j < count2)
                    {
                        Arbiter arbiter2 = body.arbitersTrigger[j];
                        this.arbiterTriggerMap.Remove(arbiter2);
                        bool isColliderOnly = arbiter2.body1.isColliderOnly;
                        if (isColliderOnly)
                        {
                            this.events.RaiseTriggerEndCollide(arbiter2.body1, arbiter2.body2);
                        }
                        else
                        {
                            this.events.RaiseTriggerEndCollide(arbiter2.body2, arbiter2.body1);
                        }
                        this.cacheOverPairContact.SetBodies(arbiter2.body1, arbiter2.body2);
                        this.initialTriggers.Remove(this.cacheOverPairContact);
                        j++;
                    }
                    int k      = 0;
                    int count3 = body.constraints.Count;
                    while (k < count3)
                    {
                        Constraint constraint = body.constraints[k];
                        this.constraints.Remove(constraint);
                        this.events.RaiseRemovedConstraint(constraint);
                        k++;
                    }
                    this.CollisionSystem.RemoveEntity(body);
                    this.islands.RemoveBody(body);
                    this.events.RaiseRemovedRigidBody(body);
                    result = true;
                }
            }
            return(result);
        }
示例#8
0
        private void CollisionDetected(RigidBody body1, RigidBody body2, TSVector point1, TSVector point2, TSVector normal, FP penetration)
        {
            bool       flag    = body1.IsColliderOnly || body2.IsColliderOnly;
            Arbiter    arbiter = null;
            bool       flag2   = flag;
            ArbiterMap arbiterMap;

            if (flag2)
            {
                arbiterMap = this.arbiterTriggerMap;
            }
            else
            {
                arbiterMap = this.arbiterMap;
            }
            bool       flag3 = false;
            ArbiterMap obj   = arbiterMap;

            lock (obj)
            {
                arbiterMap.LookUpArbiter(body1, body2, out arbiter);
                bool flag4 = arbiter == null;
                if (flag4)
                {
                    arbiter       = Arbiter.Pool.GetNew();
                    arbiter.body1 = body1;
                    arbiter.body2 = body2;
                    arbiterMap.Add(new ArbiterKey(body1, body2), arbiter);
                    flag3 = true;
                }
            }
            bool    flag5 = arbiter.body1 == body1;
            Contact contact;

            if (flag5)
            {
                TSVector.Negate(ref normal, out normal);
                contact = arbiter.AddContact(point1, point2, normal, penetration, this.contactSettings);
            }
            else
            {
                contact = arbiter.AddContact(point2, point1, normal, penetration, this.contactSettings);
            }
            bool flag6 = flag3;

            if (flag6)
            {
                bool flag7 = flag;
                if (flag7)
                {
                    this.events.RaiseTriggerBeginCollide(contact);
                    body1.arbitersTrigger.Add(arbiter);
                    body2.arbitersTrigger.Add(arbiter);
                    OverlapPairContact overlapPairContact = new OverlapPairContact(body1, body2);
                    overlapPairContact.contact = contact;
                    this.initialTriggers.Add(overlapPairContact);
                }
                else
                {
                    this.events.RaiseBodiesBeginCollide(contact);
                    this.addedArbiterQueue.Enqueue(arbiter);
                    OverlapPairContact overlapPairContact2 = new OverlapPairContact(body1, body2);
                    overlapPairContact2.contact = contact;
                    this.initialCollisions.Add(overlapPairContact2);
                }
            }
            bool flag8 = !flag && contact != null;

            if (flag8)
            {
                this.events.RaiseContactCreated(contact);
            }
        }
示例#9
0
        private int SortCachedPoints(ref TSVector realRelPos1, FP pen)
        {
            int num = -1;
            FP  y   = pen;

            for (int i = 0; i < 4; i++)
            {
                bool flag = this.contactList[i].penetration > y;
                if (flag)
                {
                    num = i;
                    y   = this.contactList[i].penetration;
                }
            }
            FP   x     = 0;
            FP   y2    = 0;
            FP   z     = 0;
            FP   w     = 0;
            bool flag2 = num != 0;

            if (flag2)
            {
                TSVector tSVector;
                TSVector.Subtract(ref realRelPos1, ref this.contactList[1].relativePos1, out tSVector);
                TSVector tSVector2;
                TSVector.Subtract(ref this.contactList[3].relativePos1, ref this.contactList[2].relativePos1, out tSVector2);
                TSVector tSVector3;
                TSVector.Cross(ref tSVector, ref tSVector2, out tSVector3);
                x = tSVector3.sqrMagnitude;
            }
            bool flag3 = num != 1;

            if (flag3)
            {
                TSVector tSVector4;
                TSVector.Subtract(ref realRelPos1, ref this.contactList[0].relativePos1, out tSVector4);
                TSVector tSVector5;
                TSVector.Subtract(ref this.contactList[3].relativePos1, ref this.contactList[2].relativePos1, out tSVector5);
                TSVector tSVector6;
                TSVector.Cross(ref tSVector4, ref tSVector5, out tSVector6);
                y2 = tSVector6.sqrMagnitude;
            }
            bool flag4 = num != 2;

            if (flag4)
            {
                TSVector tSVector7;
                TSVector.Subtract(ref realRelPos1, ref this.contactList[0].relativePos1, out tSVector7);
                TSVector tSVector8;
                TSVector.Subtract(ref this.contactList[3].relativePos1, ref this.contactList[1].relativePos1, out tSVector8);
                TSVector tSVector9;
                TSVector.Cross(ref tSVector7, ref tSVector8, out tSVector9);
                z = tSVector9.sqrMagnitude;
            }
            bool flag5 = num != 3;

            if (flag5)
            {
                TSVector tSVector10;
                TSVector.Subtract(ref realRelPos1, ref this.contactList[0].relativePos1, out tSVector10);
                TSVector tSVector11;
                TSVector.Subtract(ref this.contactList[2].relativePos1, ref this.contactList[1].relativePos1, out tSVector11);
                TSVector tSVector12;
                TSVector.Cross(ref tSVector10, ref tSVector11, out tSVector12);
                w = tSVector12.sqrMagnitude;
            }
            return(Arbiter.MaxAxis(x, y2, z, w));
        }
示例#10
0
        public void Restore(IWorld iWorld)
        {
            World            world = (World)iWorld;
            List <RigidBody> list  = new List <RigidBody>();

            foreach (RigidBody rigidBody in world.RigidBodies)
            {
                bool flag = !this.clonedPhysics.ContainsKey(rigidBody.GetInstance());
                if (flag)
                {
                    list.Add(rigidBody);
                }
            }
            this.index  = 0;
            this.length = list.Count;
            while (this.index < this.length)
            {
                RigidBody body = list[this.index];
                world.RemoveBody(body);
                this.index++;
            }
            foreach (RigidBody rigidBody2 in world.RigidBodies)
            {
                bool flag2 = this.clonedPhysics.ContainsKey(rigidBody2.GetInstance());
                if (flag2)
                {
                    RigidBodyClone rigidBodyClone = this.clonedPhysics[rigidBody2.GetInstance()];
                    rigidBodyClone.Restore(world, rigidBody2);
                    rigidBody2.island = null;
                    rigidBody2.arbiters.Clear();
                    rigidBody2.arbitersTrigger.Clear();
                }
            }
            foreach (Arbiter current in world.ArbiterMap.Arbiters)
            {
                this.index  = 0;
                this.length = current.contactList.Count;
                while (this.index < this.length)
                {
                    Contact item = current.contactList[this.index];
                    this.contactsToGiveBack.Add(item);
                    this.index++;
                }
                this.arbiterToGiveBack.Add(current);
            }
            world.ArbiterMap.Clear();
            foreach (Arbiter current2 in world.ArbiterTriggerMap.Arbiters)
            {
                foreach (Contact current3 in current2.contactList)
                {
                    this.contactsToGiveBack.Add(current3);
                }
                this.arbiterToGiveBack.Add(current2);
            }
            world.ArbiterTriggerMap.Clear();
            this.index  = 0;
            this.length = world.islands.islands.Count;
            while (this.index < this.length)
            {
                CollisionIsland item2 = world.islands.islands[this.index];
                this.collisionIslandToGiveBack.Add(item2);
                this.index++;
            }
            this.index  = 0;
            this.length = this.clonedArbiters.Count;
            while (this.index < this.length)
            {
                ArbiterClone arbiterClone = this.clonedArbiters[this.index];
                Arbiter      @new         = Arbiter.Pool.GetNew();
                arbiterClone.Restore(@new);
                @new.body1.arbiters.Add(@new);
                @new.body2.arbiters.Add(@new);
                world.ArbiterMap.Add(new ArbiterKey(@new.body1, @new.body2), @new);
                this.index++;
            }
            this.index  = 0;
            this.length = this.clonedArbitersTrigger.Count;
            while (this.index < this.length)
            {
                ArbiterClone arbiterClone2 = this.clonedArbitersTrigger[this.index];
                Arbiter      new2          = Arbiter.Pool.GetNew();
                arbiterClone2.Restore(new2);
                new2.body1.arbitersTrigger.Add(new2);
                new2.body2.arbitersTrigger.Add(new2);
                world.ArbiterTriggerMap.Add(new ArbiterKey(new2.body1, new2.body2), new2);
                this.index++;
            }
            world.islands.islands.Clear();
            this.index  = 0;
            this.length = this.collisionIslands.Count;
            while (this.index < this.length)
            {
                CollisionIslandClone collisionIslandClone = this.collisionIslands[this.index];
                CollisionIsland      new3 = IslandManager.Pool.GetNew();
                collisionIslandClone.Restore(new3, world);
                world.islands.islands.Add(new3);
                this.index++;
            }
            this.cloneCollision.Restore((CollisionSystemPersistentSAP)world.CollisionSystem);
            world.initialCollisions.Clear();
            world.initialCollisions.AddRange(this.clonedInitialCollisions);
            world.initialTriggers.Clear();
            world.initialTriggers.AddRange(this.clonedInitialTriggers);
            RigidBody.instanceCount  = this.rigidBodyInstanceCount;
            Constraint.instanceCount = this.constraintInstanceCount;
            this.index  = 0;
            this.length = this.contactsToGiveBack.Count;
            while (this.index < this.length)
            {
                Contact obj = this.contactsToGiveBack[this.index];
                Contact.Pool.GiveBack(obj);
                this.index++;
            }
            this.contactsToGiveBack.Clear();
            this.index  = 0;
            this.length = this.arbiterToGiveBack.Count;
            while (this.index < this.length)
            {
                Arbiter obj2 = this.arbiterToGiveBack[this.index];
                Arbiter.Pool.GiveBack(obj2);
                this.index++;
            }
            this.arbiterToGiveBack.Clear();
            this.index  = 0;
            this.length = this.collisionIslandToGiveBack.Count;
            while (this.index < this.length)
            {
                CollisionIsland obj3 = this.collisionIslandToGiveBack[this.index];
                IslandManager.Pool.GiveBack(obj3);
                this.index++;
            }
            this.collisionIslandToGiveBack.Clear();
        }