source-engine/game/client/dod/dod_hud_crosshair.cpp
2022-04-16 12:05:19 +03:00

184 lines
4.3 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "hudelement.h"
#include <vgui_controls/Panel.h>
#include <vgui/ISurface.h>
#include "clientmode.h"
#include "c_dod_player.h"
#include "dod_hud_crosshair.h"
#include "materialsystem/imaterial.h"
#include "materialsystem/imesh.h"
#include "materialsystem/imaterialvar.h"
#include "mathlib/mathlib.h"
ConVar cl_crosshair_red( "cl_crosshair_red", "200", FCVAR_ARCHIVE );
ConVar cl_crosshair_green( "cl_crosshair_green", "200", FCVAR_ARCHIVE );
ConVar cl_crosshair_blue( "cl_crosshair_blue", "200", FCVAR_ARCHIVE );
ConVar cl_crosshair_alpha( "cl_crosshair_alpha", "200", FCVAR_ARCHIVE );
ConVar cl_crosshair_file( "cl_crosshair_file", "crosshair1", FCVAR_ARCHIVE );
ConVar cl_crosshair_scale( "cl_crosshair_scale", "32.0", FCVAR_ARCHIVE );
ConVar cl_crosshair_approach_speed( "cl_crosshair_approach_speed", "0.015" );
ConVar cl_dynamic_crosshair( "cl_dynamic_crosshair", "1", FCVAR_ARCHIVE );
using namespace vgui;
DECLARE_HUDELEMENT( CHudDODCrosshair );
CHudDODCrosshair::CHudDODCrosshair( const char *pName ) :
vgui::Panel( NULL, "HudDODCrosshair" ), CHudElement( pName )
{
SetParent( g_pClientMode->GetViewport() );
SetHiddenBits( HIDEHUD_PLAYERDEAD );
m_szPreviousCrosshair[0] = '\0';
m_pFrameVar = NULL;
m_flAccuracy = 0.1;
}
void CHudDODCrosshair::ApplySchemeSettings( IScheme *scheme )
{
BaseClass::ApplySchemeSettings( scheme );
SetSize( ScreenWidth(), ScreenHeight() );
}
void CHudDODCrosshair::LevelShutdown( void )
{
// forces m_pFrameVar to recreate next map
m_szPreviousCrosshair[0] = '\0';
if ( m_pCrosshair )
{
delete m_pCrosshair;
m_pCrosshair = NULL;
}
if ( m_pFrameVar )
{
delete m_pFrameVar;
m_pFrameVar = NULL;
}
}
void CHudDODCrosshair::Init()
{
m_iCrosshairTextureID = vgui::surface()->CreateNewTextureID();
}
bool CHudDODCrosshair::ShouldDraw()
{
C_DODPlayer *pPlayer = C_DODPlayer::GetLocalDODPlayer();
if ( !pPlayer )
return false;
CWeaponDODBase *pWeapon = pPlayer->GetActiveDODWeapon();
if ( !pWeapon )
return false;
return pWeapon->ShouldDrawCrosshair();
}
void CHudDODCrosshair::Paint()
{
C_DODPlayer *pPlayer = C_DODPlayer::GetLocalDODPlayer();
if( !pPlayer )
return;
const char *crosshairfile = cl_crosshair_file.GetString();
if ( !crosshairfile )
return;
if ( Q_stricmp( m_szPreviousCrosshair, crosshairfile ) != 0 )
{
char buf[256];
Q_snprintf( buf, sizeof(buf), "vgui/crosshairs/%s", crosshairfile );
vgui::surface()->DrawSetTextureFile( m_iCrosshairTextureID, buf, true, false );
if ( m_pCrosshair )
{
delete m_pCrosshair;
}
m_pCrosshair = vgui::surface()->DrawGetTextureMatInfoFactory( m_iCrosshairTextureID );
if ( !m_pCrosshair )
return;
if ( m_pFrameVar )
{
delete m_pFrameVar;
}
bool bFound = false;
m_pFrameVar = m_pCrosshair->FindVarFactory( "$frame", &bFound );
Assert( bFound );
m_nNumFrames = m_pCrosshair->GetNumAnimationFrames();
// save the name to compare with the cvar in the future
Q_strncpy( m_szPreviousCrosshair, crosshairfile, sizeof(m_szPreviousCrosshair) );
}
if ( m_pFrameVar )
{
if ( cl_dynamic_crosshair.GetBool() == false )
{
m_pFrameVar->SetIntValue( 0 );
}
else
{
CWeaponDODBase *pWeapon = pPlayer->GetActiveDODWeapon();
if ( !pWeapon )
return;
float accuracy = pWeapon->GetWeaponAccuracy( pPlayer->GetAbsVelocity().Length2D() );
float flMin = 0.02;
float flMax = 0.125;
accuracy = clamp( accuracy, flMin, flMax );
// approach this accuracy from our current accuracy
m_flAccuracy = Approach( accuracy, m_flAccuracy, cl_crosshair_approach_speed.GetFloat() );
float flFrame = RemapVal( m_flAccuracy, flMin, flMax, 0, m_nNumFrames-1 );
m_pFrameVar->SetIntValue( (int)flFrame );
}
}
Color clr( cl_crosshair_red.GetInt(), cl_crosshair_green.GetInt(), cl_crosshair_blue.GetInt(), 255 );
int screenWide, screenTall;
GetHudSize(screenWide, screenTall);
int iX = screenWide / 2;
int iY = screenTall / 2;
int iWidth, iHeight;
iWidth = iHeight = cl_crosshair_scale.GetInt();
vgui::surface()->DrawSetColor( clr );
vgui::surface()->DrawSetTexture( m_iCrosshairTextureID );
vgui::surface()->DrawTexturedRect( iX-iWidth, iY-iHeight, iX+iWidth, iY+iHeight );
vgui::surface()->DrawSetTexture(0);
}