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.
236 lines
6.3 KiB
236 lines
6.3 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: This is a panel which is rendered on top of an entity |
|
// |
|
// $Revision: $ |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "vgui_EntityPanel.h" |
|
#include "ienginevgui.h" |
|
#include "c_BaseTFPlayer.h" |
|
#include "clientmode_commander.h" |
|
#include "hud_commander_statuspanel.h" |
|
#include <KeyValues.h> |
|
#include "commanderoverlaypanel.h" |
|
#include <vgui/IVGui.h> |
|
#include "cdll_util.h" |
|
#include "view.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
// constructor |
|
//----------------------------------------------------------------------------- |
|
|
|
CEntityPanel::CEntityPanel( vgui::Panel *pParent, const char *panelName ) |
|
: BaseClass( pParent, panelName ) |
|
{ |
|
SetPaintBackgroundEnabled( false ); |
|
m_pBaseEntity = NULL; |
|
|
|
// FIXME: ComputeParent is yucky... can we be rid of it? |
|
if (!pParent) |
|
{ |
|
ComputeParent(); |
|
} |
|
|
|
m_szMouseOverText[ 0 ] = 0; |
|
|
|
// Send mouse inputs (but not cursorenter/exit for now) up to parent |
|
SetReflectMouse( true ); |
|
|
|
m_bShowInNormal = false; |
|
|
|
m_flScale = 0; |
|
m_OffsetX = 0; |
|
m_OffsetY = 0; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Attach to a new entity |
|
//----------------------------------------------------------------------------- |
|
void CEntityPanel::SetEntity( C_BaseEntity* pEntity ) |
|
{ |
|
m_pBaseEntity = pEntity; |
|
|
|
// Recompute position |
|
OnTick(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CEntityPanel::ComputeParent( void ) |
|
{ |
|
vgui::VPANEL parent = NULL; |
|
|
|
if ( IsLocalPlayerInTactical() || !m_bShowInNormal ) |
|
{ |
|
CClientModeCommander *commander = ( CClientModeCommander * )ClientModeCommander(); |
|
Assert( commander ); |
|
parent = commander->GetCommanderOverlayPanel()->GetVPanel(); |
|
} |
|
else |
|
{ |
|
parent = enginevgui->GetPanel( PANEL_CLIENTDLL ); |
|
} |
|
if ( !GetParent() || ( GetParent()->GetVPanel() != parent ) ) |
|
{ |
|
SetParent( parent ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Compute the size of the panel based upon the commander's zoom level |
|
//----------------------------------------------------------------------------- |
|
void CEntityPanel::ComputeAndSetSize( void ) |
|
{ |
|
m_flScale = 1.0; |
|
|
|
// Scale the image |
|
// Use different scales in tactical / normal |
|
if ( IsLocalPlayerInTactical() ) |
|
{ |
|
CClientModeCommander *commander = ( CClientModeCommander * )ClientModeCommander(); |
|
Assert( commander ); |
|
float flZoom = commander->GetCommanderOverlayPanel()->GetZoom(); |
|
|
|
// Scale our size |
|
m_flScale = 0.75 + (0.25 * (1.0 - flZoom)); // 1/2 size at max zoomed out, full size by half zoomed in |
|
} |
|
else if ( m_pBaseEntity ) |
|
{ |
|
// Get distance to entity |
|
float flDistance = (m_pBaseEntity->GetRenderOrigin() - MainViewOrigin()).Length(); |
|
flDistance *= 2; |
|
m_flScale = 0.25 + MAX( 0, 2.0 - (flDistance / 2048) ); |
|
} |
|
|
|
// Update the size |
|
int w = m_iOrgWidth * m_flScale; |
|
int h = m_iOrgHeight * m_flScale; |
|
SetSize( w,h ); |
|
|
|
// Update the offsets too |
|
m_OffsetX = m_iOrgOffsetX * m_flScale; |
|
m_OffsetY = m_iOrgOffsetY * m_flScale; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// initialization |
|
//----------------------------------------------------------------------------- |
|
bool CEntityPanel::Init( ::KeyValues* pInitData, C_BaseEntity* pEntity ) |
|
{ |
|
Assert( pInitData && pEntity ); |
|
m_pBaseEntity = pEntity; |
|
|
|
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; |
|
|
|
const char *mouseover = pInitData->GetString( "mousehint", "" ); |
|
if ( mouseover && mouseover[ 0 ] ) |
|
{ |
|
Q_strncpy( m_szMouseOverText, mouseover, sizeof( m_szMouseOverText ) ); |
|
} |
|
|
|
SetSize( w, h ); |
|
|
|
m_iOrgWidth = w; |
|
m_iOrgHeight = h; |
|
m_iOrgOffsetX = m_OffsetX; |
|
m_iOrgOffsetY = m_OffsetY; |
|
|
|
// we need updating |
|
vgui::ivgui()->AddTickSignal( GetVPanel() ); |
|
return true; |
|
} |
|
|
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Determine where our entity is in screen space. |
|
//----------------------------------------------------------------------------- |
|
void CEntityPanel::GetEntityPosition( int& sx, int& sy ) |
|
{ |
|
if (!m_pBaseEntity) |
|
{ |
|
sx = sy = -1.0f; |
|
return; |
|
} |
|
|
|
GetTargetInScreenSpace( m_pBaseEntity, sx, sy ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Should we draw?. |
|
//----------------------------------------------------------------------------- |
|
bool CEntityPanel::ShouldDraw() |
|
{ |
|
return ( ( IsLocalPlayerInTactical() && ClientModeCommander()->ShouldDrawEntity( m_pBaseEntity ) ) || |
|
( !IsLocalPlayerInTactical() && m_bShowInNormal) ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// called when we're ticked... |
|
//----------------------------------------------------------------------------- |
|
void CEntityPanel::OnTick() |
|
{ |
|
// Determine if panel parent should switch |
|
ComputeParent(); |
|
|
|
// If we should shouldn't draw, don't bother with any of this |
|
if ( !ShouldDraw() ) |
|
return; |
|
|
|
// Update our current position |
|
int sx, sy; |
|
GetEntityPosition( sx, sy ); |
|
|
|
// Recalculate our size |
|
ComputeAndSetSize(); |
|
|
|
// Set the position |
|
SetPos( (int)(sx + m_OffsetX + 0.5f), (int)(sy + m_OffsetY + 0.5f)); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CEntityPanel::OnCursorEntered() |
|
{ |
|
if ( m_szMouseOverText[ 0 ] ) |
|
{ |
|
StatusPrint( TYPE_HINT, "%s", m_szMouseOverText ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CEntityPanel::OnCursorExited() |
|
{ |
|
if ( m_szMouseOverText[ 0 ] ) |
|
{ |
|
StatusClear(); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Output : char const |
|
//----------------------------------------------------------------------------- |
|
const char *CEntityPanel::GetMouseOverText( void ) |
|
{ |
|
return m_szMouseOverText; |
|
}
|
|
|