1
0
mirror of https://github.com/alliedmodders/hl2sdk.git synced 2025-01-04 00:23:25 +08:00
hl2sdk/game/client/hud_numericdisplay.cpp

192 lines
5.7 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//========= Copyright © 1996-2005, 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 )
{
swprintf(unicode, L"%d", value);
}
else
{
int iMinutes = value / 60;
int iSeconds = value - iMinutes * 60;
if ( iSeconds < 10 )
swprintf( unicode, L"%d0%d", iMinutes, iSeconds );
else
swprintf( unicode, L"%d%d", iMinutes, iSeconds );
}
// 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();
}