summaryrefslogtreecommitdiff
path: root/game/client/tf2/minimap_trace.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/tf2/minimap_trace.cpp')
-rw-r--r--game/client/tf2/minimap_trace.cpp323
1 files changed, 323 insertions, 0 deletions
diff --git a/game/client/tf2/minimap_trace.cpp b/game/client/tf2/minimap_trace.cpp
new file mode 100644
index 0000000..c75afa3
--- /dev/null
+++ b/game/client/tf2/minimap_trace.cpp
@@ -0,0 +1,323 @@
+//========= 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 );
+}