Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.

272 lines
8.7 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $Workfile: $
// $NoKeywords: $
//=============================================================================//
#if !defined( HUD_MINIMAP_H )
#define HUD_MINIMAP_H
#ifdef _WIN32
#pragma once
#endif
#include "mathlib/vector.h"
#include "cdll_client_int.h"
#include "hudelement.h"
#include "utllinkedlist.h"
#include "CommanderOverlay.h"
#include "MapData.h"
class BitmapImage;
class CTextHelpPanel;
//-----------------------------------------------------------------------------
// This interfaces gets called when a click occurs in the minimap
//-----------------------------------------------------------------------------
class IMinimapClient
{
public:
virtual void MinimapClicked( const Vector& clickWorldPos ) = 0;
};
//-----------------------------------------------------------------------------
// Ways to perform WorldToMinimap
//-----------------------------------------------------------------------------
enum MinimapPosType_t
{
MINIMAP_NOCLIP = 0, // Don't draw things off the minimap
MINIMAP_CLAMP, // Clamp the position to lie within the minimap
MINIMAP_CLIP, // Clip the vector from minimap center to object
// to the minimap bounds and put the object on the edge
MINIMAP_ALWAYS_ACCEPT // Just do the scaling and return a value - don't worry about clipping.
};
//-----------------------------------------------------------------------------
// Purpose: On the left side of the screen is an overview map and a highlight
// rectangle showing the current viewport
//
// NOTE: The minimap panel is architected in such a way as to view some global
// state. There can be many instances of the minimap panel
//-----------------------------------------------------------------------------
class CMinimapPanel : public CHudElement, public vgui::Panel
{
DECLARE_CLASS_SIMPLE( CMinimapPanel, vgui::Panel );
public:
enum
{
STABLE = 0,
GROWING,
SHRINKING
};
CMinimapPanel( const char *pElementName );
virtual ~CMinimapPanel( void );
void Init( IMinimapClient* pClient = NULL );
virtual void LevelInit( const char *mapname );
virtual void LevelShutdown( void );
virtual void ApplySchemeSettings( vgui::IScheme *scheme );
virtual void OnMousePressed(vgui::MouseCode code);
virtual void Paint();
virtual void OnTick();
virtual void OnThink();
virtual void OnSizeChanged( int w, int h );
// Converts a world-space position to a coordinate in minimap panel space
bool WorldToMinimap( MinimapPosType_t posType, const Vector &pos, float& outx, float& outy );
// The following methods deal with management of the minimap data
static vgui::Panel *MinimapRootPanel();
static CMinimapPanel *MinimapPanel();
// Call this when the minimap panel is going to be drawn...
void Activate();
// 0 is minimized and won't draw zoom details, 1.0 is fully maximized
bool ShouldDrawZoomDetails( int& alpha );
bool InternalWorldToMinimap( MinimapPosType_t posType, const Vector &pos, const Vector& origin, float zoomscale, float& outx, float& outy );
static void Zoom_Minimap_f( void );
void ZoomIn( void );
void ToggleMinimap( void );
void SetMinimapZoom( bool bZoom);
virtual void ProcessInput( void );
float GetAdjustedZoom( void );
float GetTrueZoom( void );
// Handler for our message
void MsgFunc_MinimapPulse( bf_read &msg );
private:
void SetBackgroundMaterials( char const* pMaterialName );
void GetMapOriginAndScale( Vector& origin, float& scale );
void SetBackgroundViewport( float minx, float miny, float maxx, float maxy, bool includedetails );
void PaintActOverlays( int teamIndex, int alpha );
void AdjustNormalizedPositionForAspectRatio( float& x, float& y );
void DrawVisibleArea( void );
void ComputeMapOrigin( Vector& origin );
void InitOverlays( const char *materialrootname );
void ShutdownOverlays( void );
vgui::Panel *GetTextPaintPanel( void );
void InvokeOnTickOnChildren( vgui::Panel *parent );
bool m_DrawVisibleArea;
IMinimapClient *m_pClient;
CPanelAnimationVar( float, m_flExpansionFrac, "ExpansionFrac", "0" );
CPanelAnimationVar( float, m_flDetailsAlpha, "DetailsAlpha", "0" );
CPanelAnimationVar( float, m_flMapScale, "MapScale", "2000" );
CPanelAnimationVar( float, m_flZoomAmount, "ZoomAmount", "1.0" );
CPanelAnimationVar( float, m_flCenterOnPlayer, "CenterOnPlayer", "1" );
CPanelAnimationVar( float, m_flInsetPixels, "InsetPixels", "16" );
float m_flPrevZoomAmount;
CPanelAnimationVar( Color, m_BackgroundColor, "BackgroundColor", "Black" );
CPanelAnimationVar( Color, m_BorderColor, "BorderColor", "FgColor" );
int m_nZoomLevel;
bool m_bMinimapZoomed;
int m_nCurrentAct;
float m_flZoomAdjust; // Adjustment needed to get map to fit exactly into box in one dimension assuming
// m_flZoomAmount == 1.0f
enum
{
NUM_WIDTHS = 2,
};
// Calculated once per frame and cached
Vector m_vecCurrentOrigin;
Vector m_vecMapCenter;
float m_flMapAspectRatio;
float m_flViewportAspectRatio;
// map aspect / viewport aspect
float m_flAspectAdjustment;
float m_flNormalizedXScale;
float m_flNormalizedYScale;
float m_flNormalizedXOffset;
float m_flNormalizedYOffset;
// These are the wordspace corners of the minimap
float m_flWorldSpaceBounds[ 4 ];
// These are the above, except clamped to actual world mins/maxs
float m_flClippedWorldSpaceBounds[ 4 ];
// These are used to clamp the map origin to keep the zoomed map from scrolling off screen
float m_flWorldSpaceInsets[ 4 ];
enum
{
MAX_ACTS = 16,
MAX_ACT_TEAMS = 2
};
struct Overlays
{
bool m_bInUse;
BitmapImage *m_pOverlay;
BitmapImage *m_pText;
};
BitmapImage *m_pBackground[ MAX_ACT_TEAMS ];
Overlays m_rgOverlays[ MAX_ACT_TEAMS ][ MAX_ACTS ];
CTextHelpPanel *m_pTextPanel;
vgui::Panel *m_pBackgroundPanel;
};
//-----------------------------------------------------------------------------
// minimap render order
//-----------------------------------------------------------------------------
enum
{
MINIMAP_GROUND_LINES = 0,
MINIMAP_RESOURCE_ZONES,
MINIMAP_OBJECTS,
MINIMAP_SPY_CAMERAS,
MINIMAP_COLLECTORS,
MINIMAP_MAP_GOALS,
MINIMAP_PLAYERS,
MINIMAP_LOCAL_PLAYER,
MINIMAP_SNIPER_RESPAWN,
MINIMAP_PERSONAL_ORDERS
};
//-----------------------------------------------------------------------------
// Instantiate a temporary trace (position based, or entity based)
//-----------------------------------------------------------------------------
void MinimapCreateTempTrace( const char* pMetaClassName, int sortOrder, const Vector &vecPosition );
void MinimapCreateTempTrace( const char* pMetaClassName, int sortOrder, C_BaseEntity *pEntity, const Vector &vecOffset );
//-----------------------------------------------------------------------------
// Helper macro to make overlay factories one line of code. Use like this:
// DECLARE_MINIMAP_FACTORY( CEntityImagePanel, "image" );
//-----------------------------------------------------------------------------
struct MinimapInitData_t
{
C_BaseEntity *m_pEntity;
Vector m_vecPosition; // relative to m_pEntity if it's specified, otherwise absolute position
MinimapInitData_t() : m_pEntity(NULL), m_vecPosition( 0, 0, 0 ) {}
MinimapInitData_t( C_BaseEntity *pEntity ) : m_pEntity(pEntity), m_vecPosition( 0, 0, 0 ) {}
};
#define DECLARE_MINIMAP_FACTORY( _PanelClass, _nameString ) \
DECLARE_PANEL_FACTORY( _PanelClass, MinimapInitData_t, _nameString )
//-----------------------------------------------------------------------------
// Macros for help with simple registration of minimap
// Put DECLARE_MINIMAP_PANEL() in your class definition
// and CONSTRUCT_MINIMAP_PANEL( "panelname", SORT_ORDER ) in your class constructor
//-----------------------------------------------------------------------------
#define DECLARE_MINIMAP_PANEL( ) DECLARE_METACLASS_PANEL( m_MinimapTrace )
#define CONSTRUCT_MINIMAP_PANEL( _name, _sortorder ) \
MinimapInitData_t _traceInit( this ); \
CONSTRUCT_METACLASS_PANEL( m_MinimapTrace, _name, CMinimapPanel::MinimapRootPanel(), _sortorder, &_traceInit )
#define DESTRUCT_MINIMAP_PANEL( ) \
DESTRUCT_METACLASS_PANEL( m_MinimapTrace )
#define IS_MINIMAP_PANEL_DEFINED( ) ( m_MinimapTrace.GetPanel() != NULL )
// Kind of a hack; assumes all minimap panels inherit from CMinimapTracePanel, but that's reasonable..
#define SET_MINIMAP_PANEL_VISIBILITY( _visible ) \
do \
{ \
if (m_MinimapTrace.GetPanel()) \
{ \
static_cast<CMinimapTracePanel*>(m_MinimapTrace.GetPanel())->SetTraceVisibility( _visible ); \
} \
} while (0)
#endif // HUD_MINIMAP_H