// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#include "stdpch.h"
#include "graph.h"
#include
extern NL3D::UTextContext *TextContext;
//
// Namespaces
//
using namespace NLMISC;
using namespace NL3D;
using namespace std;
//
// Variables
//
bool CGraph::Display = true;
bool CGraph::DisplayAverageValue = true;
UDriver *CGraph::_Driver = NULL;
vector *CGraph::_Graphs = NULL;
//
// Classes
//
void CGraph::render (uint page)
{
if (!Display) return;
if (_Driver == NULL) return;
if (_Graphs == NULL) return;
for (uint i = 0; i < _Graphs->size(); i++)
{
// Graph in all info pages
if ((*_Graphs)[i]->Page == page)
(*_Graphs)[i]->renderGraph ();
}
}
void CGraph::renderGraph ()
{
if (_Driver == NULL)
return;
// Display the background
uint32 w, h;
_Driver->getWindowSize (w, h);
float ScreenWidth = (float) w;
float ScreenHeight = (float) h;
_Driver->setMatrixMode2D (CFrustum (0.0f, ScreenWidth, 0.0f, ScreenHeight, -1.0f, 1.0f, false));
_Driver->drawQuad (X, Y, X+Width, Y+Height, BackColor);
Peak = 0.0f;
float sum = 0.0f;
CRGBA lineCol;
if ( LineMode )
{
lineCol.set (BackColor.R, BackColor.G, BackColor.B, 255);
}
else
{
lineCol.set (255,255,255,BackColor.A);
}
float pos = X+Width-1;
uint i = 0;
for (deque::reverse_iterator it = Values.rbegin(); it != Values.rend(); it++)
{
float value = (*it) * Height / MaxValue;
if (value > Height) value = Height;
CVector vect1;
if ( LineMode )
{
vect1.x = pos-1;
vect1.y = PrevY;
}
else
{
vect1.x = pos;
vect1.y = Y;
}
PrevY = Y + value;
_Driver->drawLine (vect1.x, vect1.y, pos, PrevY, lineCol);
pos--;
if ((*it) > Peak) Peak = *it;
sum += *it;
i++;
}
// Display max
float value = Peak * Height / MaxValue;
if (value > Height) value = Height;
float peakval = Y+value;
CRGBA frontCol (min(BackColor.R*2,255),min(BackColor.G*2,255),min(BackColor.B*2,255),min(BackColor.A*2,255));
_Driver->drawLine (X, peakval, X+Width, peakval, frontCol);
// Display average
float average = sum / favoid0((float)Values.size());
value = average * Height / MaxValue;
if (value > Height) value = Height;
float avrval = Y+value;
_Driver->drawLine (X, avrval, X+Width, avrval, frontCol);
if (TextContext != NULL)
{
TextContext->setShaded (false);
TextContext->setShadeOutline(false);
TextContext->setHotSpot (UTextContext::MiddleLeft);
TextContext->setColor (frontCol);
TextContext->setFontSize (10);
TextContext->printfAt ((X+Width+2)/ScreenWidth, peakval/ScreenHeight, "%.2f", Peak);
if (DisplayAverageValue)
{
// don't display the average value if they are superposed
if (avrval+5peakval+5)
{
TextContext->printfAt ((X+Width+2)/ScreenWidth, avrval/ScreenHeight, "%.2f", average);
}
}
// Display name
TextContext->setHotSpot (UTextContext::TopLeft);
TextContext->printfAt ((X+1)/ScreenWidth, (Y+Height-1)/ScreenHeight, Name.c_str());
}
}
void CGraph::addOneValue (float value)
{
if (value < 0.0f) value = 0.0f;
Values.push_back (value);
while (Values.size () > Width)
Values.pop_front ();
// if (Values.back() > Peak)
// Peak = Values.back();
}
void CGraph::addValue (float value)
{
TTime currentTime = ryzomGetLocalTime ();
while (Values.size () == 0 || currentTime > CurrentQuantumStart + Quantum)
{
CurrentQuantumStart += Quantum;
addOneValue ();
}
Values.back() += value;
// if (Values.back() > Peak)
// Peak = Values.back();
}