/* ** 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 . */ /*********************************************************************************************** *** 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(); }