//========= 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 #include #include //----------------------------------------------------------------------------- // 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() ); }