void AddToActive(CollisionSkin cs, SkinTester st) { int n = active_.Count; float xMin = cs.WorldBoundingBox.Min.X; bool active = (cs.Owner != null) && cs.Owner.IsActive; for (int i = 0; i != n;) { CollisionSkin asi = active_[i]; if (asi.WorldBoundingBox.Max.X < xMin) { // prune no longer interesting boxes from potential overlaps --n; active_.RemoveAt(i); } else { bool active2 = active || (active_[i].Owner != null && asi.Owner.IsActive); if (active2 && BoundingBoxHelper.OverlapTest(ref cs.WorldBoundingBox, ref asi.WorldBoundingBox)) { if (active) { st.TestSkin(cs, asi); } else { st.TestSkin(asi, cs); } } ++i; } } active_.Add(cs); }
/// <summary> /// AddToActive /// </summary> /// <param name="cs"></param> /// <param name="st"></param> void AddToActive(CollisionSkin cs, SkinTester st) { int n = active_.Count; float xMin = cs.WorldBoundingBox.Min.X; bool active = (cs.Owner != null) && cs.Owner.IsActive; // BEN-OPTIMISATION: unsafe i.e. Remove array boundary checks. #if !WINDOWS_PHONE unsafe { #endif CollisionSkin asi; for (int i = 0; i != n;) { asi = active_[i]; if (asi.WorldBoundingBox.Max.X < xMin) { // prune no longer interesting boxes from potential overlaps --n; active_.RemoveAt(i); } else { // BEN-OPTIMISATION: Inlined BoundingBoxHelper.OverlapTest() and removed two redundant // comparisons the X comparison and the extra "if (active)" which can // be removed by rearranging. if (active) { if (!((cs.WorldBoundingBox.Min.Z >= asi.WorldBoundingBox.Max.Z) || (cs.WorldBoundingBox.Max.Z <= asi.WorldBoundingBox.Min.Z) || (cs.WorldBoundingBox.Min.Y >= asi.WorldBoundingBox.Max.Y) || (cs.WorldBoundingBox.Max.Y <= asi.WorldBoundingBox.Min.Y) || (cs.WorldBoundingBox.Max.X <= asi.WorldBoundingBox.Min.X))) { st.TestSkin(cs, asi); } } else if (active_[i].Owner != null && asi.Owner.IsActive && !((cs.WorldBoundingBox.Min.Z >= asi.WorldBoundingBox.Max.Z) || (cs.WorldBoundingBox.Max.Z <= asi.WorldBoundingBox.Min.Z) || (cs.WorldBoundingBox.Min.Y >= asi.WorldBoundingBox.Max.Y) || (cs.WorldBoundingBox.Max.Y <= asi.WorldBoundingBox.Min.Y) || (cs.WorldBoundingBox.Max.X <= asi.WorldBoundingBox.Min.X))) { st.TestSkin(asi, cs); } ++i; } } #if !WINDOWS_PHONE } // unsafe #endif active_.Add(cs); }
private void AddToActive(CollisionSkin cs, SkinTester st) { var n = active_.Count; var xMin = cs.WorldBoundingBox.Min.X; var active = cs.Owner != null && cs.Owner.IsActive; unsafe { CollisionSkin asi; for (var i = 0; i != n;) { asi = active_[i]; if (asi.WorldBoundingBox.Max.X < xMin) { --n; active_.RemoveAt(i); } else { if (active) { if (!(cs.WorldBoundingBox.Min.Z >= asi.WorldBoundingBox.Max.Z || cs.WorldBoundingBox.Max.Z <= asi.WorldBoundingBox.Min.Z || cs.WorldBoundingBox.Min.Y >= asi.WorldBoundingBox.Max.Y || cs.WorldBoundingBox.Max.Y <= asi.WorldBoundingBox.Min.Y || cs.WorldBoundingBox.Max.X <= asi.WorldBoundingBox.Min.X)) { st.TestSkin(cs, asi); } } else if (active_[i].Owner != null && asi.Owner.IsActive && !(cs.WorldBoundingBox.Min.Z >= asi.WorldBoundingBox.Max.Z || cs.WorldBoundingBox.Max.Z <= asi.WorldBoundingBox.Min.Z || cs.WorldBoundingBox.Min.Y >= asi.WorldBoundingBox.Max.Y || cs.WorldBoundingBox.Max.Y <= asi.WorldBoundingBox.Min.Y || cs.WorldBoundingBox.Max.X <= asi.WorldBoundingBox.Min.X)) { st.TestSkin(asi, cs); } ++i; } } } active_.Add(cs); }