// Can only add overlapping pairs.
        // Sort edge up and add overlapping pairs
        private void SortMaxEdgeUp(List<Edge> edgeList, int axisIndex, int edgeIndex)
        {
            int maxIndex = edgeList.Count - 1;
              if (edgeIndex == maxIndex)
            return;

              var edge = edgeList[edgeIndex];
              var itemInfo = edge.Info;

              int nextEdgeIndex = edgeIndex + 1;
              var nextEdge = edgeList[nextEdgeIndex];

              while (edge.Position >= nextEdge.Position)
              {
            var nextItemInfo = nextEdge.Info;

            if (nextEdge.IsMax == false)
            {
              // New overlapping pair!
              if (_broadPhase != null || EnableSelfOverlaps)
              {
            if (AreOverlapping(itemInfo, nextItemInfo, axisIndex))
            {
              var overlap = new Pair<T>(itemInfo.Item, nextItemInfo.Item);
              if (Filter == null || Filter.Filter(overlap))
              {
                if (_broadPhase != null)
                  _broadPhase.Add(overlap);

                if (EnableSelfOverlaps)
                  SelfOverlaps.Add(overlap);
              }
            }
              }

              nextItemInfo.MinEdgeIndices[axisIndex] = edgeIndex; // Min edge was swapped down.
            }
            else
            {
              nextItemInfo.MaxEdgeIndices[axisIndex] = edgeIndex; // Max edge was swapped down.
            }

            itemInfo.MaxEdgeIndices[axisIndex] = nextEdgeIndex;   // Max edge was swapped up.

            // Swap edges in edge list.
            edgeList[edgeIndex] = nextEdge;
            edgeList[nextEdgeIndex] = edge;

            edgeIndex++;
            if (edgeIndex == maxIndex)
              return;

            nextEdgeIndex++;
            nextEdge = edgeList[nextEdgeIndex];
              }
        }
Example #2
0
        public Box Create(Rect area)
        {
            var box = new Box(this, area);

            Boxes.Add(box);
            _broadPhase.Add(box);
            return(box);
        }
        // Can only add overlapping pairs.
        // Sort edge down and add overlapping pairs.
        private void SortMinEdgeDown(List <Edge> edgeList, int axisIndex, int edgeIndex)
        {
            if (edgeIndex == 0)
            {
                return;
            }

            var edge     = edgeList[edgeIndex];
            var itemInfo = edge.Info;

            int  previousEdgeIndex = edgeIndex - 1;
            Edge previousEdge      = edgeList[previousEdgeIndex];

            while (edge.Position <= previousEdge.Position)
            {
                var previousItemInfo = previousEdge.Info;

                if (previousEdge.IsMax)
                {
                    // New overlapping pair!
                    if (_broadPhase != null || EnableSelfOverlaps)
                    {
                        if (AreOverlapping(itemInfo, previousItemInfo, axisIndex))
                        {
                            var overlap = new Pair <T>(itemInfo.Item, previousItemInfo.Item);
                            if (Filter == null || Filter.Filter(overlap))
                            {
                                if (_broadPhase != null)
                                {
                                    _broadPhase.Add(overlap);
                                }

                                if (EnableSelfOverlaps)
                                {
                                    SelfOverlaps.Add(overlap);
                                }
                            }
                        }
                    }

                    previousItemInfo.MaxEdgeIndices[axisIndex] = edgeIndex; // Max edge was swapped up.
                }
                else
                {
                    previousItemInfo.MinEdgeIndices[axisIndex] = edgeIndex; // Min edge was swapped up.
                }

                itemInfo.MinEdgeIndices[axisIndex] = previousEdgeIndex; // Min edge was swapped down.

                // Swap edges in edge list.
                edgeList[edgeIndex]         = previousEdge;
                edgeList[previousEdgeIndex] = edge;

                edgeIndex--;
                if (edgeIndex == 0)
                {
                    return;
                }

                previousEdgeIndex--;
                previousEdge = edgeList[previousEdgeIndex];
            }
        }