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.
184 lines
5.1 KiB
184 lines
5.1 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose: Target reticle hud element
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
#include "cbase.h"
|
||
|
#include "hud.h"
|
||
|
#include "c_basetfplayer.h"
|
||
|
#include "tf_shareddefs.h"
|
||
|
#include "iclientmode.h"
|
||
|
#include "clientmode_tfnormal.h"
|
||
|
#include "materialsystem/imaterial.h"
|
||
|
#include "materialsystem/imesh.h"
|
||
|
#include "hud_targetreticle.h"
|
||
|
#include "model_types.h"
|
||
|
#include "view_scene.h"
|
||
|
#include "view.h"
|
||
|
#include <vgui/Cursor.h>
|
||
|
#include <vgui_controls/Controls.h>
|
||
|
#include <vgui/ISurface.h>
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CTargetReticle::CTargetReticle( void )
|
||
|
: BaseClass( NULL, "CTargetReticle" ),
|
||
|
m_CursorNone(vgui::dc_none)
|
||
|
{
|
||
|
SetCursor( m_CursorNone );
|
||
|
|
||
|
SetPaintBackgroundEnabled( false );
|
||
|
SetAutoDelete( false );
|
||
|
m_hTargetEntity = NULL;
|
||
|
m_pTargetLabel = NULL;
|
||
|
m_iReticleId = 0;
|
||
|
m_iReticleLeftId = 0;
|
||
|
m_iReticleRightId = 0;
|
||
|
m_iRenderTextureId = 0;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CTargetReticle::~CTargetReticle()
|
||
|
{
|
||
|
if ( m_pTargetLabel != NULL )
|
||
|
{
|
||
|
delete m_pTargetLabel;
|
||
|
m_pTargetLabel = NULL;
|
||
|
}
|
||
|
|
||
|
SetParent( (vgui::Panel *)NULL );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CTargetReticle::Init( C_BaseEntity *pEntity, const char *sName )
|
||
|
{
|
||
|
vgui::Panel *pParent = GetClientModeNormal()->GetViewport();
|
||
|
SetParent( pParent );
|
||
|
SetCursor( pParent->GetCursor() );
|
||
|
|
||
|
if ( !m_pTargetLabel )
|
||
|
{
|
||
|
m_pTargetLabel = new vgui::Label( pParent, "TargetLabel", "Unnamed" );
|
||
|
m_pTargetLabel->SetPos( 0, 0 );
|
||
|
m_pTargetLabel->SetFgColor( Color( 255, 170, 0, 255 ) );
|
||
|
m_pTargetLabel->SetPaintBackgroundEnabled( false );
|
||
|
m_pTargetLabel->SetAutoDelete( false );
|
||
|
m_pTargetLabel->SetCursor( m_CursorNone );
|
||
|
}
|
||
|
|
||
|
SetSize( XRES(32),YRES(32) );
|
||
|
m_hTargetEntity = pEntity;
|
||
|
m_pTargetLabel->SetText( sName );
|
||
|
|
||
|
int contentW, contentH;
|
||
|
m_pTargetLabel->GetContentSize( contentW, contentH );
|
||
|
m_pTargetLabel->SetWide( contentW );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
C_BaseEntity *CTargetReticle::GetTarget( void )
|
||
|
{
|
||
|
return m_hTargetEntity;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CTargetReticle::Update( void )
|
||
|
{
|
||
|
if ( !m_hTargetEntity )
|
||
|
{
|
||
|
C_BaseTFPlayer *pPlayer = C_BaseTFPlayer::GetLocalPlayer();
|
||
|
pPlayer->Remove_Target( this );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Load our textures..
|
||
|
if ( !m_iReticleId )
|
||
|
{
|
||
|
m_iReticleId = vgui::surface()->CreateNewTextureID();
|
||
|
vgui::surface()->DrawSetTextureFile( m_iReticleId, "Hud/target_reticle" , true, false);
|
||
|
}
|
||
|
|
||
|
if ( !m_iReticleLeftId )
|
||
|
{
|
||
|
m_iReticleLeftId = vgui::surface()->CreateNewTextureID();
|
||
|
vgui::surface()->DrawSetTextureFile( m_iReticleLeftId, "Hud/target_reticle_left", true, false );
|
||
|
}
|
||
|
|
||
|
if ( !m_iReticleRightId )
|
||
|
{
|
||
|
m_iReticleRightId = vgui::surface()->CreateNewTextureID();
|
||
|
vgui::surface()->DrawSetTextureFile( m_iReticleRightId, "Hud/target_reticle_right" , true, false);
|
||
|
}
|
||
|
|
||
|
int iX, iY;
|
||
|
GetTargetInScreenSpace( m_hTargetEntity, iX, iY );
|
||
|
|
||
|
int halfWidth = GetWide() / 2;
|
||
|
halfWidth = MAX( halfWidth, m_pTargetLabel->GetWide() / 2 );
|
||
|
|
||
|
m_iRenderTextureId = m_iReticleId;
|
||
|
if( iX < halfWidth || iX > ScreenWidth()-halfWidth )
|
||
|
{
|
||
|
// It's off the screen. See what side it's on.
|
||
|
Vector vCenter = m_hTargetEntity->WorldSpaceCenter( );
|
||
|
|
||
|
if( CurrentViewRight().Dot( vCenter - CurrentViewOrigin() ) > 0 )
|
||
|
{
|
||
|
m_iRenderTextureId = m_iReticleRightId;
|
||
|
iX = ScreenWidth() - halfWidth;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_iRenderTextureId = m_iReticleLeftId;
|
||
|
iX = halfWidth;
|
||
|
}
|
||
|
|
||
|
// Put Y in the center of the screen.
|
||
|
iY = ScreenHeight() / 2;
|
||
|
}
|
||
|
|
||
|
// Move the icon there
|
||
|
SetPos( iX - (GetWide() / 2), iY - (GetTall() / 2) );
|
||
|
|
||
|
// Center the text under it
|
||
|
m_pTargetLabel->SetPos( iX - (m_pTargetLabel->GetWide() / 2), iY + (GetTall() / 2) );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CTargetReticle::Paint()
|
||
|
{
|
||
|
if ( !m_hTargetEntity || !m_iRenderTextureId )
|
||
|
return;
|
||
|
|
||
|
C_BaseTFPlayer *pPlayer = C_BaseTFPlayer::GetLocalPlayer();
|
||
|
if ( pPlayer == NULL || pPlayer->GetHealth() < 1 )
|
||
|
return;
|
||
|
|
||
|
// Show hide label based on EMP state
|
||
|
bool suppress_reticle = pPlayer->HasPowerup(POWERUP_EMP);
|
||
|
|
||
|
m_pTargetLabel->SetVisible( suppress_reticle ? false : true );
|
||
|
|
||
|
// Don't draw the reticle either
|
||
|
if ( suppress_reticle )
|
||
|
return;
|
||
|
|
||
|
vgui::surface()->DrawSetTexture( m_iRenderTextureId );
|
||
|
vgui::surface()->DrawSetColor( 255, 255, 255, 255 );
|
||
|
vgui::surface()->DrawTexturedRect( 0, 0, GetWide(), GetTall() );
|
||
|
}
|
||
|
|