//====== Copyright © 1996-2008, Valve Corporation, All rights reserved. ======= // // Purpose: Add entities to this system, and the Locator will maintain an arrow // on the HUD that points to the entities when they are offscreen. // //============================================================================= #ifndef L4D_HUD_LOCATOR_H #define L4D_HUD_LOCATOR_H #ifdef _WIN32 #pragma once #endif #include "vgui_controls/PHandle.h" #define MAX_LOCATOR_BINDINGS_SHOWN 8 #define MAX_LOCATOR_TARGETS 10 #define LOCATOR_FLAGS_NONE 0x00000000 #define LOCATOR_ICON_FX_NONE 0x00000000 #define LOCATOR_ICON_FX_PULSE_SLOW 0x00000001 #define LOCATOR_ICON_FX_PULSE_FAST 0x00000002 #define LOCATOR_ICON_FX_PULSE_URGENT 0x00000004 #define LOCATOR_ICON_FX_ALPHA_SLOW 0x00000008 #define LOCATOR_ICON_FX_ALPHA_FAST 0x00000010 #define LOCATOR_ICON_FX_ALPHA_URGENT 0x00000020 #define LOCATOR_ICON_FX_SHAKE_NARROW 0x00000040 #define LOCATOR_ICON_FX_SHAKE_WIDE 0x00000080 #define LOCATOR_ICON_FX_STATIC 0x00000100 // This icon draws at a fixed location on the HUD. #define LOCATOR_ICON_FX_NO_OFFSCREEN 0x00000200 #define LOCATOR_ICON_FX_FORCE_CAPTION 0x00000400 // Always draw the caption, even when the icon is occluded. #define LOCATOR_ICON_FX_FADE_OUT 0x00000800 // Set when deactivated so it can smoothly vanish #define LOCATOR_ICON_FX_FADE_IN 0x00001000 // Set when activated so it can smoothly appear #define LOCATOR_ICON_FX_SCALE_BY_DIST 0x00002000 // Scales the icon in the world by how far away it is #define LOCATOR_ICON_FX_SCALE_LARGE 0x00004000 // Scales the icon triple the normal size #include "tier1/utlsymbol.h" // See comments in UtlSymbol on why this is useful DECLARE_PRIVATE_SYMBOLTYPE( CGameInstructorSymbol ); //----------------------------------------------------------------------------- // This class represents a single target to be tracked by the locator //----------------------------------------------------------------------------- class CLocatorTarget { public: bool m_bOriginInScreenspace; Vector m_vecOrigin; // The location in the world to draw on the locator // ONLY the locator panel should fiddle with these fields. bool m_isActive; int m_serialNumber; int m_frameLastUpdated; bool m_bOnscreen; bool m_bOccluded; bool m_bVisible; bool m_bIsDrawing; bool m_bIconNoTarget; float m_distFromPlayer; CHudTexture *m_pIcon_onscreen; CHudTexture *m_pIcon_offscreen; int m_iBindingTick; float m_flNextBindingTick; float m_flNextOcclusionTest; int m_iBindingChoicesCount; const char *(m_pchBindingChoices[ MAX_LOCATOR_BINDINGS_SHOWN ]); int m_iBindChoicesOriginalToken[ MAX_LOCATOR_BINDINGS_SHOWN ]; // Fields for drawing int m_targetX; // screen X position of the actual target int m_targetY; // screen Y position of the actual target int m_iconX; // screen X position (top) int m_iconY; // screen Y position (left) int m_centerX; // screen X position (center) int m_centerY; // screen Y position (center) int m_wide; // draw width of icon (may be different from frame to frame as the icon's size animates, for instance) int m_tall; // draw height of icon '' '' float m_widthScale_onscreen; // for icons that are wider than standard int m_alpha; // float m_fadeStart; // time stamp when fade out started float m_lerpStart; // time stamp when lerping started float m_pulseStart; // time stamp when pulsing started int m_declutterIndex; // sort order from the declutterer int m_lastDeclutterIndex; // last sort order from the declutterer bool m_bDrawArrow; // Whether to draw an arrow indicating this target is off-screen float m_fDrawArrowAngle; // Direction of the offscreen arrow (up, left, etc.) int m_captionWide; // How wide (pixels) my caption is. bool m_bDrawControllerButton; bool m_bDrawControllerButtonOffscreen; int m_offsetX; // User-specified X offset which is applied in screenspace int m_offsetY; // User-specified Y offset which is applied in screenspace // Fields for interpolating icon position float m_flTimeLerpDone; // How much time left before this icon arrives where it is supposed to be. int m_lastXPos; // screen X position last frame int m_lastYPos; // '' Y CLocatorTarget( void ); void Activate( int serialNumber ); void Deactivate( bool bNoFade = false ); void Update(); int GetIconX( void ); int GetIconY( void ); int GetIconCenterX( void ); int GetIconCenterY( void ); int GetIconWidth( void ); int GetIconHeight( void ); void AddIconEffects( int add ) { m_iEffectsFlags |= add; } void RemoveIconEffects( int remove ) { m_iEffectsFlags &= ~remove; } int GetIconEffectsFlags() { return m_iEffectsFlags; } void SetIconColor( Color color ) { m_rgbaIconColor = color; } Color GetIconColor( void ) const { return m_rgbaIconColor; } void SetCaptionColor( Color col ) { m_captionColor = col; } void SetCaptionColor( const char *pszCaptionColor ); bool IsStatic(); bool IsPresenting(); void StartTimedLerp(); void StartPresent(); void EndPresent(); void UpdateVguiTarget( void ); vgui::Panel *GetVguiTarget( void ); void SetVguiTargetName( const char *pchVguiTargetName ); const char *GetVguiTargetName( void ) { return m_szVguiTargetName.String(); } void SetVguiTargetLookup( const char *pchVguiTargetLookup ); const char *GetVguiTargetLookup( void ) { return m_szVguiTargetLookup.String(); } void SetVguiTargetEdge( int nVguiEdge ); int GetVguiTargetEdge( void ) const { return m_nVguiTargetEdge; } void SetOnscreenIconTextureName( const char *pszTexture ); void SetOffscreenIconTextureName( const char *pszTexture ); void SetBinding( const char *pszBinding ); void SetSteamControllerBindingToOrigin( EControllerActionOrigin *pOrigins, int nOriginalToken, const char *pszActionName ); const char *UseBindingImage( char *pchIconTextureName, size_t bufSize ); void SetIconNoTarget( bool bIconNoTarget ) { m_bIconNoTarget = bIconNoTarget; } const char *GetOnscreenIconTextureName() { return m_szOnscreenTexture.String(); } const char *GetOffscreenIconTextureName() { return m_szOffscreenTexture.String(); } const char *GetBinding() { return m_szBinding.String(); } void SetVisible( bool bVisible ); bool IsVisible( void ); void SetCaptionText( const char *pszText, const char *pszParam ); const wchar_t *GetCaptionText( void ) { return (const wchar_t *)m_wszCaption.Base(); } bool HasCaptionText( void ) { return m_wszCaption.Count() > 1; } void DrawBindingName( const char *pchDrawName ) { m_pchDrawBindingName = pchDrawName; } void DrawBindingNameOffscreen( const char *pchDrawName ) { m_pchDrawBindingNameOffscreen = pchDrawName; } const char *DrawBindingName( void ) { return m_pchDrawBindingName; } const char *DrawBindingNameOffscreen( void ) { return m_pchDrawBindingNameOffscreen; } bool IsOnScreen() { return m_bOnscreen; } bool IsOccluded() { return m_bOccluded; } private: CGameInstructorSymbol m_szVguiTargetName; CGameInstructorSymbol m_szVguiTargetLookup; vgui::DHANDLE m_hVguiTarget; int m_nVguiTargetEdge; CGameInstructorSymbol m_szOnscreenTexture; CGameInstructorSymbol m_szOffscreenTexture; CGameInstructorSymbol m_szBinding; bool m_bWasControllerLast; bool m_bWasSteamControllerLast; const char *m_pchDrawBindingName; const char *m_pchDrawBindingNameOffscreen; int m_iEffectsFlags; Color m_rgbaIconColor; CUtlVector< wchar_t > m_wszCaption; public: Color m_captionColor; }; extern int Locator_AddTarget(); extern void Locator_RemoveTarget( int hTarget ); CLocatorTarget *Locator_GetTargetFromHandle( int hTarget ); void Locator_ComputeTargetIconPositionFromHandle( int hTarget ); #endif // L4D_HUD_LOCATOR_H