private void RenderHistories <T>(Dictionary <T, Queue <float> > histories, GraphParameters baseGraph, Func <T, string> toString) { var yValuesList = histories.Values.Select( yValues => yValues.ToArray()) .ToArray(); baseGraph.YValuesList = yValuesList; GraphRenderer.Instance.RenderGraph(baseGraph); foreach (var history in histories) { var key = history.Key; var scores = history.Value; var lastInterestingIndexValue = LastNotableValueIn(scores); var screenCoord = CalculateScreenCoord(lastInterestingIndexValue.Key, lastInterestingIndexValue.Value, baseGraph.ScreenBounds); var labelRect = new Rect(screenCoord.x - 20.0f, screenCoord.y, 150.0f, 50.0f); GUI.Label(labelRect, toString(key)); } }
private void OnGUI() { RenderAttributeBars(); int lastOffset = m_currentHistorySize - 1; if (lastOffset < 0) { return; } const float padding = 0.1f; float graphScreenWidth = Screen.width * m_screenWidthProp; float graphScrenHeight = Screen.height * m_screenHeightProp; float graphY = Screen.height * m_screenYProp; var graphRect = new Rect(padding, graphY, graphScreenWidth, graphScrenHeight); RenderControlAroundGraph(graphRect); var xValues = Enumerable.Range(0, m_currentHistorySize) .Select(i => (float)i).ToArray(); var baseGraph = new GraphParameters { ScreenBounds = graphRect, YValuesMinMax = new Vector2(0f, 1f), XValues = xValues, Cols = ColorGenerator(), }; if (m_currentSource == Source.Attributes) { RenderHistories(m_attributeHistories, baseGraph, att => att.Name); } else { RenderHistories(m_actionScoreHistories, baseGraph, act => act.name); } RenderActionsOnGraph(graphRect); }
void PostRenderGraph(GraphParameters graph) { if (graph.XValues.Count <= 1) { // not enough to render return; } GL.PushMatrix(); GraphMat.SetPass(0); GL.LoadOrtho(); float normScreenGraphXMin = graph.ScreenBounds.x / Screen.width; float normScreenGraphYMin = (Screen.height - graph.ScreenBounds.y) / Screen.height; float normScreenGraphWidth = graph.ScreenBounds.width / Screen.width; float normScreenGraphHeight = graph.ScreenBounds.height / Screen.height; Rect normalizedGraphScreenRect = new Rect(normScreenGraphXMin, normScreenGraphYMin, normScreenGraphWidth, normScreenGraphHeight); bool isYRangeManuallySet = graph.YValuesMinMax != Vector2.zero; float minYValue = isYRangeManuallySet ? graph.YValuesMinMax.x : graph.YValuesList.SelectMany(yValues => yValues).Min(); float maxYValue = isYRangeManuallySet ? graph.YValuesMinMax.y : graph.YValuesList.SelectMany(yValues => yValues).Max(); float yScale = normalizedGraphScreenRect.height / (maxYValue - minYValue); float xScale = normalizedGraphScreenRect.width / (graph.XValues.Last() - graph.XValues[0]); Func <float, float, Vector2> graphToGLCoord = (xValue, yValue) => new Vector2(normalizedGraphScreenRect.x + xValue * xScale, normalizedGraphScreenRect.y - normalizedGraphScreenRect.height + yValue * yScale); // horizontal bars GL.Begin(GL.LINES); GL.Color(new Color(0.1f, 0.1f, 0.1f, 0.2f)); GL.Vertex(graphToGLCoord(graph.XValues[0], minYValue)); GL.Vertex(graphToGLCoord(graph.XValues.Last(), minYValue)); GL.Vertex(graphToGLCoord(graph.XValues[0], maxYValue)); GL.Vertex(graphToGLCoord(graph.XValues.Last(), maxYValue)); GL.End(); // vertical bars GL.Begin(GL.LINES); GL.Color(new Color(0.1f, 0.1f, 0.1f, 0.2f)); foreach (var xValue in graph.XValues) { GL.Vertex(graphToGLCoord(xValue, minYValue)); GL.Vertex(graphToGLCoord(xValue, maxYValue)); } GL.End(); foreach (var yValues in graph.YValuesList) { if (yValues.Count <= 1) { continue; } GL.Begin(GL.LINES); int xIndexOffset = graph.XValues.Count - Mathf.Min(graph.XValues.Count, yValues.Count); var prevPoint = graphToGLCoord(graph.XValues[xIndexOffset], yValues[0]); graph.Cols.MoveNext(); var graphColor = graph.Cols.Current; for (int valueIndex = 1; valueIndex < yValues.Count; ++valueIndex) { GL.Color(graphColor); float xValue = graph.XValues[valueIndex + xIndexOffset]; float yValue = yValues[valueIndex]; GL.Vertex(prevPoint); var currentPoint = graphToGLCoord(xValue, yValue); GL.Vertex(currentPoint); prevPoint = currentPoint; } GL.End(); } GL.PopMatrix(); }
public void RenderGraph(GraphParameters graph) { m_graphs.Enqueue(graph); }