示例#1
0
        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));
            }
        }
示例#2
0
        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);
 }