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.
324 lines
8.8 KiB
324 lines
8.8 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
#include "cbase.h"
|
||
|
#include "hud.h"
|
||
|
#include "minimap_trace.h"
|
||
|
#include "c_basetfplayer.h"
|
||
|
#include "mapdata.h"
|
||
|
#include "model_types.h"
|
||
|
#include "clientmode_tfnormal.h"
|
||
|
#include <vgui/IVGui.h>
|
||
|
#include "vgui_bitmapimage.h"
|
||
|
#include <KeyValues.h>
|
||
|
#include "VGuiMatSurface/IMatSystemSurface.h"
|
||
|
#include "shareddefs.h"
|
||
|
#include "engine/ivmodelinfo.h"
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Constructor, destructor
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CMinimapTracePanel::CMinimapTracePanel( vgui::Panel *parent, const char *panelName)
|
||
|
: BaseClass( parent, "CMinimapTracePanel" )
|
||
|
{
|
||
|
m_pEntity = NULL;
|
||
|
SetPaintBackgroundEnabled( false );
|
||
|
m_bCanScale = true;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CMinimapTracePanel::~CMinimapTracePanel()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Initialization
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CMinimapTracePanel::Init( KeyValues* pKeyValues, MinimapInitData_t* pInitData )
|
||
|
{
|
||
|
// NOTE: Can't use a EHANDLE here because the EHANDLE for pEntity is set up
|
||
|
// when AddEntity is called; this gets called before that happens
|
||
|
m_pEntity = pInitData->m_pEntity;
|
||
|
m_vecPosition = pInitData->m_vecPosition;
|
||
|
|
||
|
int w, h;
|
||
|
if (!ParseCoord(pKeyValues, "offset", m_OffsetX, m_OffsetY))
|
||
|
return false;
|
||
|
|
||
|
if (!ParseCoord(pKeyValues, "size", w, h ))
|
||
|
return false;
|
||
|
|
||
|
// Lifetime of the minimap trace
|
||
|
float flLifeTime = pKeyValues->GetFloat("lifetime", -1.0f);
|
||
|
if (flLifeTime > 0.0f)
|
||
|
m_flDeletionTime = gpGlobals->curtime + flLifeTime;
|
||
|
else
|
||
|
m_flDeletionTime = -1.0f;
|
||
|
|
||
|
// Optional parameters
|
||
|
m_bVisibleWhenZoomedIn = (pKeyValues->GetInt( "detail", 0 ) == 0 );
|
||
|
m_bClampToMap = (pKeyValues->GetInt( "clamp", 0 ) != 0);
|
||
|
m_bClipToMap = (pKeyValues->GetInt( "noclip", 0 ) == 0);
|
||
|
m_bCanScale = (pKeyValues->GetInt( "noscale", 0 ) == 0);
|
||
|
m_bVisible = true;
|
||
|
|
||
|
m_SizeW = w;
|
||
|
m_SizeH = h;
|
||
|
|
||
|
SetSize( w, h );
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Entity accessor
|
||
|
//-----------------------------------------------------------------------------
|
||
|
C_BaseEntity* CMinimapTracePanel::GetEntity()
|
||
|
{
|
||
|
return m_pEntity;
|
||
|
}
|
||
|
|
||
|
void CMinimapTracePanel::SetEntity( C_BaseEntity* pEntity )
|
||
|
{
|
||
|
m_pEntity = pEntity;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Sets the position of the trace in world space
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMinimapTracePanel::SetPosition( const Vector &vecPosition )
|
||
|
{
|
||
|
m_vecPosition = vecPosition;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Computes the entity position
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CMinimapTracePanel::GetEntityPosition( float &x, float &y )
|
||
|
{
|
||
|
C_BaseEntity *pEntity = GetEntity();
|
||
|
|
||
|
Vector pos;
|
||
|
if (!pEntity)
|
||
|
{
|
||
|
pos = m_vecPosition;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (pEntity == C_BaseTFPlayer::GetLocalPlayer())
|
||
|
{
|
||
|
// Use the predicted position...
|
||
|
pos = pEntity->GetAbsOrigin();
|
||
|
}
|
||
|
else if ( !pEntity->GetModel() || modelinfo->GetModelType( pEntity->GetModel() ) != mod_brush )
|
||
|
{
|
||
|
// If it's not a brush model, use the origin
|
||
|
pos = pEntity->GetRenderOrigin();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Vector mins, maxs;
|
||
|
pEntity->GetRenderBounds( mins, maxs );
|
||
|
pos = (mins + maxs) * 0.5f;
|
||
|
}
|
||
|
|
||
|
// Position is an offset when there's an entity
|
||
|
pos += m_vecPosition;
|
||
|
}
|
||
|
|
||
|
return CMinimapPanel::MinimapPanel()->WorldToMinimap( m_bClampToMap ? MINIMAP_CLIP : MINIMAP_NOCLIP, pos, x, y );
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Causes the minimap panel to not be visible
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMinimapTracePanel::SetTraceVisibility( bool bVisible )
|
||
|
{
|
||
|
m_bVisible = bVisible;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Call this before rendering to see if the entity should be rendered
|
||
|
// and to get the rendering position
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CMinimapTracePanel::ComputeVisibility( )
|
||
|
{
|
||
|
if (!m_bVisible)
|
||
|
return false;
|
||
|
|
||
|
C_BaseEntity* pEntity = GetEntity();
|
||
|
|
||
|
// No entity? We must be a positional trace
|
||
|
if (!pEntity)
|
||
|
return true;
|
||
|
|
||
|
// Don't draw if it's not in the PVS
|
||
|
if ( pEntity->IsDormant() )
|
||
|
return false;
|
||
|
|
||
|
// Check visible to tactical
|
||
|
if( !MapData().IsEntityVisibleToTactical(pEntity) )
|
||
|
return false;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// called when we're ticked...
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMinimapTracePanel::OnTick()
|
||
|
{
|
||
|
// Don't do anything when not in a game
|
||
|
if ( !engine->IsInGame() )
|
||
|
{
|
||
|
SetVisible( false );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Update our current position
|
||
|
float sx, sy;
|
||
|
bool onMap = GetEntityPosition( sx, sy );
|
||
|
|
||
|
int ofsx, ofsy;
|
||
|
ofsx = m_OffsetX;
|
||
|
ofsy = m_OffsetY;
|
||
|
|
||
|
if ( m_bCanScale )
|
||
|
{
|
||
|
int w, h;
|
||
|
GetSize( w, h );
|
||
|
|
||
|
float scale = CMinimapPanel::MinimapPanel()->GetTrueZoom();
|
||
|
if ( 1 || scale != 1.0f )
|
||
|
{
|
||
|
ofsx *= scale;
|
||
|
ofsy *= scale;
|
||
|
|
||
|
int sizew = m_SizeW * scale;
|
||
|
int sizeh = m_SizeH * scale;
|
||
|
|
||
|
SetPos( (int)(sx + ofsx + 0.5f), (int)(sy + ofsy + 0.5f));
|
||
|
SetSize( sizew, sizeh );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SetPos( (int)(sx + ofsx + 0.5f), (int)(sy + ofsy + 0.5f));
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SetPos( (int)(sx + ofsx + 0.5f), (int)(sy + ofsy + 0.5f));
|
||
|
}
|
||
|
|
||
|
// Update our visibility
|
||
|
if (!onMap)
|
||
|
SetVisible( false );
|
||
|
else
|
||
|
SetVisible( ComputeVisibility( ) );
|
||
|
|
||
|
if ((m_flDeletionTime >= 0.0f) && (gpGlobals->curtime >= m_flDeletionTime))
|
||
|
{
|
||
|
MarkForDeletion();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Computes a panel alpha based on zoom level...
|
||
|
//-----------------------------------------------------------------------------
|
||
|
float CMinimapTracePanel::ComputePanelAlpha()
|
||
|
{
|
||
|
if (m_bVisibleWhenZoomedIn)
|
||
|
return 1.0f;
|
||
|
|
||
|
int a;
|
||
|
if (!CMinimapPanel::MinimapPanel())
|
||
|
return 0.0f;
|
||
|
|
||
|
if (!CMinimapPanel::MinimapPanel()->ShouldDrawZoomDetails( a ))
|
||
|
return 0.0f;
|
||
|
|
||
|
return a / 255.0f;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
//
|
||
|
// A standard minimap panel that displays a bitmap
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DECLARE_MINIMAP_FACTORY( CMinimapTraceBitmapPanel, "minimap_image_panel" );
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Sets the bitmap and size
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CMinimapTraceBitmapPanel::Init( KeyValues* pKeyValues, MinimapInitData_t* pInitData )
|
||
|
{
|
||
|
if (!BaseClass::Init(pKeyValues, pInitData))
|
||
|
return false;
|
||
|
|
||
|
return m_Image.Init( GetVPanel(), pKeyValues );
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Performs the rendering...
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMinimapTraceBitmapPanel::Paint( )
|
||
|
{
|
||
|
if ( gHUD.IsHidden( HIDEHUD_MISCSTATUS ) )
|
||
|
return;
|
||
|
|
||
|
if (!m_bClipToMap)
|
||
|
g_pMatSystemSurface->DisableClipping( true );
|
||
|
m_Image.DoPaint( GetVPanel(), 0, ComputePanelAlpha() );
|
||
|
g_pMatSystemSurface->DisableClipping( false );
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
//
|
||
|
// A standard minimap renderable that displays a bitmap that changes when team changes
|
||
|
//
|
||
|
//-----------------------------------------------------------------------------
|
||
|
DECLARE_MINIMAP_FACTORY( CMinimapTraceTeamBitmapPanel, "minimap_team_image_panel" );
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Sets the bitmap and size
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CMinimapTraceTeamBitmapPanel::Init( KeyValues* pKeyValues, MinimapInitData_t* pInitData )
|
||
|
{
|
||
|
if (!BaseClass::Init(pKeyValues, pInitData))
|
||
|
return false;
|
||
|
|
||
|
return m_TeamImage.Init( this, pKeyValues, pInitData->m_pEntity );
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Performs the rendering...
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CMinimapTraceTeamBitmapPanel::Paint( )
|
||
|
{
|
||
|
if ( gHUD.IsHidden( HIDEHUD_MISCSTATUS ) )
|
||
|
return;
|
||
|
|
||
|
if (!m_bClipToMap)
|
||
|
g_pMatSystemSurface->DisableClipping( true );
|
||
|
m_TeamImage.SetAlpha( ComputePanelAlpha() );
|
||
|
m_TeamImage.Paint();
|
||
|
g_pMatSystemSurface->DisableClipping( false );
|
||
|
}
|