143 lines
3.2 KiB
C++
143 lines
3.2 KiB
C++
|
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
|
||
|
// 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 <http://www.gnu.org/licenses/>.
|
||
|
|
||
|
#include "std_afx.h"
|
||
|
|
||
|
#include "graph.h"
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Namespaces
|
||
|
//
|
||
|
|
||
|
using namespace NLMISC;
|
||
|
using namespace NL3D;
|
||
|
using namespace std;
|
||
|
|
||
|
//
|
||
|
// Variables
|
||
|
//
|
||
|
|
||
|
|
||
|
bool CGraph::Display = true;
|
||
|
bool CGraph::DisplayAverageValue = true;
|
||
|
|
||
|
|
||
|
|
||
|
void CGraph::renderGraph ()
|
||
|
{
|
||
|
|
||
|
|
||
|
// Display the background
|
||
|
uint32 w, h;
|
||
|
CNELU::Driver->getWindowSize (w, h);
|
||
|
float ScreenWidth = (float) w;
|
||
|
float ScreenHeight = (float) h;
|
||
|
if (w == 0 || h == 0) return;
|
||
|
float iw = 1.f / w;
|
||
|
float ih = 1.f / h;
|
||
|
NL3D::CViewport vp;
|
||
|
CDRU::drawQuad(X * iw, Y * ih, (X+Width) * iw, (Y+Height) * ih, *CNELU::Driver, BackColor, vp);
|
||
|
|
||
|
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<float>::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;
|
||
|
|
||
|
CDRU::drawLine(vect1.x * iw, vect1.y * ih, pos * iw, PrevY * ih, *CNELU::Driver, 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));
|
||
|
CDRU::drawLine(X * iw, peakval * ih, (X+Width) * iw, peakval * ih, *CNELU::Driver, frontCol);
|
||
|
|
||
|
// Display average
|
||
|
float average = sum / (float)Values.size();
|
||
|
value = average * Height / MaxValue;
|
||
|
if (value > Height) value = Height;
|
||
|
float avrval = Y+value;
|
||
|
CDRU::drawLine(X * iw, avrval * ih, (X+Width) * iw, avrval * ih, *CNELU::Driver, frontCol);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
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 = (uint64) (1000 * NLMISC::CTime::ticksToSecond(NLMISC::CTime::getPerformanceTime()));
|
||
|
|
||
|
while (Values.size () == 0 || currentTime > CurrentQuantumStart + Quantum)
|
||
|
{
|
||
|
CurrentQuantumStart += Quantum;
|
||
|
addOneValue ();
|
||
|
}
|
||
|
|
||
|
Values.back() += value;
|
||
|
|
||
|
// if (Values.back() > Peak)
|
||
|
// Peak = Values.back();
|
||
|
}
|