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.
243 lines
5.9 KiB
243 lines
5.9 KiB
![]()
4 years ago
|
//--------------------------------------------------------------------------------------------------------
|
||
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
|
||
|
#include "cbase.h"
|
||
|
|
||
|
#include "SelectionTool.h"
|
||
|
#include "nav_mesh.h"
|
||
|
#include "nav_pathfind.h"
|
||
|
|
||
|
// memdbgon must be the last include file in a .cpp file!!!
|
||
|
#include "tier0/memdbgon.h"
|
||
|
|
||
|
#ifdef SERVER_USES_VGUI
|
||
|
|
||
|
using namespace vgui;
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|
||
|
SelectionToolPanel::SelectionToolPanel( vgui::Panel *parent, const char *toolName ) : CNavUIToolPanel( parent, toolName )
|
||
|
{
|
||
|
LoadControlSettings( "Resource/UI/NavTools/SelectionTool.res" );
|
||
|
}
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|
||
|
void SelectionToolPanel::Init( void )
|
||
|
{
|
||
|
m_dragType = DRAG_NONE;
|
||
|
}
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|
||
|
void SelectionToolPanel::Shutdown( void )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|
||
|
void SelectionToolPanel::PerformLayout( void )
|
||
|
{
|
||
|
Panel *parent = GetParent();
|
||
|
if ( parent )
|
||
|
{
|
||
|
int w, h;
|
||
|
parent->GetSize( w, h );
|
||
|
SetBounds( 0, 0, w, h );
|
||
|
}
|
||
|
|
||
|
BaseClass::PerformLayout();
|
||
|
}
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|
||
|
void SelectionToolPanel::OnCommand( const char *command )
|
||
|
{
|
||
|
if ( FStrEq( "FloodSelect", command ) )
|
||
|
{
|
||
|
TheNavUI()->SetLeftClickAction( "Selection::Flood", "Flood Select" );
|
||
|
}
|
||
|
|
||
|
BaseClass::OnCommand( command );
|
||
|
}
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|
||
|
void SelectionToolPanel::OnCursorMoved( int x, int y )
|
||
|
{
|
||
|
CNavArea *area = TheNavMesh->GetSelectedArea();
|
||
|
if ( area )
|
||
|
{
|
||
|
bool selected = TheNavMesh->IsInSelectedSet( area );
|
||
|
|
||
|
if ( selected && m_dragType == DRAG_UNSELECT )
|
||
|
{
|
||
|
TheNavMesh->RemoveFromSelectedSet( area );
|
||
|
TheNavUI()->PlaySound( "EDIT_END_AREA.Creating" );
|
||
|
}
|
||
|
else if ( !selected && m_dragType == DRAG_SELECT )
|
||
|
{
|
||
|
TheNavMesh->AddToSelectedSet( area );
|
||
|
TheNavUI()->PlaySound( "EDIT_END_AREA.Creating" );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BaseClass::OnCursorMoved( x, y );
|
||
|
}
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|
||
|
class FloodSelectionCollector
|
||
|
{
|
||
|
public:
|
||
|
FloodSelectionCollector( SelectionToolPanel *panel )
|
||
|
{
|
||
|
m_count = 0;
|
||
|
m_panel = panel;
|
||
|
}
|
||
|
|
||
|
bool operator() ( CNavArea *area )
|
||
|
{
|
||
|
// already selected areas terminate flood select
|
||
|
if ( TheNavMesh->IsInSelectedSet( area ) )
|
||
|
return false;
|
||
|
|
||
|
if ( !m_panel->IsFloodSelectable( area ) )
|
||
|
return false;
|
||
|
|
||
|
TheNavMesh->AddToSelectedSet( area );
|
||
|
++m_count;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
int m_count;
|
||
|
|
||
|
private:
|
||
|
SelectionToolPanel *m_panel;
|
||
|
};
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|
||
|
bool SelectionToolPanel::IsFloodSelectable( CNavArea *area )
|
||
|
{
|
||
|
if ( IsCheckButtonChecked( "Place" ) )
|
||
|
{
|
||
|
if ( m_floodStartArea->GetPlace() != area->GetPlace() )
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( IsCheckButtonChecked( "Jump" ) )
|
||
|
{
|
||
|
if ( (m_floodStartArea->GetAttributes() & NAV_MESH_JUMP) != (area->GetAttributes() & NAV_MESH_JUMP) )
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|
||
|
void SelectionToolPanel::FloodSelect( void )
|
||
|
{
|
||
|
m_floodStartArea = TheNavMesh->GetSelectedArea();
|
||
|
if ( m_floodStartArea )
|
||
|
{
|
||
|
TheNavUI()->PlaySound( "EDIT_DELETE" );
|
||
|
|
||
|
int connections = INCLUDE_BLOCKED_AREAS;
|
||
|
|
||
|
if ( IsCheckButtonChecked( "Incoming" ) )
|
||
|
{
|
||
|
connections = connections | INCLUDE_INCOMING_CONNECTIONS;
|
||
|
}
|
||
|
|
||
|
if ( !IsCheckButtonChecked( "Outgoing" ) )
|
||
|
{
|
||
|
connections = connections | EXCLUDE_OUTGOING_CONNECTIONS;
|
||
|
}
|
||
|
|
||
|
// collect all areas connected to this area
|
||
|
FloodSelectionCollector collector( this );
|
||
|
SearchSurroundingAreas( m_floodStartArea, m_floodStartArea->GetCenter(), collector, -1, connections );
|
||
|
|
||
|
Msg( "Selected %d areas.\n", collector.m_count );
|
||
|
}
|
||
|
m_floodStartArea = NULL;
|
||
|
|
||
|
TheNavMesh->SetMarkedArea( NULL ); // unmark the mark area
|
||
|
}
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|
||
|
void SelectionToolPanel::StartLeftClickAction( const char *actionName )
|
||
|
{
|
||
|
if ( FStrEq( actionName, "Selection::Flood" ) )
|
||
|
{
|
||
|
TheNavUI()->SetLeftClickAction( "", "" );
|
||
|
FloodSelect();
|
||
|
}
|
||
|
else if ( FStrEq( actionName, "Selection::Select" ) )
|
||
|
{
|
||
|
CNavArea *area = TheNavMesh->GetSelectedArea();
|
||
|
if ( area )
|
||
|
{
|
||
|
if ( TheNavMesh->IsInSelectedSet( area ) )
|
||
|
{
|
||
|
TheNavMesh->RemoveFromSelectedSet( area );
|
||
|
m_dragType = DRAG_UNSELECT;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
TheNavMesh->AddToSelectedSet( area );
|
||
|
m_dragType = DRAG_SELECT;
|
||
|
}
|
||
|
TheNavUI()->PlaySound( "EDIT_END_AREA.Creating" );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|
||
|
void SelectionToolPanel::FinishLeftClickAction( const char *actionName )
|
||
|
{
|
||
|
m_dragType = DRAG_NONE;
|
||
|
}
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|
||
|
void SelectionToolPanel::StartRightClickAction( const char *actionName )
|
||
|
{
|
||
|
if ( m_dragType != DRAG_NONE )
|
||
|
{
|
||
|
TheNavUI()->PlaySound( "EDIT_END_AREA.Creating" );
|
||
|
m_dragType = DRAG_NONE;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( FStrEq( actionName, "Selection::ClearSelection" ) )
|
||
|
{
|
||
|
if ( FStrEq( TheNavUI()->GetLeftClickAction(), "Selection::Select" ) )
|
||
|
{
|
||
|
if ( TheNavMesh->GetSelecteSetSize() > 0 )
|
||
|
{
|
||
|
TheNavUI()->PlaySound( "EDIT_END_AREA.Creating" );
|
||
|
}
|
||
|
TheNavMesh->ClearSelectedSet();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
TheNavUI()->SetLeftClickAction( "", "" );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif // SERVER_USES_VGUI
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------------------------------------------------
|