void UpdateLayout() { if (!layoutRunning) { return; } // enumerator may not exist yet if (layoutEnumerator == null) { return; } layoutTimer.Reset(); layoutTimer.Start(); bool generatorActive; var parms = Settings.Instance.layoutTweenParameters; do { generatorActive = layoutEnumerator.MoveNext(); } while (generatorActive && (layoutTimer.ElapsedTicks / (float)Stopwatch.Frequency) < parms.maxFrameDuration); var positions = layoutEnumerator.Current as Dictionary <T, Vector2>; bool gotFinalPositions = !generatorActive; if (!generatorActive) { layoutRunning = false; } var time = EditorApplication.timeSinceStartup; if (gotFinalPositions || time > nextVertexPosTweenUpdate) { nextVertexPosTweenUpdate = (float)time + parms.vertexPosTweenUpdateInterval; if (positions != null) { foreach (var pair in positions) { VertexData <T, P> vData = null; if (graph.VerticesData.TryGetValue(pair.Key, out vData)) { T tweenOwner = pair.Key; var evalFunc = TweenUtil.GetCombinedEasing(tweenOwner, graphPosTweens, vData.pos, pair.Value); graphPosTweens.Replace(tweenOwner, new Tween <Vector2>(v => vData.pos = v, parms.vertexPosTweenDuration, evalFunc)); } } } } }