private static bool RemoveCircularDependencies(IsoSpriteSorting item, List <IsoSpriteSorting> _circularDepStack, Dictionary <int, bool> _circularDepData) { _circularDepStack.Add(item); bool removedDependency = false; int id = item.GetInstanceID(); bool alreadyVisited = _circularDepData.TryGetValue(id, out bool inProcess); if (alreadyVisited) { if (inProcess) { RemoveCircularDependencyFromStack(_circularDepStack); removedDependency = true; } } else { _circularDepData[id] = true; List <IsoSpriteSorting> dependencies = item.VisibleMovingDependencies; for (int i = 0; i < dependencies.Count; i++) { if (RemoveCircularDependencies(dependencies[i], _circularDepStack, _circularDepData)) { removedDependency = true; } } dependencies = item.VisibleStaticDependencies; for (int i = 0; i < dependencies.Count; i++) { if (RemoveCircularDependencies(dependencies[i], _circularDepStack, _circularDepData)) { removedDependency = true; } } _circularDepData[id] = false; } _circularDepStack.RemoveAt(_circularDepStack.Count - 1); return(removedDependency); }
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); } }