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.
172 lines
4.3 KiB
172 lines
4.3 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 "TeamBitmapImage.h" |
|
#include <KeyValues.h> |
|
#include "vgui_bitmapimage.h" |
|
#include "panelmetaclassmgr.h" |
|
#include "VGuiMatSurface/IMatSystemSurface.h" |
|
#include <vgui_controls/Panel.h> |
|
|
|
// 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 ); |
|
} |
|
|
|
|