2014-12-07 19:09:38 -05:00
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
2014-03-14 14:13:41 -04:00
# include "LevelEditor.h"
# include "LevelViewportActions.h"
# include "EditorShowFlags.h"
Simple and Group Stat Exec commands can now be triggered from the level viewport Show menu directly.
#ttp 306334 - ROCKET: TASK: PUNTABLE: Stats: FN: Make diagnostic stats discoverable and available in the UI (don't require console to toggle)
#branch UE4
#change
DECLARE_STATS_GROUP û Added additional param GroupCategory, for subfolder use in the UI. Fixedup all Stats Group usage so the category is now propagated through where it needs to be.
Currently all Group stats have the Category æAdvancedÆ, and all engine stats have the Category æSimpleÆ û this is just to differentiate them for now, better categories will come along in future.
Modified FindOrAddMetaData as it now broadcasts a delegate (via a TaskGraph) whenever a new stat meta data is added û this was needed as not all the stat groups are æregisteredÆ when the level viewports are created (they are drip loaded), so the viewports need to listen for any additions thereafter...
GroupDescription is displayed as a tooltip in the UI for the stat entry and we may want to localize these.
RenderStats & RenderGroupedWithHierarchy: Modified so that it now takes the viewport that it should render to as a param (which is also used to determine if each stat should be visible).
Removed StatsEnabled delegate in favour of StatCheckEnabled, StatEnabled, StatDisabled, StatDisableAll for more finite usage and feedback when toggling them.
Modified FHUDGroupManager HandleCommand It now uses the new delegates to work out whether it needs to enable or disable for the current viewport, so itÆs more involved than a simple toggle, itÆs more ôis the stat enabled for the current viewport, and is it enabled for any viewportö delegate querying so it can react accordingly.
Added struct FSimpleStatFuncs: Which contains info on each æSimple StatÆ such as; name, category, description, renderfunc, togglefunc and the side of the viewport it should be rendered to
ExecSimpleStat û Calls Exec for a registered Simple Stat, ensuring the correct viewport is set
IsSimpleStat û Checks to see if a stat is a registered Simple Stat or not
SetSimpleStat û Sets the state of a specified Simple Stats
SetSimpleStats - Sets the state of the specified Simple Stats
RenderSimpleStats û Renders the Simple Stats if they are enabled, and have Render functions assigned.
Each Exec function had the code it executes which itÆs toggled and rendered into functions
Added FStatUnitData & FStatHitchesData: Moved all the globals/static variables used when enabling Stat Unit/Hitches into a struct as itÆs now used by multiple viewports and they needed their own copies. Also moved their draw functions here too.
FSceneViewport:
SwapStatCommands û Exchanges the enabled stats between two viewports, this is so when PIEing the stats which were enabled on the Level Viewport (if playing in active viewport only) get transposed to the Game Viewport, and then restored when PIE ends.
SEditorViewport:
ToggleStatCommand û Called when a stat is enabled/disabled from the UI
IsStatCommandVisible û Checks to see if a stat command should appear as visible in the UI
SEditorViewportViewMenu:
GenerateViewMenuContent û Made protected and virtual so it could be called externally.
FLevelViewportCommands: Added the code needed to generate commands for each of the Stat menu entries, however because not all stats are registered when this happens, it also creates some delegates to listen out for others that are registered later
Destructor û Needed to reset delegates
HandleNewGroupStat û Creates the new group stat commands
HandleNewStat û Creates the new stat command
FindStatIndex û Looks for where a stat should be inserted in the menu in order to maintain alphabetical order
SLevelViewport:
Modified the code so that the states of all the SimpleStats are saved so they can be restored next time the editor is ran (previously just handled FPS).
OnFloatingButtonClicked û Called whenever any of the level viewports floating buttons are clicked in order to correctly set the ælastÆ viewport global
OnToggleAllStatCommands û Called when the user selects æHide AllÆ from the viewport.
ToggleStatCommand û Called when the user selects any other stat option from the viewport.
BindStatCommand û Used to bind the menu action to the command name (used by delegate)
Added SLevelEditorViewportViewMenu (extends SEditorViewportViewMenu), and overrode GenerateViewMenuContent so that OnFloatingButtonClicked can be called whenever the menu is clicked on. This is also called during GenerateOptionsMenu, GenerateCameraMenu, GenerateShowMenu & OnToggleMaximize
Added global ptr GStatProcessingViewportClient (sim to Current, Last) used to keep track of which viewport the stat should be applied too (only valid within the scope of the Exec call).
FViewportClient:
Moved global ESoundShowFlags enum list into this class.
FCommonViewportClient:
Destructor û Needed to reset GStatProcessingViewportClient
FLevelEditorViewportClient
SetCurrentViewport û moved code responsible for setting the global æcurrentÆ viewport ptr into a func
SetLastKeyViewport û moved the code responsible for settings the global ælastÆ viewport ptr into a func
UGameViewportClient:
Destructor û Needed to cleanup delegate usage.
FViewportClient & FLevelEditorViewportClient & UGameViewportClient*
GetStatUnitData û The viewports copy of the variables needed when running the Stat Unit Exec
GetStatHitchesData û The viewports copy of the variables needed when running the Stat Hitches Exec
GetEnabledStats û Gets a list of all the stats which are enabled for the viewport
SetEnabledStats û Sets a list of all the stats which should be enabled for the viewport
IsStatEnabled û Checks to see if a specific stat is enabled for the viewport
SetStatEnabled û Sets a specifics stats state to enabled or disabled
GetSoundShowFlags û Gets which flags are enabled for the Stat Sounds Exec
SetSoundShowFlags û Sets which flags are enabled for the Stat Sounds Exec
HandleViewportStatCheckEnabled (delegate) û checks to see if a specific stat is enabled on this viewport
HandleViewportStatEnabled (delegate) û enables a specific stat for the viewport
HandleViewportStatDisabled (delegate) û disables a specific stat for the viewport
HandleViewportStatDisableAll (delegate) û disables all stats for the viewport
*FViewportClient has dummy virtual funcs and LevelEditor/Game both have the same implementations, the only differences is the GameViewports member variables are static so that the stat info persists between runs.
FLevelEditorViewportInstanceSettings deprecated bShowFPS in favour of an EnabledStats array (so we can track the state of all stats, not just FPS).
Added new config var bSaveSimpleStats: if enabled, restores previously enabled level viewport simple stats the next time the editor runs (defaults to false).
Modified FillShowFlagMenu so that thereÆs just one func and you specify where (if any) youÆd like a separator to occur.
Added FillShowStatsSubMenus so that menus can be generated which have submenus
Added the Stats sub menu to the View menu
Modified Execs so that the GStatProcessingViewportClient is set to the correct default viewport (if it wasnÆt specified), and clears again after itÆs been processed
HandleStatCommand now takes World and ViewportClient as params too û needed when Execs enabled other Execs so the world/viewport persists.
SetAverageUnitTimes û Added as a Setter func for GetAverageUnitTimes (moved code out of Stat Unit renderer and modified so that it only updates once per frame).
Stripped out all unneeded globals
[CL 2058522 by Andrew Brown in Main branch]
2014-04-29 04:04:27 -04:00
# include "StatsData.h"
2014-08-21 06:03:00 -04:00
# include "BufferVisualizationData.h"
2014-11-12 04:43:54 -05:00
# include "GameFramework/WorldSettings.h"
2014-03-14 14:13:41 -04:00
# define LOCTEXT_NAMESPACE "LevelViewportActions"
Simple and Group Stat Exec commands can now be triggered from the level viewport Show menu directly.
#ttp 306334 - ROCKET: TASK: PUNTABLE: Stats: FN: Make diagnostic stats discoverable and available in the UI (don't require console to toggle)
#branch UE4
#change
DECLARE_STATS_GROUP û Added additional param GroupCategory, for subfolder use in the UI. Fixedup all Stats Group usage so the category is now propagated through where it needs to be.
Currently all Group stats have the Category æAdvancedÆ, and all engine stats have the Category æSimpleÆ û this is just to differentiate them for now, better categories will come along in future.
Modified FindOrAddMetaData as it now broadcasts a delegate (via a TaskGraph) whenever a new stat meta data is added û this was needed as not all the stat groups are æregisteredÆ when the level viewports are created (they are drip loaded), so the viewports need to listen for any additions thereafter...
GroupDescription is displayed as a tooltip in the UI for the stat entry and we may want to localize these.
RenderStats & RenderGroupedWithHierarchy: Modified so that it now takes the viewport that it should render to as a param (which is also used to determine if each stat should be visible).
Removed StatsEnabled delegate in favour of StatCheckEnabled, StatEnabled, StatDisabled, StatDisableAll for more finite usage and feedback when toggling them.
Modified FHUDGroupManager HandleCommand It now uses the new delegates to work out whether it needs to enable or disable for the current viewport, so itÆs more involved than a simple toggle, itÆs more ôis the stat enabled for the current viewport, and is it enabled for any viewportö delegate querying so it can react accordingly.
Added struct FSimpleStatFuncs: Which contains info on each æSimple StatÆ such as; name, category, description, renderfunc, togglefunc and the side of the viewport it should be rendered to
ExecSimpleStat û Calls Exec for a registered Simple Stat, ensuring the correct viewport is set
IsSimpleStat û Checks to see if a stat is a registered Simple Stat or not
SetSimpleStat û Sets the state of a specified Simple Stats
SetSimpleStats - Sets the state of the specified Simple Stats
RenderSimpleStats û Renders the Simple Stats if they are enabled, and have Render functions assigned.
Each Exec function had the code it executes which itÆs toggled and rendered into functions
Added FStatUnitData & FStatHitchesData: Moved all the globals/static variables used when enabling Stat Unit/Hitches into a struct as itÆs now used by multiple viewports and they needed their own copies. Also moved their draw functions here too.
FSceneViewport:
SwapStatCommands û Exchanges the enabled stats between two viewports, this is so when PIEing the stats which were enabled on the Level Viewport (if playing in active viewport only) get transposed to the Game Viewport, and then restored when PIE ends.
SEditorViewport:
ToggleStatCommand û Called when a stat is enabled/disabled from the UI
IsStatCommandVisible û Checks to see if a stat command should appear as visible in the UI
SEditorViewportViewMenu:
GenerateViewMenuContent û Made protected and virtual so it could be called externally.
FLevelViewportCommands: Added the code needed to generate commands for each of the Stat menu entries, however because not all stats are registered when this happens, it also creates some delegates to listen out for others that are registered later
Destructor û Needed to reset delegates
HandleNewGroupStat û Creates the new group stat commands
HandleNewStat û Creates the new stat command
FindStatIndex û Looks for where a stat should be inserted in the menu in order to maintain alphabetical order
SLevelViewport:
Modified the code so that the states of all the SimpleStats are saved so they can be restored next time the editor is ran (previously just handled FPS).
OnFloatingButtonClicked û Called whenever any of the level viewports floating buttons are clicked in order to correctly set the ælastÆ viewport global
OnToggleAllStatCommands û Called when the user selects æHide AllÆ from the viewport.
ToggleStatCommand û Called when the user selects any other stat option from the viewport.
BindStatCommand û Used to bind the menu action to the command name (used by delegate)
Added SLevelEditorViewportViewMenu (extends SEditorViewportViewMenu), and overrode GenerateViewMenuContent so that OnFloatingButtonClicked can be called whenever the menu is clicked on. This is also called during GenerateOptionsMenu, GenerateCameraMenu, GenerateShowMenu & OnToggleMaximize
Added global ptr GStatProcessingViewportClient (sim to Current, Last) used to keep track of which viewport the stat should be applied too (only valid within the scope of the Exec call).
FViewportClient:
Moved global ESoundShowFlags enum list into this class.
FCommonViewportClient:
Destructor û Needed to reset GStatProcessingViewportClient
FLevelEditorViewportClient
SetCurrentViewport û moved code responsible for setting the global æcurrentÆ viewport ptr into a func
SetLastKeyViewport û moved the code responsible for settings the global ælastÆ viewport ptr into a func
UGameViewportClient:
Destructor û Needed to cleanup delegate usage.
FViewportClient & FLevelEditorViewportClient & UGameViewportClient*
GetStatUnitData û The viewports copy of the variables needed when running the Stat Unit Exec
GetStatHitchesData û The viewports copy of the variables needed when running the Stat Hitches Exec
GetEnabledStats û Gets a list of all the stats which are enabled for the viewport
SetEnabledStats û Sets a list of all the stats which should be enabled for the viewport
IsStatEnabled û Checks to see if a specific stat is enabled for the viewport
SetStatEnabled û Sets a specifics stats state to enabled or disabled
GetSoundShowFlags û Gets which flags are enabled for the Stat Sounds Exec
SetSoundShowFlags û Sets which flags are enabled for the Stat Sounds Exec
HandleViewportStatCheckEnabled (delegate) û checks to see if a specific stat is enabled on this viewport
HandleViewportStatEnabled (delegate) û enables a specific stat for the viewport
HandleViewportStatDisabled (delegate) û disables a specific stat for the viewport
HandleViewportStatDisableAll (delegate) û disables all stats for the viewport
*FViewportClient has dummy virtual funcs and LevelEditor/Game both have the same implementations, the only differences is the GameViewports member variables are static so that the stat info persists between runs.
FLevelEditorViewportInstanceSettings deprecated bShowFPS in favour of an EnabledStats array (so we can track the state of all stats, not just FPS).
Added new config var bSaveSimpleStats: if enabled, restores previously enabled level viewport simple stats the next time the editor runs (defaults to false).
Modified FillShowFlagMenu so that thereÆs just one func and you specify where (if any) youÆd like a separator to occur.
Added FillShowStatsSubMenus so that menus can be generated which have submenus
Added the Stats sub menu to the View menu
Modified Execs so that the GStatProcessingViewportClient is set to the correct default viewport (if it wasnÆt specified), and clears again after itÆs been processed
HandleStatCommand now takes World and ViewportClient as params too û needed when Execs enabled other Execs so the world/viewport persists.
SetAverageUnitTimes û Added as a Setter func for GetAverageUnitTimes (moved code out of Stat Unit renderer and modified so that it only updates once per frame).
Stripped out all unneeded globals
[CL 2058522 by Andrew Brown in Main branch]
2014-04-29 04:04:27 -04:00
FLevelViewportCommands : : FOnNewStatCommandAdded FLevelViewportCommands : : NewStatCommandDelegate ;
FLevelViewportCommands : : ~ FLevelViewportCommands ( )
{
UEngine : : NewStatDelegate . RemoveAll ( this ) ;
# if STATS
FStatGroupGameThreadNotifier : : Get ( ) . NewStatGroupDelegate . Unbind ( ) ;
# endif
}
2014-03-14 14:13:41 -04:00
/** UI_COMMAND takes long for the compile to optimize */
PRAGMA_DISABLE_OPTIMIZATION
void FLevelViewportCommands : : RegisterCommands ( )
{
2015-03-17 11:36:28 -04:00
UI_COMMAND ( ToggleMaximize , " Maximize Viewport " , " Toggles the Maximize state of the current viewport " , EUserInterfaceActionType : : ToggleButton , FInputChord ( ) ) ;
UI_COMMAND ( ToggleGameView , " Game View " , " Toggles game view. Game view shows the scene as it appears in game " , EUserInterfaceActionType : : ToggleButton , FInputChord ( EKeys : : G ) ) ;
UI_COMMAND ( ToggleImmersive , " Immersive Mode " , " Switches this viewport between immersive mode and regular mode " , EUserInterfaceActionType : : ToggleButton , FInputChord ( EKeys : : F11 ) ) ;
2014-06-23 10:25:08 -04:00
2015-03-17 11:36:28 -04:00
UI_COMMAND ( CreateCamera , " Create Camera Here " , " Creates a new camera actor at the current location of this viewport's camera " , EUserInterfaceActionType : : Button , FInputChord ( ) ) ;
UI_COMMAND ( HighResScreenshot , " High Resolution Screenshot... " , " Opens the control panel for high resolution screenshots " , EUserInterfaceActionType : : Button , FInputChord ( ) ) ;
2014-03-14 14:13:41 -04:00
2015-03-17 11:36:28 -04:00
UI_COMMAND ( UseDefaultShowFlags , " Use Defaults " , " Resets all show flags to default " , EUserInterfaceActionType : : Button , FInputChord ( ) ) ;
2014-03-14 14:13:41 -04:00
2015-03-17 11:36:28 -04:00
UI_COMMAND ( PilotSelectedActor , " Pilot Selected Actor " , " Move the selected actor around using the viewport controls, and bind the viewport to the actor's location and orientation. " , EUserInterfaceActionType : : Button , FInputChord ( EModifierKey : : Control | EModifierKey : : Shift , EKeys : : P ) ) ;
UI_COMMAND ( EjectActorPilot , " Eject from Actor Pilot " , " Stop piloting an actor with the current viewport. Unlocks the viewport's position and orientation from the actor the viewport is currently piloting. " , EUserInterfaceActionType : : Button , FInputChord ( ) ) ;
UI_COMMAND ( ToggleActorPilotCameraView , " Actor Pilot Camera View " , " Toggles showing the exact camera view when using the viewport to pilot a camera " , EUserInterfaceActionType : : ToggleButton , FInputChord ( EModifierKey : : Control | EModifierKey : : Shift , EKeys : : C ) ) ;
2014-03-14 14:13:41 -04:00
2015-03-17 11:36:28 -04:00
UI_COMMAND ( ViewportConfig_OnePane , " Layout One Pane " , " Changes the viewport arrangement to one pane " , EUserInterfaceActionType : : ToggleButton , FInputChord ( ) ) ;
UI_COMMAND ( ViewportConfig_TwoPanesH , " Layout Two Panes (horizontal) " , " Changes the viewport arrangement to two panes, side-by-side " , EUserInterfaceActionType : : ToggleButton , FInputChord ( ) ) ;
UI_COMMAND ( ViewportConfig_TwoPanesV , " Layout Two Panes (vertical) " , " Changes the viewport arrangement to two panes, one above the other " , EUserInterfaceActionType : : ToggleButton , FInputChord ( ) ) ;
UI_COMMAND ( ViewportConfig_ThreePanesLeft , " Layout Three Panes (one left, two right) " , " Changes the viewport arrangement to three panes, one on the left, two on the right " , EUserInterfaceActionType : : ToggleButton , FInputChord ( ) ) ;
UI_COMMAND ( ViewportConfig_ThreePanesRight , " Layout Three Panes (one right, two left) " , " Changes the viewport arrangement to three panes, one on the right, two on the left " , EUserInterfaceActionType : : ToggleButton , FInputChord ( ) ) ;
UI_COMMAND ( ViewportConfig_ThreePanesTop , " Layout Three Panes (one top, two bottom) " , " Changes the viewport arrangement to three panes, one on the top, two on the bottom " , EUserInterfaceActionType : : ToggleButton , FInputChord ( ) ) ;
UI_COMMAND ( ViewportConfig_ThreePanesBottom , " Layout Three Panes (one bottom, two top) " , " Changes the viewport arrangement to three panes, one on the bottom, two on the top " , EUserInterfaceActionType : : ToggleButton , FInputChord ( ) ) ;
UI_COMMAND ( ViewportConfig_FourPanesLeft , " Layout Four Panes (one left, three right) " , " Changes the viewport arrangement to four panes, one on the left, three on the right " , EUserInterfaceActionType : : ToggleButton , FInputChord ( ) ) ;
UI_COMMAND ( ViewportConfig_FourPanesRight , " Layout Four Panes (one right, three left) " , " Changes the viewport arrangement to four panes, one on the right, three on the left " , EUserInterfaceActionType : : ToggleButton , FInputChord ( ) ) ;
UI_COMMAND ( ViewportConfig_FourPanesTop , " Layout Four Panes (one top, three bottom) " , " Changes the viewport arrangement to four panes, one on the top, three on the bottom " , EUserInterfaceActionType : : ToggleButton , FInputChord ( ) ) ;
UI_COMMAND ( ViewportConfig_FourPanesBottom , " Layout Four Panes (one bottom, three top) " , " Changes the viewport arrangement to four panes, one on the bottom, three on the top " , EUserInterfaceActionType : : ToggleButton , FInputChord ( ) ) ;
UI_COMMAND ( ViewportConfig_FourPanes2x2 , " Layout Four Panes (2x2) " , " Changes the viewport arrangement to four panes, in a 2x2 grid " , EUserInterfaceActionType : : ToggleButton , FInputChord ( ) ) ;
2014-03-14 14:13:41 -04:00
2015-03-17 11:36:28 -04:00
UI_COMMAND ( ApplyMaterialToActor , " Apply Material " , " Attempts to apply a dropped material to this object " , EUserInterfaceActionType : : Button , FInputChord ( ) ) ;
2014-03-14 14:13:41 -04:00
2015-03-17 11:36:28 -04:00
UI_COMMAND ( AllowMatineePreview , " Allow Matinee Preview " , " If enabled, allows matinee to be previewed in this viewport " , EUserInterfaceActionType : : ToggleButton , FInputChord ( ) ) ;
2014-03-14 14:13:41 -04:00
2015-03-17 11:36:28 -04:00
UI_COMMAND ( FindInLevelScriptBlueprint , " Find In Level Script " , " Finds references of a selected actor in the level script blueprint " , EUserInterfaceActionType : : Button , FInputChord ( EModifierKey : : Control , EKeys : : K ) ) ;
UI_COMMAND ( AdvancedSettings , " Advanced Settings... " , " Opens the advanced viewport settings " , EUserInterfaceActionType : : Button , FInputChord ( ) ) ;
2014-03-14 14:13:41 -04:00
// Generate a command for each buffer visualization mode
{
struct FMaterialIterator
{
const TSharedRef < class FBindingContext > Parent ;
FLevelViewportCommands : : TBufferVisualizationModeCommandMap & CommandMap ;
FMaterialIterator ( const TSharedRef < class FBindingContext > InParent , FLevelViewportCommands : : TBufferVisualizationModeCommandMap & InCommandMap )
: Parent ( InParent )
, CommandMap ( InCommandMap )
{
}
void ProcessValue ( const FString & InMaterialName , const UMaterial * InMaterial , const FText & InDisplayName )
{
FName ViewportCommandName = * ( FString ( TEXT ( " BufferVisualizationMenu " ) ) + InMaterialName ) ;
FBufferVisualizationRecord & Record = CommandMap . Add ( ViewportCommandName , FBufferVisualizationRecord ( ) ) ;
Record . Name = * InMaterialName ;
const FText MaterialNameText = FText : : FromString ( InMaterialName ) ;
Record . Command = FUICommandInfoDecl ( Parent , ViewportCommandName , MaterialNameText , MaterialNameText )
. UserInterfaceType ( EUserInterfaceActionType : : RadioButton )
2015-03-17 11:36:28 -04:00
. DefaultChord ( FInputChord ( ) ) ;
2014-03-14 14:13:41 -04:00
}
} ;
BufferVisualizationModeCommands . Empty ( ) ;
FName ViewportCommandName = * ( FString ( TEXT ( " BufferVisualizationOverview " ) ) ) ;
FBufferVisualizationRecord & OverviewRecord = BufferVisualizationModeCommands . Add ( ViewportCommandName , FBufferVisualizationRecord ( ) ) ;
OverviewRecord . Name = NAME_None ;
OverviewRecord . Command = FUICommandInfoDecl ( this - > AsShared ( ) , ViewportCommandName , LOCTEXT ( " BufferVisualization " , " Overview " ) , LOCTEXT ( " BufferVisualization " , " Overview " ) )
. UserInterfaceType ( EUserInterfaceActionType : : RadioButton )
2015-03-17 11:36:28 -04:00
. DefaultChord ( FInputChord ( ) ) ;
2014-03-14 14:13:41 -04:00
FMaterialIterator It ( this - > AsShared ( ) , BufferVisualizationModeCommands ) ;
GetBufferVisualizationData ( ) . IterateOverAvailableMaterials ( It ) ;
}
const TArray < FShowFlagData > & ShowFlagData = GetShowFlagMenuItems ( ) ;
// Generate a command for each show flag
for ( int32 ShowFlag = 0 ; ShowFlag < ShowFlagData . Num ( ) ; + + ShowFlag )
{
const FShowFlagData & SFData = ShowFlagData [ ShowFlag ] ;
FFormatNamedArguments Args ;
Args . Add ( TEXT ( " ShowFlagName " ) , SFData . DisplayName ) ;
FText LocalizedName ;
switch ( SFData . Group )
{
case SFG_Visualize :
LocalizedName = FText : : Format ( LOCTEXT ( " VisualizeFlagLabel " , " Visualize {ShowFlagName} " ) , Args ) ;
break ;
default :
LocalizedName = FText : : Format ( LOCTEXT ( " ShowFlagLabel " , " Show {ShowFlagName} " ) , Args ) ;
break ;
}
//@todo Slate: The show flags system does not support descriptions currently
const FText ShowFlagDesc ;
TSharedPtr < FUICommandInfo > ShowFlagCommand
= FUICommandInfoDecl ( this - > AsShared ( ) , SFData . ShowFlagName , LocalizedName , ShowFlagDesc )
. UserInterfaceType ( EUserInterfaceActionType : : ToggleButton )
2015-03-17 11:36:28 -04:00
. DefaultChord ( SFData . InputChord )
2014-03-14 14:13:41 -04:00
. Icon ( SFData . Group = = EShowFlagGroup : : SFG_Normal ?
FSlateIcon ( FEditorStyle : : GetStyleSetName ( ) , FEditorStyle : : Join ( GetContextName ( ) , TCHAR_TO_ANSI ( * FString : : Printf ( TEXT ( " .%s " ) , * SFData . ShowFlagName . ToString ( ) ) ) ) ) :
FSlateIcon ( ) ) ;
ShowFlagCommands . Add ( FLevelViewportCommands : : FShowMenuCommand ( ShowFlagCommand , SFData . DisplayName ) ) ;
}
// Generate a command for each volume class
{
2015-03-17 11:36:28 -04:00
UI_COMMAND ( ShowAllVolumes , " Show All Volumes " , " Shows all volumes " , EUserInterfaceActionType : : Button , FInputChord ( ) ) ;
UI_COMMAND ( HideAllVolumes , " Hide All Volumes " , " Hides all volumes " , EUserInterfaceActionType : : Button , FInputChord ( ) ) ;
2014-03-14 14:13:41 -04:00
TArray < UClass * > VolumeClasses ;
2014-11-11 19:58:48 -05:00
UUnrealEdEngine : : GetSortedVolumeClasses ( & VolumeClasses ) ;
2014-03-14 14:13:41 -04:00
for ( int32 VolumeClassIndex = 0 ; VolumeClassIndex < VolumeClasses . Num ( ) ; + + VolumeClassIndex )
{
//@todo Slate: The show flags system does not support descriptions currently
const FText VolumeDesc ;
const FName VolumeName = VolumeClasses [ VolumeClassIndex ] - > GetFName ( ) ;
FText DisplayName ;
FEngineShowFlags : : FindShowFlagDisplayName ( VolumeName . ToString ( ) , DisplayName ) ;
FFormatNamedArguments Args ;
Args . Add ( TEXT ( " ShowFlagName " ) , DisplayName ) ;
const FText LocalizedName = FText : : Format ( LOCTEXT ( " ShowFlagLabel_Visualize " , " Visualize {ShowFlagName} " ) , Args ) ;
TSharedPtr < FUICommandInfo > ShowVolumeCommand
= FUICommandInfoDecl ( this - > AsShared ( ) , VolumeName , LocalizedName , VolumeDesc )
. UserInterfaceType ( EUserInterfaceActionType : : ToggleButton ) ;
ShowVolumeCommands . Add ( FLevelViewportCommands : : FShowMenuCommand ( ShowVolumeCommand , DisplayName ) ) ;
}
}
// Generate a command for show/hide all layers
{
2015-03-17 11:36:28 -04:00
UI_COMMAND ( ShowAllLayers , " Show All Layers " , " Shows all layers " , EUserInterfaceActionType : : Button , FInputChord ( ) ) ;
UI_COMMAND ( HideAllLayers , " Hide All Layers " , " Hides all layers " , EUserInterfaceActionType : : Button , FInputChord ( ) ) ;
2014-03-14 14:13:41 -04:00
}
// Generate a command for each sprite category
{
2015-03-17 11:36:28 -04:00
UI_COMMAND ( ShowAllSprites , " Show All Sprites " , " Shows all sprites " , EUserInterfaceActionType : : Button , FInputChord ( ) ) ;
UI_COMMAND ( HideAllSprites , " Hide All Sprites " , " Hides all sprites " , EUserInterfaceActionType : : Button , FInputChord ( ) ) ;
2014-03-14 14:13:41 -04:00
// get all the known layers
// Get a fresh list as GUnrealEd->SortedSpriteInfo may not yet be built.
TArray < FSpriteCategoryInfo > SortedSpriteInfo ;
2014-11-11 19:58:48 -05:00
UUnrealEdEngine : : MakeSortedSpriteInfo ( SortedSpriteInfo ) ;
2014-03-14 14:13:41 -04:00
FString SpritePrefix = TEXT ( " ShowSprite_ " ) ;
for ( int32 InfoIndex = 0 ; InfoIndex < SortedSpriteInfo . Num ( ) ; + + InfoIndex )
{
const FSpriteCategoryInfo & SpriteInfo = SortedSpriteInfo [ InfoIndex ] ;
const FName CommandName = FName ( * ( SpritePrefix + SpriteInfo . Category . ToString ( ) ) ) ;
FFormatNamedArguments Args ;
Args . Add ( TEXT ( " SpriteName " ) , SpriteInfo . DisplayName ) ;
const FText LocalizedName = FText : : Format ( NSLOCTEXT ( " UICommands " , " SpriteShowFlagName " , " Show {SpriteName} Sprites " ) , Args ) ;
TSharedPtr < FUICommandInfo > ShowSpriteCommand
= FUICommandInfoDecl ( this - > AsShared ( ) , CommandName , LocalizedName , SpriteInfo . Description )
. UserInterfaceType ( EUserInterfaceActionType : : ToggleButton ) ;
ShowSpriteCommands . Add ( FLevelViewportCommands : : FShowMenuCommand ( ShowSpriteCommand , SpriteInfo . DisplayName ) ) ;
}
}
Simple and Group Stat Exec commands can now be triggered from the level viewport Show menu directly.
#ttp 306334 - ROCKET: TASK: PUNTABLE: Stats: FN: Make diagnostic stats discoverable and available in the UI (don't require console to toggle)
#branch UE4
#change
DECLARE_STATS_GROUP û Added additional param GroupCategory, for subfolder use in the UI. Fixedup all Stats Group usage so the category is now propagated through where it needs to be.
Currently all Group stats have the Category æAdvancedÆ, and all engine stats have the Category æSimpleÆ û this is just to differentiate them for now, better categories will come along in future.
Modified FindOrAddMetaData as it now broadcasts a delegate (via a TaskGraph) whenever a new stat meta data is added û this was needed as not all the stat groups are æregisteredÆ when the level viewports are created (they are drip loaded), so the viewports need to listen for any additions thereafter...
GroupDescription is displayed as a tooltip in the UI for the stat entry and we may want to localize these.
RenderStats & RenderGroupedWithHierarchy: Modified so that it now takes the viewport that it should render to as a param (which is also used to determine if each stat should be visible).
Removed StatsEnabled delegate in favour of StatCheckEnabled, StatEnabled, StatDisabled, StatDisableAll for more finite usage and feedback when toggling them.
Modified FHUDGroupManager HandleCommand It now uses the new delegates to work out whether it needs to enable or disable for the current viewport, so itÆs more involved than a simple toggle, itÆs more ôis the stat enabled for the current viewport, and is it enabled for any viewportö delegate querying so it can react accordingly.
Added struct FSimpleStatFuncs: Which contains info on each æSimple StatÆ such as; name, category, description, renderfunc, togglefunc and the side of the viewport it should be rendered to
ExecSimpleStat û Calls Exec for a registered Simple Stat, ensuring the correct viewport is set
IsSimpleStat û Checks to see if a stat is a registered Simple Stat or not
SetSimpleStat û Sets the state of a specified Simple Stats
SetSimpleStats - Sets the state of the specified Simple Stats
RenderSimpleStats û Renders the Simple Stats if they are enabled, and have Render functions assigned.
Each Exec function had the code it executes which itÆs toggled and rendered into functions
Added FStatUnitData & FStatHitchesData: Moved all the globals/static variables used when enabling Stat Unit/Hitches into a struct as itÆs now used by multiple viewports and they needed their own copies. Also moved their draw functions here too.
FSceneViewport:
SwapStatCommands û Exchanges the enabled stats between two viewports, this is so when PIEing the stats which were enabled on the Level Viewport (if playing in active viewport only) get transposed to the Game Viewport, and then restored when PIE ends.
SEditorViewport:
ToggleStatCommand û Called when a stat is enabled/disabled from the UI
IsStatCommandVisible û Checks to see if a stat command should appear as visible in the UI
SEditorViewportViewMenu:
GenerateViewMenuContent û Made protected and virtual so it could be called externally.
FLevelViewportCommands: Added the code needed to generate commands for each of the Stat menu entries, however because not all stats are registered when this happens, it also creates some delegates to listen out for others that are registered later
Destructor û Needed to reset delegates
HandleNewGroupStat û Creates the new group stat commands
HandleNewStat û Creates the new stat command
FindStatIndex û Looks for where a stat should be inserted in the menu in order to maintain alphabetical order
SLevelViewport:
Modified the code so that the states of all the SimpleStats are saved so they can be restored next time the editor is ran (previously just handled FPS).
OnFloatingButtonClicked û Called whenever any of the level viewports floating buttons are clicked in order to correctly set the ælastÆ viewport global
OnToggleAllStatCommands û Called when the user selects æHide AllÆ from the viewport.
ToggleStatCommand û Called when the user selects any other stat option from the viewport.
BindStatCommand û Used to bind the menu action to the command name (used by delegate)
Added SLevelEditorViewportViewMenu (extends SEditorViewportViewMenu), and overrode GenerateViewMenuContent so that OnFloatingButtonClicked can be called whenever the menu is clicked on. This is also called during GenerateOptionsMenu, GenerateCameraMenu, GenerateShowMenu & OnToggleMaximize
Added global ptr GStatProcessingViewportClient (sim to Current, Last) used to keep track of which viewport the stat should be applied too (only valid within the scope of the Exec call).
FViewportClient:
Moved global ESoundShowFlags enum list into this class.
FCommonViewportClient:
Destructor û Needed to reset GStatProcessingViewportClient
FLevelEditorViewportClient
SetCurrentViewport û moved code responsible for setting the global æcurrentÆ viewport ptr into a func
SetLastKeyViewport û moved the code responsible for settings the global ælastÆ viewport ptr into a func
UGameViewportClient:
Destructor û Needed to cleanup delegate usage.
FViewportClient & FLevelEditorViewportClient & UGameViewportClient*
GetStatUnitData û The viewports copy of the variables needed when running the Stat Unit Exec
GetStatHitchesData û The viewports copy of the variables needed when running the Stat Hitches Exec
GetEnabledStats û Gets a list of all the stats which are enabled for the viewport
SetEnabledStats û Sets a list of all the stats which should be enabled for the viewport
IsStatEnabled û Checks to see if a specific stat is enabled for the viewport
SetStatEnabled û Sets a specifics stats state to enabled or disabled
GetSoundShowFlags û Gets which flags are enabled for the Stat Sounds Exec
SetSoundShowFlags û Sets which flags are enabled for the Stat Sounds Exec
HandleViewportStatCheckEnabled (delegate) û checks to see if a specific stat is enabled on this viewport
HandleViewportStatEnabled (delegate) û enables a specific stat for the viewport
HandleViewportStatDisabled (delegate) û disables a specific stat for the viewport
HandleViewportStatDisableAll (delegate) û disables all stats for the viewport
*FViewportClient has dummy virtual funcs and LevelEditor/Game both have the same implementations, the only differences is the GameViewports member variables are static so that the stat info persists between runs.
FLevelEditorViewportInstanceSettings deprecated bShowFPS in favour of an EnabledStats array (so we can track the state of all stats, not just FPS).
Added new config var bSaveSimpleStats: if enabled, restores previously enabled level viewport simple stats the next time the editor runs (defaults to false).
Modified FillShowFlagMenu so that thereÆs just one func and you specify where (if any) youÆd like a separator to occur.
Added FillShowStatsSubMenus so that menus can be generated which have submenus
Added the Stats sub menu to the View menu
Modified Execs so that the GStatProcessingViewportClient is set to the correct default viewport (if it wasnÆt specified), and clears again after itÆs been processed
HandleStatCommand now takes World and ViewportClient as params too û needed when Execs enabled other Execs so the world/viewport persists.
SetAverageUnitTimes û Added as a Setter func for GetAverageUnitTimes (moved code out of Stat Unit renderer and modified so that it only updates once per frame).
Stripped out all unneeded globals
[CL 2058522 by Andrew Brown in Main branch]
2014-04-29 04:04:27 -04:00
// Generate a command for each Stat category
{
2015-03-17 11:36:28 -04:00
UI_COMMAND ( HideAllStats , " Hide All Stats " , " Hides all Stats " , EUserInterfaceActionType : : Button , FInputChord ( ) ) ;
Simple and Group Stat Exec commands can now be triggered from the level viewport Show menu directly.
#ttp 306334 - ROCKET: TASK: PUNTABLE: Stats: FN: Make diagnostic stats discoverable and available in the UI (don't require console to toggle)
#branch UE4
#change
DECLARE_STATS_GROUP û Added additional param GroupCategory, for subfolder use in the UI. Fixedup all Stats Group usage so the category is now propagated through where it needs to be.
Currently all Group stats have the Category æAdvancedÆ, and all engine stats have the Category æSimpleÆ û this is just to differentiate them for now, better categories will come along in future.
Modified FindOrAddMetaData as it now broadcasts a delegate (via a TaskGraph) whenever a new stat meta data is added û this was needed as not all the stat groups are æregisteredÆ when the level viewports are created (they are drip loaded), so the viewports need to listen for any additions thereafter...
GroupDescription is displayed as a tooltip in the UI for the stat entry and we may want to localize these.
RenderStats & RenderGroupedWithHierarchy: Modified so that it now takes the viewport that it should render to as a param (which is also used to determine if each stat should be visible).
Removed StatsEnabled delegate in favour of StatCheckEnabled, StatEnabled, StatDisabled, StatDisableAll for more finite usage and feedback when toggling them.
Modified FHUDGroupManager HandleCommand It now uses the new delegates to work out whether it needs to enable or disable for the current viewport, so itÆs more involved than a simple toggle, itÆs more ôis the stat enabled for the current viewport, and is it enabled for any viewportö delegate querying so it can react accordingly.
Added struct FSimpleStatFuncs: Which contains info on each æSimple StatÆ such as; name, category, description, renderfunc, togglefunc and the side of the viewport it should be rendered to
ExecSimpleStat û Calls Exec for a registered Simple Stat, ensuring the correct viewport is set
IsSimpleStat û Checks to see if a stat is a registered Simple Stat or not
SetSimpleStat û Sets the state of a specified Simple Stats
SetSimpleStats - Sets the state of the specified Simple Stats
RenderSimpleStats û Renders the Simple Stats if they are enabled, and have Render functions assigned.
Each Exec function had the code it executes which itÆs toggled and rendered into functions
Added FStatUnitData & FStatHitchesData: Moved all the globals/static variables used when enabling Stat Unit/Hitches into a struct as itÆs now used by multiple viewports and they needed their own copies. Also moved their draw functions here too.
FSceneViewport:
SwapStatCommands û Exchanges the enabled stats between two viewports, this is so when PIEing the stats which were enabled on the Level Viewport (if playing in active viewport only) get transposed to the Game Viewport, and then restored when PIE ends.
SEditorViewport:
ToggleStatCommand û Called when a stat is enabled/disabled from the UI
IsStatCommandVisible û Checks to see if a stat command should appear as visible in the UI
SEditorViewportViewMenu:
GenerateViewMenuContent û Made protected and virtual so it could be called externally.
FLevelViewportCommands: Added the code needed to generate commands for each of the Stat menu entries, however because not all stats are registered when this happens, it also creates some delegates to listen out for others that are registered later
Destructor û Needed to reset delegates
HandleNewGroupStat û Creates the new group stat commands
HandleNewStat û Creates the new stat command
FindStatIndex û Looks for where a stat should be inserted in the menu in order to maintain alphabetical order
SLevelViewport:
Modified the code so that the states of all the SimpleStats are saved so they can be restored next time the editor is ran (previously just handled FPS).
OnFloatingButtonClicked û Called whenever any of the level viewports floating buttons are clicked in order to correctly set the ælastÆ viewport global
OnToggleAllStatCommands û Called when the user selects æHide AllÆ from the viewport.
ToggleStatCommand û Called when the user selects any other stat option from the viewport.
BindStatCommand û Used to bind the menu action to the command name (used by delegate)
Added SLevelEditorViewportViewMenu (extends SEditorViewportViewMenu), and overrode GenerateViewMenuContent so that OnFloatingButtonClicked can be called whenever the menu is clicked on. This is also called during GenerateOptionsMenu, GenerateCameraMenu, GenerateShowMenu & OnToggleMaximize
Added global ptr GStatProcessingViewportClient (sim to Current, Last) used to keep track of which viewport the stat should be applied too (only valid within the scope of the Exec call).
FViewportClient:
Moved global ESoundShowFlags enum list into this class.
FCommonViewportClient:
Destructor û Needed to reset GStatProcessingViewportClient
FLevelEditorViewportClient
SetCurrentViewport û moved code responsible for setting the global æcurrentÆ viewport ptr into a func
SetLastKeyViewport û moved the code responsible for settings the global ælastÆ viewport ptr into a func
UGameViewportClient:
Destructor û Needed to cleanup delegate usage.
FViewportClient & FLevelEditorViewportClient & UGameViewportClient*
GetStatUnitData û The viewports copy of the variables needed when running the Stat Unit Exec
GetStatHitchesData û The viewports copy of the variables needed when running the Stat Hitches Exec
GetEnabledStats û Gets a list of all the stats which are enabled for the viewport
SetEnabledStats û Sets a list of all the stats which should be enabled for the viewport
IsStatEnabled û Checks to see if a specific stat is enabled for the viewport
SetStatEnabled û Sets a specifics stats state to enabled or disabled
GetSoundShowFlags û Gets which flags are enabled for the Stat Sounds Exec
SetSoundShowFlags û Sets which flags are enabled for the Stat Sounds Exec
HandleViewportStatCheckEnabled (delegate) û checks to see if a specific stat is enabled on this viewport
HandleViewportStatEnabled (delegate) û enables a specific stat for the viewport
HandleViewportStatDisabled (delegate) û disables a specific stat for the viewport
HandleViewportStatDisableAll (delegate) û disables all stats for the viewport
*FViewportClient has dummy virtual funcs and LevelEditor/Game both have the same implementations, the only differences is the GameViewports member variables are static so that the stat info persists between runs.
FLevelEditorViewportInstanceSettings deprecated bShowFPS in favour of an EnabledStats array (so we can track the state of all stats, not just FPS).
Added new config var bSaveSimpleStats: if enabled, restores previously enabled level viewport simple stats the next time the editor runs (defaults to false).
Modified FillShowFlagMenu so that thereÆs just one func and you specify where (if any) youÆd like a separator to occur.
Added FillShowStatsSubMenus so that menus can be generated which have submenus
Added the Stats sub menu to the View menu
Modified Execs so that the GStatProcessingViewportClient is set to the correct default viewport (if it wasnÆt specified), and clears again after itÆs been processed
HandleStatCommand now takes World and ViewportClient as params too û needed when Execs enabled other Execs so the world/viewport persists.
SetAverageUnitTimes û Added as a Setter func for GetAverageUnitTimes (moved code out of Stat Unit renderer and modified so that it only updates once per frame).
Stripped out all unneeded globals
[CL 2058522 by Andrew Brown in Main branch]
2014-04-29 04:04:27 -04:00
// Bind a listener here for any additional stat commands that get registered later.
UEngine : : NewStatDelegate . AddRaw ( this , & FLevelViewportCommands : : HandleNewStat ) ;
# if STATS
FStatGroupGameThreadNotifier : : Get ( ) . NewStatGroupDelegate . BindRaw ( this , & FLevelViewportCommands : : HandleNewStatGroup ) ;
# endif
}
2014-03-14 14:13:41 -04:00
// Map the bookmark index to default key.
// If the max bookmark number ever increases the new bookmarks will not have default keys
TArray < FKey > NumberKeyNames ;
NumberKeyNames . Add ( EKeys : : Zero ) ;
NumberKeyNames . Add ( EKeys : : One ) ;
NumberKeyNames . Add ( EKeys : : Two ) ;
NumberKeyNames . Add ( EKeys : : Three ) ;
NumberKeyNames . Add ( EKeys : : Four ) ;
NumberKeyNames . Add ( EKeys : : Five ) ;
NumberKeyNames . Add ( EKeys : : Six ) ;
NumberKeyNames . Add ( EKeys : : Seven ) ;
NumberKeyNames . Add ( EKeys : : Eight ) ;
NumberKeyNames . Add ( EKeys : : Nine ) ;
for ( int32 BookmarkIndex = 0 ; BookmarkIndex < AWorldSettings : : MAX_BOOKMARK_NUMBER ; + + BookmarkIndex )
{
TSharedRef < FUICommandInfo > JumpToBookmark =
FUICommandInfoDecl (
this - > AsShared ( ) , //Command class
FName ( * FString : : Printf ( TEXT ( " JumpToBookmark%i " ) , BookmarkIndex ) ) , //CommandName
FText : : Format ( NSLOCTEXT ( " LevelEditorCommands " , " JumpToBookmark " , " Jump to Bookmark {0} " ) , FText : : AsNumber ( BookmarkIndex ) ) , //Localized label
FText : : Format ( NSLOCTEXT ( " LevelEditorCommands " , " JumpToBookmark_ToolTip " , " Moves the viewport to the location and orientation stored at bookmark {0} " ) , FText : : AsNumber ( BookmarkIndex ) ) ) //Localized tooltip
. UserInterfaceType ( EUserInterfaceActionType : : Button ) //interface type
2015-03-17 11:36:28 -04:00
. DefaultChord ( FInputChord ( NumberKeyNames . IsValidIndex ( BookmarkIndex ) ? NumberKeyNames [ BookmarkIndex ] : EKeys : : Invalid ) ) ; //default chord
2014-03-14 14:13:41 -04:00
JumpToBookmarkCommands . Add ( JumpToBookmark ) ;
TSharedRef < FUICommandInfo > SetBookmark =
FUICommandInfoDecl (
this - > AsShared ( ) , //Command class
FName ( * FString : : Printf ( TEXT ( " SetBookmark%i " ) , BookmarkIndex ) ) , //CommandName
FText : : Format ( NSLOCTEXT ( " LevelEditorCommands " , " SetBookmark " , " Set Bookmark {0} " ) , FText : : AsNumber ( BookmarkIndex ) ) , //Localized label
FText : : Format ( NSLOCTEXT ( " LevelEditorCommands " , " SetBookmark_ToolTip " , " Stores the viewports location and orientation in bookmark {0} " ) , FText : : AsNumber ( BookmarkIndex ) ) ) //Localized tooltip
. UserInterfaceType ( EUserInterfaceActionType : : Button ) //interface type
2015-03-17 11:36:28 -04:00
. DefaultChord ( FInputChord ( EModifierKey : : Control , NumberKeyNames . IsValidIndex ( BookmarkIndex ) ? NumberKeyNames [ BookmarkIndex ] : EKeys : : Invalid ) ) ; //default chord
2014-03-14 14:13:41 -04:00
SetBookmarkCommands . Add ( SetBookmark ) ;
TSharedRef < FUICommandInfo > ClearBookMark =
FUICommandInfoDecl (
this - > AsShared ( ) , //Command class
FName ( * FString : : Printf ( TEXT ( " ClearBookmark%i " ) , BookmarkIndex ) ) , //CommandName
FText : : Format ( NSLOCTEXT ( " LevelEditorCommands " , " ClearBookmark " , " Clear Bookmark {0} " ) , FText : : AsNumber ( BookmarkIndex ) ) , //Localized label
FText : : Format ( NSLOCTEXT ( " LevelEditorCommands " , " ClearBookmark_ToolTip " , " Clears the viewports location and orientation in bookmark {0} " ) , FText : : AsNumber ( BookmarkIndex ) ) ) //Localized tooltip
. UserInterfaceType ( EUserInterfaceActionType : : Button ) //interface type
2015-03-17 11:36:28 -04:00
. DefaultChord ( FInputChord ( ) ) ; //default chord
2014-03-14 14:13:41 -04:00
ClearBookmarkCommands . Add ( ClearBookMark ) ;
}
2015-03-17 11:36:28 -04:00
UI_COMMAND ( ClearAllBookMarks , " Clear All Bookmarks " , " Clears all the bookmarks " , EUserInterfaceActionType : : Button , FInputChord ( ) ) ;
2014-03-14 14:13:41 -04:00
2015-03-17 11:36:28 -04:00
UI_COMMAND ( EnablePreviewMesh , " Hold To Enable Preview Mesh " , " When held down a preview mesh appears under the cursor " , EUserInterfaceActionType : : Button , FInputChord ( EKeys : : Backslash ) ) ;
UI_COMMAND ( CyclePreviewMesh , " Cycles Preview Mesh " , " Cycles available preview meshes " , EUserInterfaceActionType : : Button , FInputChord ( EModifierKey : : Shift , EKeys : : Backslash ) ) ;
2014-03-14 14:13:41 -04:00
}
Simple and Group Stat Exec commands can now be triggered from the level viewport Show menu directly.
#ttp 306334 - ROCKET: TASK: PUNTABLE: Stats: FN: Make diagnostic stats discoverable and available in the UI (don't require console to toggle)
#branch UE4
#change
DECLARE_STATS_GROUP û Added additional param GroupCategory, for subfolder use in the UI. Fixedup all Stats Group usage so the category is now propagated through where it needs to be.
Currently all Group stats have the Category æAdvancedÆ, and all engine stats have the Category æSimpleÆ û this is just to differentiate them for now, better categories will come along in future.
Modified FindOrAddMetaData as it now broadcasts a delegate (via a TaskGraph) whenever a new stat meta data is added û this was needed as not all the stat groups are æregisteredÆ when the level viewports are created (they are drip loaded), so the viewports need to listen for any additions thereafter...
GroupDescription is displayed as a tooltip in the UI for the stat entry and we may want to localize these.
RenderStats & RenderGroupedWithHierarchy: Modified so that it now takes the viewport that it should render to as a param (which is also used to determine if each stat should be visible).
Removed StatsEnabled delegate in favour of StatCheckEnabled, StatEnabled, StatDisabled, StatDisableAll for more finite usage and feedback when toggling them.
Modified FHUDGroupManager HandleCommand It now uses the new delegates to work out whether it needs to enable or disable for the current viewport, so itÆs more involved than a simple toggle, itÆs more ôis the stat enabled for the current viewport, and is it enabled for any viewportö delegate querying so it can react accordingly.
Added struct FSimpleStatFuncs: Which contains info on each æSimple StatÆ such as; name, category, description, renderfunc, togglefunc and the side of the viewport it should be rendered to
ExecSimpleStat û Calls Exec for a registered Simple Stat, ensuring the correct viewport is set
IsSimpleStat û Checks to see if a stat is a registered Simple Stat or not
SetSimpleStat û Sets the state of a specified Simple Stats
SetSimpleStats - Sets the state of the specified Simple Stats
RenderSimpleStats û Renders the Simple Stats if they are enabled, and have Render functions assigned.
Each Exec function had the code it executes which itÆs toggled and rendered into functions
Added FStatUnitData & FStatHitchesData: Moved all the globals/static variables used when enabling Stat Unit/Hitches into a struct as itÆs now used by multiple viewports and they needed their own copies. Also moved their draw functions here too.
FSceneViewport:
SwapStatCommands û Exchanges the enabled stats between two viewports, this is so when PIEing the stats which were enabled on the Level Viewport (if playing in active viewport only) get transposed to the Game Viewport, and then restored when PIE ends.
SEditorViewport:
ToggleStatCommand û Called when a stat is enabled/disabled from the UI
IsStatCommandVisible û Checks to see if a stat command should appear as visible in the UI
SEditorViewportViewMenu:
GenerateViewMenuContent û Made protected and virtual so it could be called externally.
FLevelViewportCommands: Added the code needed to generate commands for each of the Stat menu entries, however because not all stats are registered when this happens, it also creates some delegates to listen out for others that are registered later
Destructor û Needed to reset delegates
HandleNewGroupStat û Creates the new group stat commands
HandleNewStat û Creates the new stat command
FindStatIndex û Looks for where a stat should be inserted in the menu in order to maintain alphabetical order
SLevelViewport:
Modified the code so that the states of all the SimpleStats are saved so they can be restored next time the editor is ran (previously just handled FPS).
OnFloatingButtonClicked û Called whenever any of the level viewports floating buttons are clicked in order to correctly set the ælastÆ viewport global
OnToggleAllStatCommands û Called when the user selects æHide AllÆ from the viewport.
ToggleStatCommand û Called when the user selects any other stat option from the viewport.
BindStatCommand û Used to bind the menu action to the command name (used by delegate)
Added SLevelEditorViewportViewMenu (extends SEditorViewportViewMenu), and overrode GenerateViewMenuContent so that OnFloatingButtonClicked can be called whenever the menu is clicked on. This is also called during GenerateOptionsMenu, GenerateCameraMenu, GenerateShowMenu & OnToggleMaximize
Added global ptr GStatProcessingViewportClient (sim to Current, Last) used to keep track of which viewport the stat should be applied too (only valid within the scope of the Exec call).
FViewportClient:
Moved global ESoundShowFlags enum list into this class.
FCommonViewportClient:
Destructor û Needed to reset GStatProcessingViewportClient
FLevelEditorViewportClient
SetCurrentViewport û moved code responsible for setting the global æcurrentÆ viewport ptr into a func
SetLastKeyViewport û moved the code responsible for settings the global ælastÆ viewport ptr into a func
UGameViewportClient:
Destructor û Needed to cleanup delegate usage.
FViewportClient & FLevelEditorViewportClient & UGameViewportClient*
GetStatUnitData û The viewports copy of the variables needed when running the Stat Unit Exec
GetStatHitchesData û The viewports copy of the variables needed when running the Stat Hitches Exec
GetEnabledStats û Gets a list of all the stats which are enabled for the viewport
SetEnabledStats û Sets a list of all the stats which should be enabled for the viewport
IsStatEnabled û Checks to see if a specific stat is enabled for the viewport
SetStatEnabled û Sets a specifics stats state to enabled or disabled
GetSoundShowFlags û Gets which flags are enabled for the Stat Sounds Exec
SetSoundShowFlags û Sets which flags are enabled for the Stat Sounds Exec
HandleViewportStatCheckEnabled (delegate) û checks to see if a specific stat is enabled on this viewport
HandleViewportStatEnabled (delegate) û enables a specific stat for the viewport
HandleViewportStatDisabled (delegate) û disables a specific stat for the viewport
HandleViewportStatDisableAll (delegate) û disables all stats for the viewport
*FViewportClient has dummy virtual funcs and LevelEditor/Game both have the same implementations, the only differences is the GameViewports member variables are static so that the stat info persists between runs.
FLevelEditorViewportInstanceSettings deprecated bShowFPS in favour of an EnabledStats array (so we can track the state of all stats, not just FPS).
Added new config var bSaveSimpleStats: if enabled, restores previously enabled level viewport simple stats the next time the editor runs (defaults to false).
Modified FillShowFlagMenu so that thereÆs just one func and you specify where (if any) youÆd like a separator to occur.
Added FillShowStatsSubMenus so that menus can be generated which have submenus
Added the Stats sub menu to the View menu
Modified Execs so that the GStatProcessingViewportClient is set to the correct default viewport (if it wasnÆt specified), and clears again after itÆs been processed
HandleStatCommand now takes World and ViewportClient as params too û needed when Execs enabled other Execs so the world/viewport persists.
SetAverageUnitTimes û Added as a Setter func for GetAverageUnitTimes (moved code out of Stat Unit renderer and modified so that it only updates once per frame).
Stripped out all unneeded globals
[CL 2058522 by Andrew Brown in Main branch]
2014-04-29 04:04:27 -04:00
void FLevelViewportCommands : : HandleNewStatGroup ( const TArray < FStatNameAndInfo > & NameAndInfos )
{
2014-10-24 08:10:31 -04:00
// @TODO yrx 2014-10-17 FStatNameAndInfo should be private and visible only to stats2 system
Simple and Group Stat Exec commands can now be triggered from the level viewport Show menu directly.
#ttp 306334 - ROCKET: TASK: PUNTABLE: Stats: FN: Make diagnostic stats discoverable and available in the UI (don't require console to toggle)
#branch UE4
#change
DECLARE_STATS_GROUP û Added additional param GroupCategory, for subfolder use in the UI. Fixedup all Stats Group usage so the category is now propagated through where it needs to be.
Currently all Group stats have the Category æAdvancedÆ, and all engine stats have the Category æSimpleÆ û this is just to differentiate them for now, better categories will come along in future.
Modified FindOrAddMetaData as it now broadcasts a delegate (via a TaskGraph) whenever a new stat meta data is added û this was needed as not all the stat groups are æregisteredÆ when the level viewports are created (they are drip loaded), so the viewports need to listen for any additions thereafter...
GroupDescription is displayed as a tooltip in the UI for the stat entry and we may want to localize these.
RenderStats & RenderGroupedWithHierarchy: Modified so that it now takes the viewport that it should render to as a param (which is also used to determine if each stat should be visible).
Removed StatsEnabled delegate in favour of StatCheckEnabled, StatEnabled, StatDisabled, StatDisableAll for more finite usage and feedback when toggling them.
Modified FHUDGroupManager HandleCommand It now uses the new delegates to work out whether it needs to enable or disable for the current viewport, so itÆs more involved than a simple toggle, itÆs more ôis the stat enabled for the current viewport, and is it enabled for any viewportö delegate querying so it can react accordingly.
Added struct FSimpleStatFuncs: Which contains info on each æSimple StatÆ such as; name, category, description, renderfunc, togglefunc and the side of the viewport it should be rendered to
ExecSimpleStat û Calls Exec for a registered Simple Stat, ensuring the correct viewport is set
IsSimpleStat û Checks to see if a stat is a registered Simple Stat or not
SetSimpleStat û Sets the state of a specified Simple Stats
SetSimpleStats - Sets the state of the specified Simple Stats
RenderSimpleStats û Renders the Simple Stats if they are enabled, and have Render functions assigned.
Each Exec function had the code it executes which itÆs toggled and rendered into functions
Added FStatUnitData & FStatHitchesData: Moved all the globals/static variables used when enabling Stat Unit/Hitches into a struct as itÆs now used by multiple viewports and they needed their own copies. Also moved their draw functions here too.
FSceneViewport:
SwapStatCommands û Exchanges the enabled stats between two viewports, this is so when PIEing the stats which were enabled on the Level Viewport (if playing in active viewport only) get transposed to the Game Viewport, and then restored when PIE ends.
SEditorViewport:
ToggleStatCommand û Called when a stat is enabled/disabled from the UI
IsStatCommandVisible û Checks to see if a stat command should appear as visible in the UI
SEditorViewportViewMenu:
GenerateViewMenuContent û Made protected and virtual so it could be called externally.
FLevelViewportCommands: Added the code needed to generate commands for each of the Stat menu entries, however because not all stats are registered when this happens, it also creates some delegates to listen out for others that are registered later
Destructor û Needed to reset delegates
HandleNewGroupStat û Creates the new group stat commands
HandleNewStat û Creates the new stat command
FindStatIndex û Looks for where a stat should be inserted in the menu in order to maintain alphabetical order
SLevelViewport:
Modified the code so that the states of all the SimpleStats are saved so they can be restored next time the editor is ran (previously just handled FPS).
OnFloatingButtonClicked û Called whenever any of the level viewports floating buttons are clicked in order to correctly set the ælastÆ viewport global
OnToggleAllStatCommands û Called when the user selects æHide AllÆ from the viewport.
ToggleStatCommand û Called when the user selects any other stat option from the viewport.
BindStatCommand û Used to bind the menu action to the command name (used by delegate)
Added SLevelEditorViewportViewMenu (extends SEditorViewportViewMenu), and overrode GenerateViewMenuContent so that OnFloatingButtonClicked can be called whenever the menu is clicked on. This is also called during GenerateOptionsMenu, GenerateCameraMenu, GenerateShowMenu & OnToggleMaximize
Added global ptr GStatProcessingViewportClient (sim to Current, Last) used to keep track of which viewport the stat should be applied too (only valid within the scope of the Exec call).
FViewportClient:
Moved global ESoundShowFlags enum list into this class.
FCommonViewportClient:
Destructor û Needed to reset GStatProcessingViewportClient
FLevelEditorViewportClient
SetCurrentViewport û moved code responsible for setting the global æcurrentÆ viewport ptr into a func
SetLastKeyViewport û moved the code responsible for settings the global ælastÆ viewport ptr into a func
UGameViewportClient:
Destructor û Needed to cleanup delegate usage.
FViewportClient & FLevelEditorViewportClient & UGameViewportClient*
GetStatUnitData û The viewports copy of the variables needed when running the Stat Unit Exec
GetStatHitchesData û The viewports copy of the variables needed when running the Stat Hitches Exec
GetEnabledStats û Gets a list of all the stats which are enabled for the viewport
SetEnabledStats û Sets a list of all the stats which should be enabled for the viewport
IsStatEnabled û Checks to see if a specific stat is enabled for the viewport
SetStatEnabled û Sets a specifics stats state to enabled or disabled
GetSoundShowFlags û Gets which flags are enabled for the Stat Sounds Exec
SetSoundShowFlags û Sets which flags are enabled for the Stat Sounds Exec
HandleViewportStatCheckEnabled (delegate) û checks to see if a specific stat is enabled on this viewport
HandleViewportStatEnabled (delegate) û enables a specific stat for the viewport
HandleViewportStatDisabled (delegate) û disables a specific stat for the viewport
HandleViewportStatDisableAll (delegate) û disables all stats for the viewport
*FViewportClient has dummy virtual funcs and LevelEditor/Game both have the same implementations, the only differences is the GameViewports member variables are static so that the stat info persists between runs.
FLevelEditorViewportInstanceSettings deprecated bShowFPS in favour of an EnabledStats array (so we can track the state of all stats, not just FPS).
Added new config var bSaveSimpleStats: if enabled, restores previously enabled level viewport simple stats the next time the editor runs (defaults to false).
Modified FillShowFlagMenu so that thereÆs just one func and you specify where (if any) youÆd like a separator to occur.
Added FillShowStatsSubMenus so that menus can be generated which have submenus
Added the Stats sub menu to the View menu
Modified Execs so that the GStatProcessingViewportClient is set to the correct default viewport (if it wasnÆt specified), and clears again after itÆs been processed
HandleStatCommand now takes World and ViewportClient as params too û needed when Execs enabled other Execs so the world/viewport persists.
SetAverageUnitTimes û Added as a Setter func for GetAverageUnitTimes (moved code out of Stat Unit renderer and modified so that it only updates once per frame).
Stripped out all unneeded globals
[CL 2058522 by Andrew Brown in Main branch]
2014-04-29 04:04:27 -04:00
for ( int32 InfoIdx = 0 ; InfoIdx < NameAndInfos . Num ( ) ; InfoIdx + + )
{
const FStatNameAndInfo & NameAndInfo = NameAndInfos [ InfoIdx ] ;
const FName GroupName = NameAndInfo . GetGroupName ( ) ;
const FName GroupCategory = NameAndInfo . GetGroupCategory ( ) ;
const FText GroupDescription = FText : : FromString ( NameAndInfo . GetDescription ( ) ) ; // @todo localize description?
HandleNewStat ( GroupName , GroupCategory , GroupDescription ) ;
}
}
void FLevelViewportCommands : : HandleNewStat ( const FName & InStatName , const FName & InStatCategory , const FText & InStatDescription )
{
FString CommandName = InStatName . ToString ( ) ;
if ( CommandName . RemoveFromStart ( TEXT ( " STATGROUP_ " ) ) | | CommandName . RemoveFromStart ( TEXT ( " STAT_ " ) ) )
{
// Trim the front to get our category name
FString GroupCategory = InStatCategory . ToString ( ) ;
if ( ! GroupCategory . RemoveFromStart ( TEXT ( " STATCAT_ " ) ) )
{
GroupCategory . Empty ( ) ;
}
// If we already have an entry (which can happen if a category has changed [when loading older saved stat data]) or we don't have a valid category then skip adding
if ( ! FInputBindingManager : : Get ( ) . FindCommandInContext ( this - > GetContextName ( ) , InStatName ) . IsValid ( ) & & ! GroupCategory . IsEmpty ( ) )
{
// Find or Add the category
TArray < FShowMenuCommand > * ShowStatCommands = ShowStatCatCommands . Find ( GroupCategory ) ;
if ( ! ShowStatCommands )
{
// New category means we'll need to resort
ShowStatCatCommands . Add ( GroupCategory ) ;
ShowStatCatCommands . KeySort ( TLess < FString > ( ) ) ;
ShowStatCommands = ShowStatCatCommands . Find ( GroupCategory ) ;
}
const int32 NewIndex = FindStatIndex ( ShowStatCommands , CommandName ) ;
if ( NewIndex ! = INDEX_NONE )
{
const FText DisplayName = FText : : FromString ( CommandName ) ;
FText DescriptionName = InStatDescription ;
FFormatNamedArguments Args ;
Args . Add ( TEXT ( " StatName " ) , DisplayName ) ;
if ( DescriptionName . IsEmpty ( ) )
{
DescriptionName = FText : : Format ( NSLOCTEXT ( " UICommands " , " StatShowCommandName " , " Show {StatName} Stat " ) , Args ) ;
}
TSharedPtr < FUICommandInfo > StatCommand
= FUICommandInfoDecl ( this - > AsShared ( ) , InStatName , FText : : GetEmpty ( ) , DescriptionName )
. UserInterfaceType ( EUserInterfaceActionType : : ToggleButton ) ;
FLevelViewportCommands : : FShowMenuCommand ShowStatCommand ( StatCommand , DisplayName ) ;
ShowStatCommands - > Insert ( ShowStatCommand , NewIndex ) ;
NewStatCommandDelegate . Broadcast ( ShowStatCommand . ShowMenuItem , ShowStatCommand . LabelOverride . ToString ( ) ) ;
}
}
}
}
int32 FLevelViewportCommands : : FindStatIndex ( const TArray < FShowMenuCommand > * ShowStatCommands , const FString & InCommandName ) const
{
check ( ShowStatCommands ) ;
for ( int32 StatIndex = 0 ; StatIndex < ShowStatCommands - > Num ( ) ; + + StatIndex )
{
const FString CommandName = ( * ShowStatCommands ) [ StatIndex ] . LabelOverride . ToString ( ) ;
const int32 Compare = InCommandName . Compare ( CommandName ) ;
if ( Compare = = 0 )
{
return INDEX_NONE ;
}
else if ( Compare < 0 )
{
return StatIndex ;
}
}
return ShowStatCommands - > Num ( ) ;
}
2014-03-14 14:13:41 -04:00
PRAGMA_ENABLE_OPTIMIZATION
# undef LOCTEXT_NAMESPACE