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); }
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); }
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); } } }
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); } } } } }
internal void Remove(Arbiter arbiter) { this.lookUpKey.SetBodies(arbiter.body1, arbiter.body2); this.keysSortedList.Remove(this.lookUpKey); this.dictionaryKeys.Remove(this.lookUpKey); }
internal void Add(ArbiterKey key, Arbiter arbiter) { this.keysSortedList.Add(key); this.dictionaryKeys.Add(key, arbiter); }
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); }
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); } }
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)); }
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(); }