//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: This is a panel which is rendered image on top of an entity // // $Revision: $ // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "TeamBitmapImage.h" #include #include "vgui_bitmapimage.h" #include "panelmetaclassmgr.h" #include "VGuiMatSurface/IMatSystemSurface.h" #include // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" //----------------------------------------------------------------------------- // A multiplexer bitmap that chooses a bitmap based on team //----------------------------------------------------------------------------- CTeamBitmapImage::CTeamBitmapImage() : m_Alpha(1.0f) { memset( m_ppImage, 0, BITMAP_COUNT * sizeof(BitmapImage*) ); m_pEntity = NULL; m_bRelativeTeams = 0; } CTeamBitmapImage::~CTeamBitmapImage() { int i; for ( i = 0; i < BITMAP_COUNT; ++i ) { if (m_ppImage[i]) delete m_ppImage[i]; } } //----------------------------------------------------------------------------- // initialization //----------------------------------------------------------------------------- bool CTeamBitmapImage::Init( vgui::Panel *pParent, KeyValues* pInitData, C_BaseEntity* pEntity ) { static const char *pRelativeTeamNames[BITMAP_COUNT] = { "NoTeam", "MyTeam", "EnemyTeam", }; static const char *pAbsoluteTeamNames[BITMAP_COUNT] = { "Team0", "Team1", "Team2", }; m_pEntity = pEntity; m_bRelativeTeams = (pInitData->GetInt( "relativeteam" ) != 0); const char **ppTeamNames = m_bRelativeTeams ? pRelativeTeamNames : pAbsoluteTeamNames; int i; for ( i = 0 ; i < BITMAP_COUNT; ++i ) { // Default to null m_ppImage[i] = NULL; // Look for team section KeyValues *pTeamKV = pInitData->FindKey( ppTeamNames[i] ); if ( !pTeamKV ) continue; char const* pClassImage = pTeamKV->GetString( "material" ); if ( !pClassImage || !pClassImage[ 0 ] ) return false; // modulation color Color color; if (!ParseRGBA( pTeamKV, "color", color )) color.SetColor( 255, 255, 255, 255 ); // hook in the bitmap m_ppImage[i] = new BitmapImage( pParent->GetVPanel(), pClassImage ); m_ppImage[i]->SetColor( color ); } return true; } //----------------------------------------------------------------------------- // Alpha modulate... //----------------------------------------------------------------------------- void CTeamBitmapImage::SetAlpha( float alpha ) { m_Alpha = clamp( alpha, 0.0f, 1.0f ); } //----------------------------------------------------------------------------- // draw //----------------------------------------------------------------------------- void CTeamBitmapImage::Paint( float yaw /*= 0.0f*/ ) { if (m_Alpha == 0.0f) return; int team = 0; if (m_bRelativeTeams) { if (GetEntity()) { if (GetEntity()->GetTeamNumber() != 0) { team = GetEntity()->InLocalTeam() ? 1 : 2; } } } else { if (GetEntity()) team = GetEntity()->GetTeamNumber(); } // Paint the image for the current team if (m_ppImage[team]) { // Modulate the color based on the alpha.... Color color = m_ppImage[team]->GetColor(); int alpha = color[3]; color[3] = (alpha * m_Alpha); m_ppImage[team]->SetColor( color ); if ( yaw != 0.0f ) { g_pMatSystemSurface->DisableClipping( true ); m_ppImage[team]->DoPaint( m_ppImage[team]->GetRenderSizePanel(), yaw ); g_pMatSystemSurface->DisableClipping( false ); } else { // Paint m_ppImage[team]->Paint(); } // restore previous color color[3] = alpha; m_ppImage[team]->SetColor( color ); } } //----------------------------------------------------------------------------- // Helper method to initialize a team image from KeyValues data.. //----------------------------------------------------------------------------- bool InitializeTeamImage( KeyValues *pInitData, const char* pSectionName, vgui::Panel *pParent, C_BaseEntity *pEntity, CTeamBitmapImage* pTeamImage ) { KeyValues *pTeamImageSection = pInitData; if (pSectionName) { pTeamImageSection = pInitData->FindKey( pSectionName ); if ( !pTeamImageSection ) return false; } return pTeamImage->Init( pParent, pTeamImageSection, pEntity ); }