diff options
Diffstat (limited to 'game/client/tf2/paneleffect.cpp')
| -rw-r--r-- | game/client/tf2/paneleffect.cpp | 414 |
1 files changed, 414 insertions, 0 deletions
diff --git a/game/client/tf2/paneleffect.cpp b/game/client/tf2/paneleffect.cpp new file mode 100644 index 0000000..8db00b1 --- /dev/null +++ b/game/client/tf2/paneleffect.cpp @@ -0,0 +1,414 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include "cbase.h" +#include "PanelEffect.h" +#include "vgui_int.h" +#include <vgui_controls/Panel.h> +#include <vgui/IPanel.h> + +void PanelToPanelRectangle( int& x, int& y, int& w, int& h, vgui::Panel *output, vgui::Panel *input ); + +// Global panel counter for effects +EFFECT_HANDLE CPanelEffect::m_nHandleCount = 0; + +//----------------------------------------------------------------------------- +// Purpose: Base panel effect +// Input : *owner - +//----------------------------------------------------------------------------- +CPanelEffect::CPanelEffect( ITFHintItem *owner ) + : m_pOwner( owner ) +{ + // Assign it a unique handle index + m_Handle = ++m_nHandleCount; + + SetType( UNKNOWN ); + SetPanel( NULL ); + SetPanelOther( NULL ); + SetColor( 0, 0, 0, 255 ); + SetEndTime( 0.0f ); + SetShouldRemove( false ); + SetUsingOffset( false, 0, 0 ); + SetTargetType( ENDPOINT_UNKNOWN ); + SetVisible( true ); + + m_ptX = 0; + m_ptY = 0; + m_rectX = 0; + m_rectY = 0; + m_rectW = 0; + m_rectH = 0; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CPanelEffect::~CPanelEffect() +{ +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *owner - +//----------------------------------------------------------------------------- +void CPanelEffect::SetOwner( ITFHintItem *owner ) +{ + m_pOwner = owner; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : ITFHintItem +//----------------------------------------------------------------------------- +ITFHintItem *CPanelEffect::GetOwner( void ) +{ + return m_pOwner; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : EFFECT_HANDLE +//----------------------------------------------------------------------------- +EFFECT_HANDLE CPanelEffect::GetHandle( void ) +{ + return m_Handle; +} + +//----------------------------------------------------------------------------- +// Purpose: Override for specific painting effects +// Input : *panel - +//----------------------------------------------------------------------------- +void CPanelEffect::doPaint( vgui::Panel *panel ) +{ +} + +//----------------------------------------------------------------------------- +// Purpose: Default think checks for panels that have a specific lifetime +//----------------------------------------------------------------------------- +void CPanelEffect::Think( void ) +{ + if ( !m_flEndTime ) + return; + + if ( gpGlobals->curtime > m_flEndTime ) + { + SetShouldRemove( true ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CPanelEffect::ShouldRemove( void ) +{ + return m_bShouldRemove; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : remove - +//----------------------------------------------------------------------------- +void CPanelEffect::SetShouldRemove( bool remove ) +{ + m_bShouldRemove = remove; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : type - +//----------------------------------------------------------------------------- +void CPanelEffect::SetType( int type ) +{ + m_nType = type; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : int +//----------------------------------------------------------------------------- +int CPanelEffect::GetType( void ) +{ + return m_nType; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *panel - +//----------------------------------------------------------------------------- +void CPanelEffect::SetPanel( vgui::Panel *panel ) +{ + m_hPanel = panel; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : vgui::Panel +//----------------------------------------------------------------------------- +vgui::Panel *CPanelEffect::GetPanel( void ) +{ + return m_hPanel; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *panel - +//----------------------------------------------------------------------------- +void CPanelEffect::SetPanelOther( vgui::Panel *panel ) +{ + SetTargetType( ENDPOINT_PANEL ); + m_hOtherPanel = panel; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : vgui::Panel +//----------------------------------------------------------------------------- +vgui::Panel *CPanelEffect::GetPanelOther( void ) +{ + return m_hOtherPanel; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : r - +// g - +// b - +// a - +//----------------------------------------------------------------------------- +void CPanelEffect::SetColor( int r, int g, int b, int a ) +{ + m_r = r; + m_g = g; + m_b = b; + m_a = a; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : r - +// g - +// b - +// a - +//----------------------------------------------------------------------------- +void CPanelEffect::GetColor( int& r, int& g, int& b, int& a ) +{ + r = m_r; + g = m_g; + b = m_b; + a = m_a; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : time - +//----------------------------------------------------------------------------- +void CPanelEffect::SetEndTime( float time ) +{ + m_flEndTime = time; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : float +//----------------------------------------------------------------------------- +float CPanelEffect::GetEndTime( void ) +{ + return m_flEndTime; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : active - +// x - +// y - +//----------------------------------------------------------------------------- +void CPanelEffect::SetUsingOffset( bool active, int x, int y ) +{ + m_bEndpointIsCoordinate = active; + m_nOffset[ 0 ] = x; + m_nOffset[ 1 ] = y; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CPanelEffect::GetUsingOffset( void ) +{ + return m_bEndpointIsCoordinate; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : x - +// y - +//----------------------------------------------------------------------------- +void CPanelEffect::GetOffset( int& x, int& y ) +{ + x = m_nOffset[ 0 ]; + y = m_nOffset[ 1 ]; +} + +//----------------------------------------------------------------------------- +// Purpose: Returns false if the panel is not visible or is the child of a not visible +// parent +// assumes panel hierarchy stops at the client .dll root panel +// If parent is some other panel, then this will return false +// Input : *panel - +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CPanelEffect::IsVisibleIncludingParent( vgui::Panel *panel ) +{ + vgui::VPANEL p = panel->GetVPanel(); + while ( p ) + { + if ( !vgui::ipanel()->IsVisible(p) ) + return false; + + if ( p == VGui_GetClientDLLRootPanel() ) + { + return true; + } + + p = vgui::ipanel()->GetParent(p); + } + + return false; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : int +//----------------------------------------------------------------------------- +int CPanelEffect::GetTargetType( void ) +{ + return m_TargetType; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : type - +//----------------------------------------------------------------------------- +void CPanelEffect::SetTargetType( int type ) +{ + m_TargetType = type; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *outpanel - +// int&x - +// int&y - +// int&w - +// int&h - +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CPanelEffect::GetTargetRectangle( vgui::Panel *outpanel, int&x, int&y, int&w, int&h ) +{ + x = y = 0; + w = h = 1; + + switch ( m_TargetType ) + { + default: + return false; + break; + case ENDPOINT_PANEL: + { + vgui::Panel *to = m_hOtherPanel; + if ( !to ) + return false; + + if ( !IsVisibleIncludingParent( to ) ) + { + return false; + } + + PanelToPanelRectangle( x, y, w, h, outpanel, to ); + + // Using an offset into a panel + if ( GetUsingOffset() ) + { + int ofsx, ofsy; + + GetOffset( ofsx, ofsy ); + + x = x + ofsx-3; + w = 6; + y = y + ofsy-3; + h = 6; + } + } + break; + case ENDPOINT_RECTANGLE: + { + x = m_rectX; + y = m_rectY; + w = m_rectW; + h = m_rectH; + } + break; + case ENDPOINT_POINT: + { + x = m_ptX; + y = m_ptY; + w = 1; + h = 1; + } + break; + } + + return true; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : x - +// y - +//----------------------------------------------------------------------------- +void CPanelEffect::SetTargetPoint( int x, int y ) +{ + SetTargetType( ENDPOINT_POINT ); + m_ptX = x; + m_ptY = y; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : x - +// y - +// w - +// h - +//----------------------------------------------------------------------------- +void CPanelEffect::SetTargetRect( int x, int y, int w, int h ) +{ + SetTargetType( ENDPOINT_RECTANGLE ); + m_rectX = x; + m_rectY = y; + m_rectW = w; + m_rectH = h; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : visible - +//----------------------------------------------------------------------------- +void CPanelEffect::SetVisible( bool visible ) +{ + m_bVisible = visible; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CPanelEffect::GetVisible( void ) +{ + return m_bVisible; +} + |