Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.

237 lines
6.3 KiB

5 years ago
//========= 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;
}