示例#1
0
        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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        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);
        }