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
//========= 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; |
|
} |
|
} |