// Separate the given subtrees so they do not overlap private void SeparateSubtrees(Playable[] subroots) { subroots = subroots.Where(s => s != null).ToArray(); if (subroots.Length < 2) return; Playable upperNode = subroots[0]; Dictionary<int, Vector2> upperTreeBoundaries = GetBoundaryPositions(upperNode); for (int s = 0; s < subroots.Length - 1; s++) { Playable lowerNode = subroots[s + 1]; Dictionary<int, Vector2> lowerTreeBoundaries = GetBoundaryPositions(lowerNode); int minDepth = upperTreeBoundaries.Keys.Min(); if (minDepth != lowerTreeBoundaries.Keys.Min()) Debug.LogError("Cannot separate subtrees which do not start at the same root depth"); int lowerMaxDepth = lowerTreeBoundaries.Keys.Max(); int upperMaxDepth = upperTreeBoundaries.Keys.Max(); int maxDepth = System.Math.Min(upperMaxDepth, lowerMaxDepth); for (int depth = minDepth; depth <= maxDepth; depth++) { float delta = k_DistanceBetweenNodes - (lowerTreeBoundaries[depth].x - upperTreeBoundaries[depth].y); delta = System.Math.Max(delta, 0); RecursiveMoveSubtree(lowerNode, delta); for (int i = minDepth; i <= lowerMaxDepth; i++) lowerTreeBoundaries[i] += new Vector2(delta, delta); } upperTreeBoundaries = CombineBoundaryPositions(upperTreeBoundaries, lowerTreeBoundaries); } }