public static int CompairIsoSortersBasic(IsoSpriteSorting sprite1, IsoSpriteSorting sprite2)
    {
        float y1 = sprite1.sortType == SortType.Point ? sprite1.SortingPoint1.y : sprite1.SortingLineCenterHeight;
        float y2 = sprite2.sortType == SortType.Point ? sprite2.SortingPoint1.y : sprite2.SortingLineCenterHeight;

        return(y2.CompareTo(y1));
    }
Пример #2
0
    public static void Visit(IsoSpriteSorting item, List <IsoSpriteSorting> sorted, Dictionary <IsoSpriteSorting, bool> visited)
    {
        bool inProcess;
        var  alreadyVisited = visited.TryGetValue(item, out inProcess);

        if (alreadyVisited)
        {
            //if (inProcess)
            //{
            //    string result = "";
            //    for (int i = 0; i < item.dependencies.Count; i++)
            //    {
            //        result += item.dependencies[i].name + System.Environment.NewLine;
            //    }
            //    UnityEngine.Debug.Log("Cyclic dependency found: " + item.name);
            //    UnityEngine.Debug.Log(result);
            //}
        }
        else
        {
            visited[item] = true;

            List <IsoSpriteSorting> dependencies = item.ActiveDependencies;
            for (int i = 0; i < dependencies.Count; i++)
            {
                Visit(dependencies[i], sorted, visited);
            }

            visited[item] = false;
            sorted.Add(item);
        }
    }
Пример #3
0
    public static int CompairIsoSortersBasic(IsoSpriteSorting sprite1, IsoSpriteSorting sprite2)
    {
        float y1 = sprite1.SortingPoint1.y;
        float y2 = sprite2.SortingPoint1.y;

        return(y2.CompareTo(y1));
    }
Пример #4
0
 public static void RegisterSprite(IsoSpriteSorting newSprite)
 {
     if (!newSprite.registered)
     {
         if (newSprite.renderBelowAll)
         {
             floorSpriteList.Add(newSprite);
             SortListSimple(floorSpriteList);
             SetSortOrderNegative(floorSpriteList);
         }
         else
         {
             if (newSprite.isMovable)
             {
                 moveableSpriteList.Add(newSprite);
             }
             else
             {
                 staticSpriteList.Add(newSprite);
                 newSprite.SetupStaticCache();
                 SetupStaticDependencies(newSprite);
             }
         }
         newSprite.registered = true;
     }
 }
Пример #5
0
    public static void FilterListByVisibility(List <IsoSpriteSorting> fullList, List <IsoSpriteSorting> destinationList)
    {
        destinationList.Clear();
        int count = fullList.Count;

        for (int i = 0; i < count; i++)
        {
            IsoSpriteSorting sprite = fullList[i];
            if (sprite.forceSort)
            {
                destinationList.Add(sprite);
                sprite.forceSort = false;
            }
            else
            {
                for (int j = 0; j < sprite.renderersToSort.Length; j++)
                {
                    if (sprite.renderersToSort[j].isVisible)
                    {
                        destinationList.Add(sprite);
                        break;
                    }
                }
            }
        }
    }
Пример #6
0
    public void OnSceneGUI()
    {
        IsoSpriteSorting myTarget = (IsoSpriteSorting)target;

        myTarget.SorterPositionOffset = Handles.FreeMoveHandle(
            myTarget.transform.position + myTarget.SorterPositionOffset,
            Quaternion.identity,
            0.08f * HandleUtility.GetHandleSize(myTarget.transform.position),
            Vector3.zero,
            Handles.DotHandleCap
            ) - myTarget.transform.position;
        if (myTarget.sortType == IsoSpriteSorting.SortType.Line)
        {
            myTarget.SorterPositionOffset2 = Handles.FreeMoveHandle(
                myTarget.transform.position + myTarget.SorterPositionOffset2,
                Quaternion.identity,
                0.08f * HandleUtility.GetHandleSize(myTarget.transform.position),
                Vector3.zero,
                Handles.DotHandleCap
                ) - myTarget.transform.position;
            Handles.DrawLine(myTarget.transform.position + myTarget.SorterPositionOffset, myTarget.transform.position + myTarget.SorterPositionOffset2);
        }
        if (GUI.changed)
        {
            Undo.RecordObject(target, "Updated Sorting Offset");
            EditorUtility.SetDirty(target);
        }
    }
Пример #7
0
 private static void RemoveStaticDependencies(IsoSpriteSorting spriteToRemove)
 {
     for (int i = 0; i < spriteToRemove.inverseStaticDependencies.Count; i++)
     {
         IsoSpriteSorting otherSprite = spriteToRemove.inverseStaticDependencies[i];
         otherSprite.staticDependencies.Remove(spriteToRemove);
     }
 }
    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();
        IsoSpriteSorting myScript = (IsoSpriteSorting)target;

        if (GUILayout.Button("Sort Visible Scene"))
        {
            myScript.SortScene();
        }
    }
 public static void UnregisterSprite(IsoSpriteSorting spriteToRemove)
 {
     if (spriteToRemove.renderBelowAll)
     {
         floorSpriteList.Remove(spriteToRemove);
     }
     else
     {
         moveableSpriteList.Remove(spriteToRemove);
     }
 }
    private static void RemoveCircularDependencyFromStack(List <IsoSpriteSorting> _circularReferenceStack)
    {
        if (_circularReferenceStack.Count > 1)
        {
            IsoSpriteSorting startingSorter = _circularReferenceStack[_circularReferenceStack.Count - 1];
            int repeatIndex = 0;
            for (int i = _circularReferenceStack.Count - 2; i >= 0; i--)
            {
                IsoSpriteSorting sorter = _circularReferenceStack[i];
                if (sorter == startingSorter)
                {
                    repeatIndex = i;
                    break;
                }
            }

            int   weakestDepIndex = -1;
            float longestDistance = float.MinValue;
            for (int i = repeatIndex; i < _circularReferenceStack.Count - 1; i++)
            {
                IsoSpriteSorting sorter1a = _circularReferenceStack[i];
                IsoSpriteSorting sorter2a = _circularReferenceStack[i + 1];
                if (sorter1a.sortType == IsoSpriteSorting.SortType.Point && sorter2a.sortType == IsoSpriteSorting.SortType.Point)
                {
                    float dist = UnityEngine.Mathf.Abs(sorter1a.AsPoint.x - sorter2a.AsPoint.x);
                    if (dist > longestDistance)
                    {
                        weakestDepIndex = i;
                        longestDistance = dist;
                    }
                }
            }
            if (weakestDepIndex == -1)
            {
                for (int i = repeatIndex; i < _circularReferenceStack.Count - 1; i++)
                {
                    IsoSpriteSorting sorter1a = _circularReferenceStack[i];
                    IsoSpriteSorting sorter2a = _circularReferenceStack[i + 1];
                    float            dist     = UnityEngine.Mathf.Abs(sorter1a.AsPoint.x - sorter2a.AsPoint.x);
                    if (dist > longestDistance)
                    {
                        weakestDepIndex = i;
                        longestDistance = dist;
                    }
                }
            }
            IsoSpriteSorting sorter1 = _circularReferenceStack[weakestDepIndex];
            IsoSpriteSorting sorter2 = _circularReferenceStack[weakestDepIndex + 1];
            sorter1.VisibleStaticDependencies.Remove(sorter2);
            sorter1.VisibleMovingDependencies.Remove(sorter2);
        }
    }
 public static void RegisterSprite(IsoSpriteSorting newSprite)
 {
     if (newSprite.renderBelowAll)
     {
         floorSpriteList.Add(newSprite);
         SortListSimple(floorSpriteList);
         SetSortOrderNegative(floorSpriteList);
     }
     else
     {
         moveableSpriteList.Add(newSprite);
     }
 }
Пример #12
0
 private static void SortListSimple(List <IsoSpriteSorting> list)
 {
     list.Sort((a, b) =>
     {
         if (!a || !b)
         {
             return(0);
         }
         else
         {
             return(IsoSpriteSorting.CompareIsoSorters(a, b));
         }
     });
 }
    private static int CompareLineAndLine(IsoSpriteSorting line1, IsoSpriteSorting line2)
    {
        Vector2 line1Point1 = line1.SortingPoint1;
        Vector2 line1Point2 = line1.SortingPoint2;
        Vector2 line2Point1 = line2.SortingPoint1;
        Vector2 line2Point2 = line2.SortingPoint2;

        int comp1    = ComparePointAndLine(line1Point1, line2);
        int comp2    = ComparePointAndLine(line1Point2, line2);
        int oneVStwo = int.MinValue;

        if (comp1 == comp2)
        {
            oneVStwo = comp1;
        }

        int comp3    = ComparePointAndLine(line2Point1, line1);
        int comp4    = ComparePointAndLine(line2Point2, line1);
        int twoVSone = int.MinValue;

        if (comp3 == comp4)
        {
            twoVSone = -comp3;
        }

        if (oneVStwo != int.MinValue && twoVSone != int.MinValue)
        {
            if (oneVStwo == twoVSone)
            {
                return(oneVStwo);
            }
            return(CompareLineCenters(line1, line2));
        }
        else if (oneVStwo != int.MinValue)
        {
            return(oneVStwo);
        }
        else if (twoVSone != int.MinValue)
        {
            return(twoVSone);
        }

        else
        {
            return(CompareLineCenters(line1, line2));
        }
    }
    private static int CompareLineAndLine(IsoSpriteSorting line1, IsoSpriteSorting line2)
    {
        Vector2 line1Point1 = line1.SortingPoint1;
        Vector2 line1Point2 = line1.SortingPoint2;
        Vector2 line2Point1 = line2.SortingPoint1;
        Vector2 line2Point2 = line2.SortingPoint2;

        int comp1    = ComparePointAndLine(line1Point1, line2);
        int comp2    = ComparePointAndLine(line1Point2, line2);
        int oneVStwo = int.MinValue;

        if (comp1 == comp2) //Both points in line 1 are above or below line2
        {
            oneVStwo = comp1;
        }

        int comp3    = ComparePointAndLine(line2Point1, line1);
        int comp4    = ComparePointAndLine(line2Point2, line1);
        int twoVSone = int.MinValue;

        if (comp3 == comp4) //Both points in line 2 are above or below line1
        {
            twoVSone = -comp3;
        }

        if (oneVStwo != int.MinValue && twoVSone != int.MinValue)
        {
            if (oneVStwo == twoVSone) //the two comparisons agree about the ordering
            {
                return(oneVStwo);
            }
            return(CompareLineCenters(line1, line2));
        }
        else if (oneVStwo != int.MinValue)
        {
            return(oneVStwo);
        }
        else if (twoVSone != int.MinValue)
        {
            return(twoVSone);
        }

        else
        {
            return(CompareLineCenters(line1, line2));
        }
    }
Пример #15
0
 public static void UnregisterSprite(IsoSpriteSorting spriteToRemove)
 {
     if (spriteToRemove.renderBelowAll)
     {
         floorSpriteList.Remove(spriteToRemove);
     }
     else
     {
         if (spriteToRemove.isMovable)
         {
             moveableSpriteList.Remove(spriteToRemove);
         }
         else
         {
             staticSpriteList.Remove(spriteToRemove);
             RemoveStaticDependencies(spriteToRemove);
         }
     }
 }
Пример #16
0
 private static void AddMovingDependenciesToMovingSprites(List <IsoSpriteSorting> moveableList)
 {
     for (int i = 0; i < moveableList.Count; i++)
     {
         IsoSpriteSorting sprite1 = moveableList[i];
         for (int j = 0; j < moveableList.Count; j++)
         {
             IsoSpriteSorting sprite2 = moveableList[j];
             if (CalculateBoundsIntersection(sprite1, sprite2))
             {
                 int compareResult = IsoSpriteSorting.CompareIsoSorters(sprite1, sprite2);
                 if (compareResult == -1)
                 {
                     sprite2.movingDependencies.Add(sprite1);
                 }
             }
         }
     }
 }
    private static int ComparePointAndLine(Vector3 point, IsoSpriteSorting line)
    {
        float pointY = point.y;

        if (pointY > line.SortingPoint1.y && pointY > line.SortingPoint2.y)
        {
            return(-1);
        }
        else if (pointY < line.SortingPoint1.y && pointY < line.SortingPoint2.y)
        {
            return(1);
        }
        else
        {
            float slope           = (line.SortingPoint2.y - line.SortingPoint1.y) / (line.SortingPoint2.x - line.SortingPoint1.x);
            float intercept       = line.SortingPoint1.y - (slope * line.SortingPoint1.x);
            float yOnLineForPoint = (slope * point.x) + intercept;
            return(yOnLineForPoint > point.y ? 1 : -1);
        }
    }
Пример #18
0
    private static void AddMovingDependencies(List <IsoSpriteSorting> moveableList, List <IsoSpriteSorting> staticList)
    {
        int moveableCount = moveableList.Count;
        int staticCount   = staticList.Count;

        for (int i = 0; i < moveableCount; i++)
        {
            IsoSpriteSorting moveSprite1 = moveableList[i];
            //Add Moving Dependencies to static sprites
            for (int j = 0; j < staticCount; j++)
            {
                IsoSpriteSorting staticSprite = staticList[j];
                if (CalculateBoundsIntersection(moveSprite1, staticSprite))
                {
                    int compareResult = IsoSpriteSorting.CompareIsoSorters(moveSprite1, staticSprite);
                    if (compareResult == -1)
                    {
                        staticSprite.movingDependencies.Add(moveSprite1);
                    }
                    else if (compareResult == 1)
                    {
                        moveSprite1.movingDependencies.Add(staticSprite);
                    }
                }
            }
            //Add Moving Dependencies to Moving Sprites
            for (int j = 0; j < moveableCount; j++)
            {
                IsoSpriteSorting moveSprite2 = moveableList[j];
                if (CalculateBoundsIntersection(moveSprite1, moveSprite2))
                {
                    int compareResult = IsoSpriteSorting.CompareIsoSorters(moveSprite1, moveSprite2);
                    if (compareResult == -1)
                    {
                        moveSprite2.movingDependencies.Add(moveSprite1);
                    }
                }
            }
        }
    }
Пример #19
0
    private static void SetupStaticDependencies(IsoSpriteSorting newSprite)
    {
        int the_count = staticSpriteList.Count;

        for (int i = 0; i < the_count; i++)
        {
            IsoSpriteSorting otherSprite = staticSpriteList[i];
            if (CalculateBoundsIntersection(newSprite, otherSprite))
            {
                int compareResult = IsoSpriteSorting.CompareIsoSorters(newSprite, otherSprite);
                if (compareResult == -1)
                {
                    otherSprite.staticDependencies.Add(newSprite);
                    newSprite.inverseStaticDependencies.Add(otherSprite);
                }
                else if (compareResult == 1)
                {
                    newSprite.staticDependencies.Add(otherSprite);
                    otherSprite.inverseStaticDependencies.Add(newSprite);
                }
            }
        }
    }
 public static int CompareIsoSorters(IsoSpriteSorting sprite1, IsoSpriteSorting sprite2)
 {
     if (sprite1.sortType == SortType.Point && sprite2.sortType == SortType.Point)
     {
         return(sprite2.SortingPoint1.y.CompareTo(sprite1.SortingPoint1.y));
     }
     else if (sprite1.sortType == SortType.Line && sprite2.sortType == SortType.Line)
     {
         return(CompareLineAndLine(sprite1, sprite2));
     }
     else if (sprite1.sortType == SortType.Point && sprite2.sortType == SortType.Line)
     {
         return(ComparePointAndLine(sprite1.SortingPoint1, sprite2));
     }
     else if (sprite1.sortType == SortType.Line && sprite2.sortType == SortType.Point)
     {
         return(-ComparePointAndLine(sprite2.SortingPoint1, sprite1));
     }
     else
     {
         return(0);
     }
 }
Пример #21
0
 private static void AddMovingDependenciesToStaticSprites(List <IsoSpriteSorting> moveableList, List <IsoSpriteSorting> staticList)
 {
     for (int i = 0; i < moveableList.Count; i++)
     {
         IsoSpriteSorting moveSprite = moveableList[i];
         for (int j = 0; j < staticList.Count; j++)
         {
             IsoSpriteSorting staticSprite = staticList[j];
             if (CalculateBoundsIntersection(moveSprite, staticSprite))
             {
                 int compareResult = IsoSpriteSorting.CompareIsoSorters(moveSprite, staticSprite);
                 if (compareResult == -1)
                 {
                     staticSprite.movingDependencies.Add(moveSprite);
                 }
                 else if (compareResult == 1)
                 {
                     moveSprite.movingDependencies.Add(staticSprite);
                 }
             }
         }
     }
 }
    private static void Visit(IsoSpriteSorting item, List <IsoSpriteSorting> sorted, HashSet <int> visited)
    {
        int id = item.GetInstanceID();

        if (!visited.Contains(id))
        {
            visited.Add(id);

            List <IsoSpriteSorting> dependencies = item.VisibleMovingDependencies;
            int dcount = dependencies.Count;
            for (int i = 0; i < dcount; i++)
            {
                Visit(dependencies[i], sorted, visited);
            }
            dependencies = item.VisibleStaticDependencies;
            dcount       = dependencies.Count;
            for (int i = 0; i < dcount; i++)
            {
                Visit(dependencies[i], sorted, visited);
            }

            sorted.Add(item);
        }
    }
 private static int CompareLineCenters(IsoSpriteSorting line1, IsoSpriteSorting line2)
 {
     return(-line1.SortingLineCenterHeight.CompareTo(line2.SortingLineCenterHeight));
 }
Пример #24
0
 private static bool CalculateBoundsIntersection(IsoSpriteSorting sprite, IsoSpriteSorting otherSprite)
 {
     return(sprite.TheBounds.Intersects(otherSprite.TheBounds));
 }