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.
245 lines
6.9 KiB
245 lines
6.9 KiB
//========= 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 "vgui_entityimagepanel.h" |
|
#include <KeyValues.h> |
|
#include "c_BaseTFPlayer.h" |
|
#include <vgui/IVGui.h> |
|
#include "vgui_bitmapimage.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
// Class factory |
|
//----------------------------------------------------------------------------- |
|
DECLARE_OVERLAY_FACTORY( CEntityImagePanel, "image" ); |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Constructor |
|
//----------------------------------------------------------------------------- |
|
CEntityImagePanel::CEntityImagePanel( vgui::Panel *pParent, const char *panelName ) : |
|
BaseClass( pParent, panelName ), m_pImage(0) |
|
{ |
|
SetPaintBackgroundEnabled( false ); |
|
} |
|
|
|
CEntityImagePanel::~CEntityImagePanel() |
|
{ |
|
if (m_pImage) |
|
delete m_pImage; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// initialization |
|
//----------------------------------------------------------------------------- |
|
|
|
bool CEntityImagePanel::Init( KeyValues* pInitData, C_BaseEntity* pEntity ) |
|
{ |
|
if (!BaseClass::Init( pInitData, pEntity)) |
|
return false; |
|
|
|
// modulation color |
|
if (!ParseRGBA( pInitData, "color", m_r, m_g, m_b, m_a )) |
|
return false; |
|
|
|
// get the size... |
|
int w, h; |
|
if (!ParseCoord( pInitData, "offset", m_OffsetX, m_OffsetY )) |
|
return false; |
|
|
|
if (!ParseCoord( pInitData, "size", w, h )) |
|
return false; |
|
|
|
char const* pClassImage = pInitData->GetString( "material" ); |
|
if ( !pClassImage || !pClassImage[ 0 ] ) |
|
return false; |
|
|
|
const char *mouseover = pInitData->GetString( "mousehint", "" ); |
|
if ( mouseover && mouseover[ 0 ] ) |
|
{ |
|
Q_strncpy( m_szMouseOverText, mouseover, sizeof( m_szMouseOverText ) ); |
|
} |
|
|
|
// hook in the bitmap |
|
m_pImage = new BitmapImage( GetVPanel(), pClassImage ); |
|
|
|
// Set the size... |
|
SetSize( w, h ); |
|
|
|
m_iOrgWidth = w; |
|
m_iOrgHeight = h; |
|
m_iOrgOffsetX = m_OffsetX; |
|
m_iOrgOffsetY = m_OffsetY; |
|
|
|
// we need updating |
|
vgui::ivgui()->AddTickSignal( GetVPanel() ); |
|
|
|
OnTick(); |
|
return true; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Should we draw?. |
|
//----------------------------------------------------------------------------- |
|
bool CEntityImagePanel::ShouldDraw() |
|
{ |
|
return ( IsLocalPlayerInTactical() || m_bShowInNormal ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Draws the puppy |
|
//----------------------------------------------------------------------------- |
|
void CEntityImagePanel::Paint( void ) |
|
{ |
|
// Don't draw if I'm not visible in the tactical map |
|
if ( MapData().IsEntityVisibleToTactical( GetEntity() ) == false ) |
|
return; |
|
|
|
vgui::surface()->DrawSetColor( m_r, m_g, m_b, m_a ); |
|
|
|
if ( !m_pImage ) |
|
return; |
|
|
|
Color color; |
|
color.SetColor( m_r, m_g, m_b, m_a ); |
|
m_pImage->SetColor( color ); |
|
m_pImage->DoPaint( GetVPanel() ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Class factory CEntityTeamImagePanel |
|
//----------------------------------------------------------------------------- |
|
|
|
DECLARE_OVERLAY_FACTORY( CEntityTeamImagePanel, "team_image" ); |
|
|
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Constructor: Same as image panel, except can handle team specific colors/images |
|
// Input : pEntity - |
|
//----------------------------------------------------------------------------- |
|
CEntityTeamImagePanel::CEntityTeamImagePanel( vgui::Panel *pParent, const char *panelName ) : |
|
BaseClass( pParent, panelName ) |
|
{ |
|
SetPaintBackgroundEnabled( false ); |
|
memset( m_Images, 0, sizeof( m_Images ) ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
CEntityTeamImagePanel::~CEntityTeamImagePanel( void ) |
|
{ |
|
for ( int i = 0 ; i < MAX_TEAMS; i++ ) |
|
{ |
|
if ( m_Images[i].m_pImage ) |
|
{ |
|
delete m_Images[ i ].m_pImage; |
|
} |
|
} |
|
memset( m_Images, 0, sizeof( m_Images ) ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// initialization |
|
//----------------------------------------------------------------------------- |
|
bool CEntityTeamImagePanel::Init( KeyValues* pInitData, C_BaseEntity* pEntity ) |
|
{ |
|
if (!BaseClass::Init( pInitData, pEntity)) |
|
return false; |
|
|
|
if ( pInitData->GetInt( "showinnormalmode", 0 ) ) |
|
{ |
|
m_bShowInNormal = true; |
|
} |
|
|
|
// get the size... |
|
int w, h; |
|
if (!ParseCoord( pInitData, "offset", m_OffsetX, m_OffsetY )) |
|
return false; |
|
|
|
if (!ParseCoord( pInitData, "size", w, h )) |
|
return false; |
|
|
|
// Set the size... |
|
SetSize( w, h ); |
|
|
|
m_iOrgWidth = w; |
|
m_iOrgHeight = h; |
|
m_iOrgOffsetX = m_OffsetX; |
|
m_iOrgOffsetY = m_OffsetY; |
|
|
|
const char *mouseover = pInitData->GetString( "mousehint", "" ); |
|
if ( mouseover && mouseover[ 0 ] ) |
|
{ |
|
Q_strncpy( m_szMouseOverText, mouseover, sizeof( m_szMouseOverText ) ); |
|
} |
|
|
|
for ( int i = 0 ; i < MAX_TEAMS; i++ ) |
|
{ |
|
char teamname[ 32 ]; |
|
Q_snprintf( teamname, sizeof( teamname ), "Team%i", i ); |
|
|
|
memset( &m_Images[ i ], 0, sizeof( m_Images[ i ] ) ); |
|
|
|
// Look for team section |
|
KeyValues *pTeamKV = pInitData->FindKey( teamname ); |
|
if ( !pTeamKV ) |
|
continue; |
|
|
|
// modulation color |
|
if (!ParseRGBA( pTeamKV, "color", m_Images[i].m_r, m_Images[i].m_g, m_Images[i].m_b, m_Images[i].m_a )) |
|
return false; |
|
|
|
char const* pClassImage = pTeamKV->GetString( "material" ); |
|
if ( !pClassImage || !pClassImage[ 0 ] ) |
|
return false; |
|
|
|
// hook in the bitmap |
|
m_Images[ i ].m_pImage = new BitmapImage( GetVPanel(), pClassImage ); |
|
} |
|
|
|
// we need updating |
|
vgui::ivgui()->AddTickSignal( GetVPanel() ); |
|
return true; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Draws the puppy |
|
//----------------------------------------------------------------------------- |
|
void CEntityTeamImagePanel::Paint( void ) |
|
{ |
|
// Determine team index of underlying entity |
|
int teamnumber = GetEntity()->GetTeamNumber(); |
|
if ( teamnumber < 0 || teamnumber >= MAX_TEAMS ) |
|
{ |
|
Assert( 0 ); |
|
return; |
|
} |
|
|
|
if ( !m_Images[ teamnumber ].m_pImage ) |
|
return; |
|
|
|
// Don't draw if I'm not visible in the tactical map |
|
if ( MapData().IsEntityVisibleToTactical( GetEntity() ) == false ) |
|
return; |
|
|
|
ComputeAndSetSize(); |
|
|
|
vgui::surface()->DrawSetColor( m_Images[ teamnumber ].m_r, m_Images[ teamnumber ].m_g, m_Images[ teamnumber ].m_b, m_Images[ teamnumber ].m_b ); |
|
Color color; |
|
color.SetColor( m_Images[ teamnumber ].m_r, m_Images[ teamnumber ].m_g, m_Images[ teamnumber ].m_b, m_Images[ teamnumber ].m_b ); |
|
m_Images[ teamnumber ].m_pImage->SetColor( color ); |
|
m_Images[ teamnumber ].m_pImage->DoPaint( GetVPanel() ); |
|
} |