@@ -38,6 +38,9 @@ internal sealed class SInputState : InputState
3838 /// <summary>The builder which reads the mouse state and applies overrides.</summary>
3939 private readonly MouseStateBuilder MouseStateBuilder = new ( ) ;
4040
41+ /// <summary>The pooled cache set for <see cref="FillPressedButtons"/> in <see cref="TrueUpdate"/>.</summary>
42+ private readonly HashSet < SButton > PooledPressedButtons = [ ] ;
43+
4144
4245 /*********
4346 ** Accessors
@@ -82,21 +85,26 @@ public void TrueUpdate()
8285 KeyboardStateBuilder keyboard = this . KeyboardStateBuilder ;
8386 MouseStateBuilder mouse = this . MouseStateBuilder ;
8487
88+ // get pooled button set
89+ HashSet < SButton > pressedButtons = this . PooledPressedButtons ;
90+
8591 // get real values
8692 controller . Reset ( base . GetGamePadState ( ) ) ;
8793 keyboard . Reset ( base . GetKeyboardState ( ) ) ;
8894 mouse . Reset ( base . GetMouseState ( ) ) ;
8995 Vector2 cursorAbsolutePos = new ( ( mouse . X * zoomMultiplier ) + Game1 . viewport . X , ( mouse . Y * zoomMultiplier ) + Game1 . viewport . Y ) ;
9096 Vector2 ? playerTilePos = Context . IsPlayerFree ? Game1 . player . Tile : null ;
91- HashSet < SButton > reallyDown = new ( this . GetPressedButtons ( keyboard , mouse , controller ) ) ;
97+
98+ pressedButtons . Clear ( ) ;
99+ this . FillPressedButtons ( pressedButtons , keyboard , mouse , controller ) ;
92100
93101 // apply overrides
94102 bool hasOverrides = false ;
95103 if ( this . CustomPressedKeys . Count > 0 || this . CustomReleasedKeys . Count > 0 )
96104 {
97105 // reset overrides that no longer apply
98- this . CustomPressedKeys . ExceptWith ( reallyDown ) ;
99- this . CustomReleasedKeys . IntersectWith ( reallyDown ) ;
106+ this . CustomPressedKeys . ExceptWith ( pressedButtons ) ;
107+ this . CustomReleasedKeys . IntersectWith ( pressedButtons ) ;
100108
101109 // apply overrides
102110 if ( this . ApplyOverrides ( this . CustomPressedKeys , this . CustomReleasedKeys , controller , keyboard , mouse ) )
@@ -107,9 +115,11 @@ public void TrueUpdate()
107115 }
108116
109117 // get button states
110- var pressedButtons = hasOverrides
111- ? new ( this . GetPressedButtons ( keyboard , mouse , controller ) )
112- : reallyDown ;
118+ if ( hasOverrides )
119+ {
120+ pressedButtons . Clear ( ) ;
121+ this . FillPressedButtons ( pressedButtons , keyboard , mouse , controller ) ;
122+ }
113123 var activeButtons = this . DeriveStates ( this . ButtonStates , pressedButtons ) ;
114124
115125 // update
@@ -315,15 +325,15 @@ private SButtonState GetState(IDictionary<SButton, SButtonState> activeButtons,
315325 }
316326
317327 /// <summary>Get the buttons pressed in the given stats.</summary>
328+ /// <param name="set">The set to populate with pressed buttons.</param>
318329 /// <param name="keyboard">The keyboard state.</param>
319330 /// <param name="mouse">The mouse state.</param>
320331 /// <param name="controller">The controller state.</param>
321332 /// <remarks>Thumbstick direction logic derived from <see cref="ButtonCollection"/>.</remarks>
322- private IEnumerable < SButton > GetPressedButtons ( KeyboardStateBuilder keyboard , MouseStateBuilder mouse , GamePadStateBuilder controller )
333+ private void FillPressedButtons ( HashSet < SButton > set , KeyboardStateBuilder keyboard , MouseStateBuilder mouse , GamePadStateBuilder controller )
323334 {
324- return keyboard
325- . GetPressedButtons ( )
326- . Concat ( mouse . GetPressedButtons ( ) )
327- . Concat ( controller . GetPressedButtons ( ) ) ;
335+ keyboard . FillPressedButtons ( set ) ;
336+ mouse . FillPressedButtons ( set ) ;
337+ controller . FillPressedButtons ( set ) ;
328338 }
329339}
0 commit comments