//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #include "cbase.h" #include "hud_bitmapnumericdisplay.h" #include "iclientmode.h" #include #include #include #include #include // 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 = GetClientMode()->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++ ) { Q_snprintf( a, sizeof(a), "number_%d", i ); m_pNumbers[i] = HudIcons().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; } }