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.
168 lines
3.9 KiB
168 lines
3.9 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
|
||
|
#include "cbase.h"
|
||
|
#include "hud_bitmapnumericdisplay.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
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CHudBitmapNumericDisplay::CHudBitmapNumericDisplay(vgui::Panel *parent, const char *name) : vgui::Panel(parent, name)
|
||
|
{
|
||
|
vgui::Panel *pParent = g_pClientMode->GetViewport();
|
||
|
SetParent( pParent );
|
||
|
|
||
|
m_iValue = 0;
|
||
|
m_bDisplayValue = true;
|
||
|
memset( m_pNumbers, 0, 10*sizeof(CHudTexture *) );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: data accessor
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudBitmapNumericDisplay::SetDisplayValue(int value)
|
||
|
{
|
||
|
m_iValue = value;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: renders the vgui panel
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudBitmapNumericDisplay::Paint()
|
||
|
{
|
||
|
float alpha = m_flAlphaOverride / 255;
|
||
|
Color fgColor = GetFgColor();
|
||
|
fgColor[3] *= alpha;
|
||
|
SetFgColor( fgColor );
|
||
|
|
||
|
if (m_bDisplayValue)
|
||
|
{
|
||
|
// draw our numbers
|
||
|
// surface()->DrawSetTextColor(GetFgColor());
|
||
|
PaintNumbers(digit_xpos, digit_ypos, m_iValue, GetFgColor());
|
||
|
|
||
|
// draw the overbright blur
|
||
|
for (float fl = m_flBlur; fl > 0.0f; fl -= 1.0f)
|
||
|
{
|
||
|
if (fl >= 1.0f)
|
||
|
{
|
||
|
PaintNumbers(digit_xpos, digit_ypos, m_iValue, GetFgColor());
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// draw a percentage of the last one
|
||
|
Color col = GetFgColor();
|
||
|
col[3] *= fl;
|
||
|
PaintNumbers(digit_xpos, digit_ypos, m_iValue, col);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: data accessor
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudBitmapNumericDisplay::SetShouldDisplayValue(bool state)
|
||
|
{
|
||
|
m_bDisplayValue = state;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudBitmapNumericDisplay::PaintBackground( void )
|
||
|
{
|
||
|
int alpha = m_flAlphaOverride / 255;
|
||
|
Color bgColor = GetBgColor();
|
||
|
bgColor[3] *= alpha;
|
||
|
SetBgColor( bgColor );
|
||
|
|
||
|
BaseClass::PaintBackground();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudBitmapNumericDisplay::PaintNumbers(int xpos, int ypos, int value, Color col, int numSigDigits )
|
||
|
{
|
||
|
if( !m_pNumbers[0] )
|
||
|
{
|
||
|
int i;
|
||
|
char a[16];
|
||
|
|
||
|
for( i=0;i<10;i++ )
|
||
|
{
|
||
|
sprintf( a, "number_%d", i );
|
||
|
|
||
|
m_pNumbers[i] = gHUD.GetIcon( a );
|
||
|
}
|
||
|
|
||
|
if( !m_pNumbers[0] )
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if( value > 100000 )
|
||
|
{
|
||
|
value = 99999;
|
||
|
}
|
||
|
|
||
|
int pos = 10000;
|
||
|
|
||
|
float scale = ( digit_height / (float)m_pNumbers[0]->Height());
|
||
|
|
||
|
int digit;
|
||
|
Color color = GetFgColor();
|
||
|
int width = m_pNumbers[0]->Width() * scale;
|
||
|
int height = m_pNumbers[0]->Height() * scale;
|
||
|
bool bStart = false;
|
||
|
|
||
|
//right align to xpos
|
||
|
|
||
|
int numdigits = 1;
|
||
|
|
||
|
int x = pos;
|
||
|
while( x >= 10 )
|
||
|
{
|
||
|
if( value >= x )
|
||
|
numdigits++;
|
||
|
|
||
|
x /= 10;
|
||
|
}
|
||
|
|
||
|
if( numdigits < numSigDigits )
|
||
|
numdigits = numSigDigits;
|
||
|
|
||
|
xpos -= numdigits * width;
|
||
|
|
||
|
//draw the digits
|
||
|
while( pos >= 1 )
|
||
|
{
|
||
|
digit = value / pos;
|
||
|
value = value % pos;
|
||
|
|
||
|
if( bStart || digit > 0 || pos <= pow(10.0f,numSigDigits-1) )
|
||
|
{
|
||
|
bStart = true;
|
||
|
m_pNumbers[digit]->DrawSelf( xpos, ypos, width, height, col );
|
||
|
xpos += width;
|
||
|
}
|
||
|
|
||
|
pos /= 10;
|
||
|
}
|
||
|
}
|