From 1ca084cf8a29f70aabe20510f791a8617e2e72e1 Mon Sep 17 00:00:00 2001 From: Fraser Waters Date: Tue, 18 Nov 2014 23:10:06 +0100 Subject: [PATCH] [Input] Add IsAnyKey/ButtonDown/Pressed to input state. Adds properties to KeyboardState, MouseState, JoystickState and GamePadState (GamePadButtons), to see if any key or button is down. This should be faster than iterating over all the public IsDown properties as we can make use of the internal bit fields. GamePadButtons uses IsButtonPressed rather than IsButtonDown like the others as it more closely matches it's current interface (no down methods). --- Source/OpenTK/Input/GamePadButtons.cs | 13 +++++++++++ Source/OpenTK/Input/JoystickState.cs | 13 +++++++++++ Source/OpenTK/Input/KeyboardState.cs | 41 +++++++++++++++++++++++++++++------ Source/OpenTK/Input/MouseState.cs | 13 +++++++++++ 4 files changed, 73 insertions(+), 7 deletions(-) diff --git a/Source/OpenTK/Input/GamePadButtons.cs b/Source/OpenTK/Input/GamePadButtons.cs index 3910d2e..aba12d4 100644 --- a/Source/OpenTK/Input/GamePadButtons.cs +++ b/Source/OpenTK/Input/GamePadButtons.cs @@ -140,6 +140,19 @@ namespace OpenTK.Input get { return GetButton(Buttons.Start); } } + /// + /// Gets a value indicating whether any button is pressed. + /// + /// true if any button is pressed; otherwise, false. + public bool IsAnyButtonPressed + { + get + { + // If any bit is set then a button is down. + return buttons != 0; + } + } + /// A instance to test for equality. /// A instance to test for equality. public static bool operator ==(GamePadButtons left, GamePadButtons right) diff --git a/Source/OpenTK/Input/JoystickState.cs b/Source/OpenTK/Input/JoystickState.cs index 1ecb562..540d5c7 100644 --- a/Source/OpenTK/Input/JoystickState.cs +++ b/Source/OpenTK/Input/JoystickState.cs @@ -124,6 +124,19 @@ namespace OpenTK.Input } /// + /// Gets a value indicating whether any button is down. + /// + /// true if any button is down; otherwise, false. + public bool IsAnyButtonDown + { + get + { + // If any bit is set then a button is down. + return buttons != 0; + } + } + + /// /// Gets a value indicating whether this instance is connected. /// /// true if this instance is connected; otherwise, false. diff --git a/Source/OpenTK/Input/KeyboardState.cs b/Source/OpenTK/Input/KeyboardState.cs index 2a61cd2..2071ae9 100644 --- a/Source/OpenTK/Input/KeyboardState.cs +++ b/Source/OpenTK/Input/KeyboardState.cs @@ -39,7 +39,7 @@ namespace OpenTK.Input #region Fields // Allocate enough ints to store all keyboard keys - const int IntSize = sizeof(int); + const int IntSize = sizeof(int) * 8; const int NumInts = ((int)Key.LastKey + IntSize - 1) / IntSize; // The following line triggers bogus CS0214 in gmcs 2.0.1, sigh... unsafe fixed int Keys[NumInts]; @@ -109,6 +109,33 @@ namespace OpenTK.Input } /// + /// Gets a value indicating whether any key is down. + /// + /// true if any key is down; otherwise, false. + public bool IsAnyKeyDown + { + get + { + // If any bit is set then a key is down. + unsafe + { + fixed (int* k = Keys) + { + for(int i = 0; i < NumInts; ++i) + { + if (k[i] != 0) + { + return true; + } + } + } + } + + return false; + } + } + + /// /// Gets a indicating whether this keyboard /// is connected. /// @@ -226,8 +253,8 @@ namespace OpenTK.Input { ValidateOffset(offset); - int int_offset = offset / 32; - int bit_offset = offset % 32; + int int_offset = offset / IntSize; + int bit_offset = offset % IntSize; unsafe { fixed (int* k = Keys) { return (*(k + int_offset) & (1 << bit_offset)) != 0u; } @@ -238,8 +265,8 @@ namespace OpenTK.Input { ValidateOffset(offset); - int int_offset = offset / 32; - int bit_offset = offset % 32; + int int_offset = offset / IntSize; + int bit_offset = offset % IntSize; unsafe { fixed (int* k = Keys) { *(k + int_offset) |= 1 << bit_offset; } @@ -250,8 +277,8 @@ namespace OpenTK.Input { ValidateOffset(offset); - int int_offset = offset / 32; - int bit_offset = offset % 32; + int int_offset = offset / IntSize; + int bit_offset = offset % IntSize; unsafe { fixed (int* k = Keys) { *(k + int_offset) &= ~(1 << bit_offset); } diff --git a/Source/OpenTK/Input/MouseState.cs b/Source/OpenTK/Input/MouseState.cs index 9c316e0..a819340 100644 --- a/Source/OpenTK/Input/MouseState.cs +++ b/Source/OpenTK/Input/MouseState.cs @@ -174,6 +174,19 @@ namespace OpenTK.Input } /// + /// Gets a value indicating whether any button is down. + /// + /// true if any button is down; otherwise, false. + public bool IsAnyButtonDown + { + get + { + // If any bit is set then a button is down. + return buttons != 0; + } + } + + /// /// Gets the absolute wheel position in integer units. This property is intended for XNA compatibility. /// To support high-precision mice, it is recommended to use instead. /// -- 2.7.4