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
![]()
4 years ago
|
//========= 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() );
|
||
|
}
|