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.
 
 
 
 
 
 

414 lines
11 KiB

//========= 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;
}