Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

200 lines
5.9 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "hud_numericdisplay.h"
#include "iclientmode.h"
#include <Color.h>
#include <KeyValues.h>
#include <vgui/ISurface.h>
#include <vgui/ISystem.h>
#include <vgui/IVGui.h>
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
using namespace vgui;
//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CHudNumericDisplay::CHudNumericDisplay(vgui::Panel *parent, const char *name) : BaseClass(parent, name)
{
vgui::Panel *pParent = g_pClientMode->GetViewport();
SetParent( pParent );
m_iValue = 0;
m_LabelText[0] = 0;
m_iSecondaryValue = 0;
m_bDisplayValue = true;
m_bDisplaySecondaryValue = false;
m_bIndent = false;
m_bIsTime = false;
}
//-----------------------------------------------------------------------------
// Purpose: Resets values on restore/new map
//-----------------------------------------------------------------------------
void CHudNumericDisplay::Reset()
{
m_flBlur = 0.0f;
}
//-----------------------------------------------------------------------------
// Purpose: data accessor
//-----------------------------------------------------------------------------
void CHudNumericDisplay::SetDisplayValue(int value)
{
m_iValue = value;
}
//-----------------------------------------------------------------------------
// Purpose: data accessor
//-----------------------------------------------------------------------------
void CHudNumericDisplay::SetSecondaryValue(int value)
{
m_iSecondaryValue = value;
}
//-----------------------------------------------------------------------------
// Purpose: data accessor
//-----------------------------------------------------------------------------
void CHudNumericDisplay::SetShouldDisplayValue(bool state)
{
m_bDisplayValue = state;
}
//-----------------------------------------------------------------------------
// Purpose: data accessor
//-----------------------------------------------------------------------------
void CHudNumericDisplay::SetShouldDisplaySecondaryValue(bool state)
{
m_bDisplaySecondaryValue = state;
}
//-----------------------------------------------------------------------------
// Purpose: data accessor
//-----------------------------------------------------------------------------
void CHudNumericDisplay::SetLabelText(const wchar_t *text)
{
wcsncpy(m_LabelText, text, sizeof(m_LabelText) / sizeof(wchar_t));
m_LabelText[(sizeof(m_LabelText) / sizeof(wchar_t)) - 1] = 0;
}
//-----------------------------------------------------------------------------
// Purpose: data accessor
//-----------------------------------------------------------------------------
void CHudNumericDisplay::SetIndent(bool state)
{
m_bIndent = state;
}
//-----------------------------------------------------------------------------
// Purpose: data accessor
//-----------------------------------------------------------------------------
void CHudNumericDisplay::SetIsTime(bool state)
{
m_bIsTime = state;
}
//-----------------------------------------------------------------------------
// Purpose: paints a number at the specified position
//-----------------------------------------------------------------------------
void CHudNumericDisplay::PaintNumbers(HFont font, int xpos, int ypos, int value)
{
surface()->DrawSetTextFont(font);
wchar_t unicode[6];
if ( !m_bIsTime )
{
V_snwprintf(unicode, ARRAYSIZE(unicode), L"%d", value);
}
else
{
int iMinutes = value / 60;
int iSeconds = value - iMinutes * 60;
#ifdef PORTAL
// portal uses a normal font for numbers so we need the seperate to be a renderable ':' char
if ( iSeconds < 10 )
V_snwprintf( unicode, ARRAYSIZE(unicode), L"%d:0%d", iMinutes, iSeconds );
else
V_snwprintf( unicode, ARRAYSIZE(unicode), L"%d:%d", iMinutes, iSeconds );
#else
if ( iSeconds < 10 )
V_snwprintf( unicode, ARRAYSIZE(unicode), L"%d`0%d", iMinutes, iSeconds );
else
V_snwprintf( unicode, ARRAYSIZE(unicode), L"%d`%d", iMinutes, iSeconds );
#endif
}
// adjust the position to take into account 3 characters
int charWidth = surface()->GetCharacterWidth(font, '0');
if (value < 100 && m_bIndent)
{
xpos += charWidth;
}
if (value < 10 && m_bIndent)
{
xpos += charWidth;
}
surface()->DrawSetTextPos(xpos, ypos);
surface()->DrawUnicodeString( unicode );
}
//-----------------------------------------------------------------------------
// Purpose: draws the text
//-----------------------------------------------------------------------------
void CHudNumericDisplay::PaintLabel( void )
{
surface()->DrawSetTextFont(m_hTextFont);
surface()->DrawSetTextColor(GetFgColor());
surface()->DrawSetTextPos(text_xpos, text_ypos);
surface()->DrawUnicodeString( m_LabelText );
}
//-----------------------------------------------------------------------------
// Purpose: renders the vgui panel
//-----------------------------------------------------------------------------
void CHudNumericDisplay::Paint()
{
if (m_bDisplayValue)
{
// draw our numbers
surface()->DrawSetTextColor(GetFgColor());
PaintNumbers(m_hNumberFont, digit_xpos, digit_ypos, m_iValue);
// draw the overbright blur
for (float fl = m_flBlur; fl > 0.0f; fl -= 1.0f)
{
if (fl >= 1.0f)
{
PaintNumbers(m_hNumberGlowFont, digit_xpos, digit_ypos, m_iValue);
}
else
{
// draw a percentage of the last one
Color col = GetFgColor();
col[3] *= fl;
surface()->DrawSetTextColor(col);
PaintNumbers(m_hNumberGlowFont, digit_xpos, digit_ypos, m_iValue);
}
}
}
// total ammo
if (m_bDisplaySecondaryValue)
{
surface()->DrawSetTextColor(GetFgColor());
PaintNumbers(m_hSmallNumberFont, digit2_xpos, digit2_ypos, m_iSecondaryValue);
}
PaintLabel();
}