//returns the screen coordinates for the maximum of the graph public Vector2 render(Vector2 graphOrigin, float graphWidth, float graphHeight, float minValue, float maxValue) { //Render the floor display lineMaterial.SetPass(0); GL.PushMatrix(); GL.LoadOrtho(); float graphXStep=0; float graphYStep=graphHeight; if (writeIdx>0) graphXStep=graphWidth/writeIdx; GraphUtils.drawArrow2d(graphOrigin,new Vector2(graphOrigin.x,graphOrigin.y+graphHeight),0.02f); GraphUtils.drawArrow2d(graphOrigin,new Vector2(graphOrigin.x+graphWidth,graphOrigin.y),0.02f); GL.Begin(GL.LINES); Vector2 previous=new Vector2(); Vector2 result=new Vector2(-float.MaxValue,-float.MaxValue); for (int i=0; i<writeIdx; i++) { float val=buffer[i]; val=val-minValue; val=val/(maxValue-minValue); Vector2 current=new Vector2(graphOrigin.x+graphXStep*(float)i,graphOrigin.y+graphYStep*val); if (current.y > result.y) result=current; if (i!=0){ GL.Vertex(previous); GL.Vertex(current); } previous=current; } GL.End(); GL.PopMatrix(); return result; }
//call this from OnRenderObject of some other object public void renderRunning(Vector2 graphOrigin, float graphWidth, float graphHeight, float minValue, float maxValue) { //Render the floor display lineMaterial.SetPass(0); GL.PushMatrix(); GL.LoadOrtho(); float graphXStep=0; float graphYStep=graphHeight; if (buffer.Capacity>0) graphXStep=graphWidth/buffer.Capacity; GraphUtils.drawArrow2d(graphOrigin,new Vector2(graphOrigin.x,graphOrigin.y+graphHeight),0.02f); GraphUtils.drawArrow2d(graphOrigin,new Vector2(graphOrigin.x+graphWidth,graphOrigin.y),0.02f); GL.Begin(GL.LINES); Vector2 previous=new Vector2(); for (int i=0; i<buffer.Capacity; i++) { int delay=buffer.Capacity-i; int idx=writeIdx-delay; if (idx<0) idx+=buffer.Capacity; float val=buffer[idx]; val=val-minValue; val=val/(maxValue-minValue); Vector2 current=new Vector2(graphOrigin.x+graphXStep*(float)i,graphOrigin.y+graphYStep*val); if (i!=0){ GL.Vertex(previous); GL.Vertex(current); } previous=current; } GL.End(); GL.PopMatrix(); }