This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Commando/bandwidthgraph.cpp

336 lines
No EOL
9.3 KiB
C++

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU 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 General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/***********************************************************************************************
*** Confidential - Westwood Studios ***
***********************************************************************************************
* *
* Project Name : Commando *
* *
* $Archive:: /Commando/Code/Commando/bandwidthgraph.cpp $*
* *
* $Author:: Steve_t $*
* *
* $Modtime:: 1/02/02 2:29a $*
* *
* $Revision:: 9 $*
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "bandwidthgraph.h"
#include "assets.h"
#include "font3d.h"
#include "render2d.h"
#include "cnetwork.h"
#include "devoptions.h"
#include "packetmgr.h"
#include "serversettings.h"
#include "consolemode.h"
//
// Class statics
//
Render2DTextClass * cBandwidthGraph::PTextRenderer = NULL;
Font3DInstanceClass * cBandwidthGraph::PFont = NULL;
int cBandwidthGraph::BandwidthScaler = 50000;
float cBandwidthGraph::YPosition = 0;
float cBandwidthGraph::BarHeight = 0;
float cBandwidthGraph::BarWidth = 0;
float cBandwidthGraph::YIncrement = 0;
#define COLOR_BLACK 0xFF000000
#define COLOR_WHITE 0xFFFFFFFF
#define COLOR_RED 0xFFFF0000
#define COLOR_GREEN 0xFF48FF48
//-----------------------------------------------------------------------------
void
cBandwidthGraph::Onetime_Init
(
void
)
{
WWDEBUG_SAY(("cBandwidthGraph::Onetime_Init\n"));
bool can_render = ConsoleBox.Is_Exclusive() ? false : true;
if (can_render) {
WWASSERT(WW3DAssetManager::Get_Instance() != NULL);
PFont = WW3DAssetManager::Get_Instance()->Get_Font3DInstance("FONT6x8.TGA");
WWASSERT(PFont != NULL);
PFont->Set_Mono_Spaced();
SET_REF_OWNER(PFont);
PTextRenderer = new Render2DTextClass(PFont);
PTextRenderer->Set_Coordinate_Range(Render2DClass::Get_Screen_Resolution());
BarWidth = Render2DClass::Get_Screen_Resolution().Width() / 10.0f;
BarHeight = PTextRenderer->Peek_Font()->Char_Height();
YIncrement = BarHeight * 1.25f;
}
// This needs to be done somewhere else - we need a good value whether we have the graph or not.
//PacketManager.Set_Stats_Sampling_Frequency_Delay(1000);
//PacketManager.Set_Stats_Sampling_Frequency_Delay(250);
}
//-----------------------------------------------------------------------------
void
cBandwidthGraph::Onetime_Shutdown
(
void
)
{
WWDEBUG_SAY(("cBandwidthGraph::Onetime_Close\n"));
if (PTextRenderer != NULL)
{
delete PTextRenderer;
PTextRenderer = NULL;
}
if (PFont != NULL)
{
PFont->Release_Ref();
PFont = NULL;
}
}
//-----------------------------------------------------------------------------
void
cBandwidthGraph::Bandwidth_Graph
(
StringClass & label,
int bps,
int target_bps,
float bandwidth_multiplier,
float average_priority,
bool is_loading
)
{
if (PTextRenderer == NULL) {
return;
}
WWASSERT(PTextRenderer != NULL);
float x1 = 0;
float x2 = bps / (float) BandwidthScaler * BarWidth;
float y1 = YPosition;
float y2 = y1 + BarHeight;
//
// Bandwidth used (graph)
//
PTextRenderer->Draw_Block(RectClass(x1, y1, x2, y2), COLOR_RED);
PTextRenderer->Set_Location(Vector2(2, YPosition));
PTextRenderer->Draw_Text(label);
//
// Bandwidth used (text)
//
StringClass text;
text.Format("%d", bps);
PTextRenderer->Set_Location(Vector2(200, YPosition));
PTextRenderer->Draw_Text(text);
//
// Bandwidth budgeted (text)
//
if (target_bps >= 0)
{
StringClass text;
text.Format("%d", target_bps);
PTextRenderer->Set_Location(Vector2(245, YPosition));
PTextRenderer->Draw_Text(text);
float target_x = target_bps / (float) BandwidthScaler * BarWidth;
PTextRenderer->Draw_Block(RectClass(target_x - 1, y1, target_x + 1, y2));
}
//
// Bandwidth multiplier and average object priority
//
if (bandwidth_multiplier >= 0.0f)
{
//
// Graph mark
//
//float tp = threshold_priority * Render2DClass::Get_Screen_Resolution().Width();
//PTextRenderer->Draw_Block(RectClass(tp - 1, y1, tp + 1, y2), COLOR_GREEN);
//
// Text
//
// Bandwidth multiplier
if (is_loading) {
text.Format("BM:%-8.6f Ld", bandwidth_multiplier);
} else {
text.Format("BM:%-8.6f", bandwidth_multiplier);
}
PTextRenderer->Set_Location(Vector2(400, YPosition));
PTextRenderer->Draw_Text(text);
// Average object priority on this client
text.Format("AP:%-8.6f", average_priority);
PTextRenderer->Set_Location(Vector2(500, YPosition));
PTextRenderer->Draw_Text(text);
}
YPosition += YIncrement;
}
//-----------------------------------------------------------------------------
void
cBandwidthGraph::Think
(
void
)
{
bool bail = true;
#ifdef WWDEBUG
if (cDevOptions::ShowBandwidth.Is_True())
{
bail = false;
}
#endif // WWDEBUG
if (bail)
{
return;
}
PacketManager.Update_Stats();
if (PTextRenderer == NULL) {
return;
}
WWASSERT(PTextRenderer != NULL);
PTextRenderer->Reset();
//
// Draw the scale at the top
//
YPosition = 50;
float x1 = 0;
float x2 = 0;
float y1 = YPosition;
float y2 = y1 + BarHeight;
int i = 0;
do {
x2 = x1 + BarWidth;
PTextRenderer->Draw_Block(RectClass(x1, y1, x2, y2), (i % 2) ? COLOR_WHITE : COLOR_BLACK);
x1 = x2;
i++;
} while (x2 < Render2DClass::Get_Screen_Resolution().Width());
//
// Label the scale
//
StringClass text;
text.Format("BW / %d", BandwidthScaler);
PTextRenderer->Set_Location(Vector2(2, YPosition - 10));
PTextRenderer->Draw_Text(text);
YPosition += YIncrement;
DWORD bps = 0;
DWORD target_bps = 0;
//
// Client bandwidth
//
if (cNetwork::I_Am_Client() && cNetwork::PClientConnection->Is_Established())
{
text.Format("c%d->s", cNetwork::Get_My_Id());
bps = PacketManager.Get_Compressed_Bandwidth_Out(&cNetwork::Get_Client_Rhost()->Get_Address());
target_bps = cNetwork::Get_Client_Rhost()->Get_Target_Bps();
Bandwidth_Graph(text, bps, target_bps, -1.0f, -1.0f, false); //cNetwork::Get_Client_Rhost()->Get_Threshold_Priority());
text.Format("c%d<-s", cNetwork::Get_My_Id());
bps = PacketManager.Get_Compressed_Bandwidth_In(&cNetwork::Get_Client_Rhost()->Get_Address());
Bandwidth_Graph(text, bps, -1, -1, -1.0f, false);
}
//
// Server bandwidth
//
if (cNetwork::PServerConnection != NULL)
{
text.Format("s->c*");
bps = PacketManager.Get_Total_Compressed_Bandwidth_Out();
target_bps = cNetwork::PServerConnection->Get_Bandwidth_Budget_Out();
Bandwidth_Graph(text, bps, target_bps, -1, -1.0f, false);
text.Format("s<-c*");
bps = PacketManager.Get_Total_Compressed_Bandwidth_In();
Bandwidth_Graph(text, bps, -1, -1, -1.0f, false);
for (int i = cNetwork::PServerConnection->Get_Min_RHost(); i <= cNetwork::PServerConnection->Get_Max_RHost(); i++)
{
cRemoteHost * p_rhost = cNetwork::Get_Server_Rhost(i);
if (p_rhost != NULL)
{
bool is_loading = p_rhost->Get_Flood();
text.Format("s->c%d", i);
bps = PacketManager.Get_Compressed_Bandwidth_Out(&p_rhost->Get_Address());
target_bps = p_rhost->Get_Target_Bps();
Bandwidth_Graph(text, bps, target_bps, p_rhost->Get_Bandwidth_Multiplier(), p_rhost->Get_Average_Priority(), is_loading);
text.Format("s<-c%d", i);
bps = PacketManager.Get_Compressed_Bandwidth_In(&p_rhost->Get_Address());
Bandwidth_Graph(text, bps, -1, -1, -1.0f, false);
}
}
}
}
//-----------------------------------------------------------------------------
void
cBandwidthGraph::Render
(
void
)
{
bool bail = true;
#ifdef WWDEBUG
if (cDevOptions::ShowBandwidth.Is_True())
{
bail = false;
}
#endif // WWDEBUG
if (bail)
{
return;
}
if (PTextRenderer == NULL) {
return;
}
WWASSERT(PTextRenderer != NULL);
PTextRenderer->Render();
}