forked from MoonsideGames/MoonWorks
				
			Inputs.AnyPressed implementation
							parent
							
								
									db5ca97726
								
							
						
					
					
						commit
						1cf3a13541
					
				| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
namespace MoonWorks.Input
 | 
			
		||||
{
 | 
			
		||||
    // Blittable identifier that can be used for button state lookups.
 | 
			
		||||
    public struct ButtonIdentifier
 | 
			
		||||
    public struct ButtonIdentifier : System.IEquatable<ButtonIdentifier>
 | 
			
		||||
    {
 | 
			
		||||
        public DeviceKind DeviceKind { get; }
 | 
			
		||||
        public int Index { get; } // 1-4 for gamepads, 0 otherwise
 | 
			
		||||
| 
						 | 
				
			
			@ -27,5 +27,33 @@ namespace MoonWorks.Input
 | 
			
		|||
			Index = 0;
 | 
			
		||||
			Code = (int) mouseCode;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public override int GetHashCode()
 | 
			
		||||
		{
 | 
			
		||||
			return System.HashCode.Combine(DeviceKind, Index, Code);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public override bool Equals(object obj)
 | 
			
		||||
		{
 | 
			
		||||
			return obj is ButtonIdentifier identifier && Equals(identifier);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public bool Equals(ButtonIdentifier identifier)
 | 
			
		||||
		{
 | 
			
		||||
			return
 | 
			
		||||
				DeviceKind == identifier.DeviceKind &&
 | 
			
		||||
				Index == identifier.Index &&
 | 
			
		||||
				Code == identifier.Code;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public static bool operator ==(ButtonIdentifier a, ButtonIdentifier b)
 | 
			
		||||
		{
 | 
			
		||||
			return a.Equals(b);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public static bool operator !=(ButtonIdentifier a, ButtonIdentifier b)
 | 
			
		||||
		{
 | 
			
		||||
			return !(a == b);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,8 +2,9 @@ namespace MoonWorks.Input
 | 
			
		|||
{
 | 
			
		||||
    public enum DeviceKind
 | 
			
		||||
    {
 | 
			
		||||
		None,
 | 
			
		||||
        Keyboard,
 | 
			
		||||
        Mouse,
 | 
			
		||||
        Gamepad
 | 
			
		||||
        Gamepad,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,6 +36,9 @@ namespace MoonWorks.Input
 | 
			
		|||
 | 
			
		||||
		public bool IsDummy => Handle == IntPtr.Zero;
 | 
			
		||||
 | 
			
		||||
		public bool AnyPressed { get; private set; }
 | 
			
		||||
		public ButtonCode AnyPressedButtonCode { get; private set; }
 | 
			
		||||
 | 
			
		||||
		private Dictionary<SDL.SDL_GameControllerButton, Button> EnumToButton;
 | 
			
		||||
		private Dictionary<SDL.SDL_GameControllerAxis, Axis> EnumToAxis;
 | 
			
		||||
		private Dictionary<SDL.SDL_GameControllerAxis, Trigger> EnumToTrigger;
 | 
			
		||||
| 
						 | 
				
			
			@ -45,6 +48,8 @@ namespace MoonWorks.Input
 | 
			
		|||
			Handle = handle;
 | 
			
		||||
			Index = index;
 | 
			
		||||
 | 
			
		||||
			AnyPressed = false;
 | 
			
		||||
 | 
			
		||||
			EnumToButton = new Dictionary<SDL.SDL_GameControllerButton, Button>
 | 
			
		||||
			{
 | 
			
		||||
				{ SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_A, A },
 | 
			
		||||
| 
						 | 
				
			
			@ -81,11 +86,20 @@ namespace MoonWorks.Input
 | 
			
		|||
 | 
			
		||||
		internal void Update()
 | 
			
		||||
		{
 | 
			
		||||
			AnyPressed = false;
 | 
			
		||||
 | 
			
		||||
			if (!IsDummy)
 | 
			
		||||
			{
 | 
			
		||||
				foreach (var (sdlEnum, button) in EnumToButton)
 | 
			
		||||
				{
 | 
			
		||||
					button.Update(CheckPressed(sdlEnum));
 | 
			
		||||
					var pressed = CheckPressed(sdlEnum);
 | 
			
		||||
					button.Update(pressed);
 | 
			
		||||
 | 
			
		||||
					if (button.IsPressed)
 | 
			
		||||
					{
 | 
			
		||||
						AnyPressed = true;
 | 
			
		||||
						AnyPressedButtonCode = (ButtonCode) sdlEnum;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				foreach (var (sdlEnum, axis) in EnumToAxis)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,9 @@ namespace MoonWorks.Input
 | 
			
		|||
 | 
			
		||||
		public static event Action<char> TextInput;
 | 
			
		||||
 | 
			
		||||
		public bool AnyPressed { get; private set; }
 | 
			
		||||
		public ButtonIdentifier AnyPressedButton { get; private set; }
 | 
			
		||||
 | 
			
		||||
		internal Inputs()
 | 
			
		||||
		{
 | 
			
		||||
			Keyboard = new Keyboard();
 | 
			
		||||
| 
						 | 
				
			
			@ -37,13 +40,34 @@ namespace MoonWorks.Input
 | 
			
		|||
		// Assumes that SDL_PumpEvents has been called!
 | 
			
		||||
		internal void Update()
 | 
			
		||||
		{
 | 
			
		||||
			AnyPressed = false;
 | 
			
		||||
 | 
			
		||||
			Mouse.Wheel = 0;
 | 
			
		||||
			Keyboard.Update();
 | 
			
		||||
 | 
			
		||||
			if (Keyboard.AnyPressed)
 | 
			
		||||
			{
 | 
			
		||||
				AnyPressed = true;
 | 
			
		||||
				AnyPressedButton = new ButtonIdentifier(Keyboard.AnyPressedKeyCode);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			Mouse.Update();
 | 
			
		||||
 | 
			
		||||
			if (Mouse.AnyPressed)
 | 
			
		||||
			{
 | 
			
		||||
				AnyPressed = true;
 | 
			
		||||
				AnyPressedButton = new ButtonIdentifier(Mouse.AnyPressedButtonCode);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			foreach (var gamepad in gamepads)
 | 
			
		||||
			{
 | 
			
		||||
				gamepad.Update();
 | 
			
		||||
 | 
			
		||||
				if (gamepad.AnyPressed)
 | 
			
		||||
				{
 | 
			
		||||
					AnyPressed = true;
 | 
			
		||||
					AnyPressedButton = new ButtonIdentifier(gamepad, gamepad.AnyPressedButtonCode);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -72,6 +96,10 @@ namespace MoonWorks.Input
 | 
			
		|||
			{
 | 
			
		||||
				return Mouse.ButtonState((MouseButtonCode) identifier.Code);
 | 
			
		||||
			}
 | 
			
		||||
			else if (identifier.DeviceKind == DeviceKind.None)
 | 
			
		||||
			{
 | 
			
		||||
				return new ButtonState(ButtonStatus.Released);
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				throw new System.ArgumentException("Invalid button identifier!");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,9 @@ namespace MoonWorks.Input
 | 
			
		|||
{
 | 
			
		||||
	public class Keyboard
 | 
			
		||||
	{
 | 
			
		||||
		public bool AnyPressed { get; private set; }
 | 
			
		||||
		public KeyCode AnyPressedKeyCode { get; private set; }
 | 
			
		||||
 | 
			
		||||
		private Button[] Keys { get; }
 | 
			
		||||
		private int numKeys;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -45,14 +48,16 @@ namespace MoonWorks.Input
 | 
			
		|||
 | 
			
		||||
		internal void Update()
 | 
			
		||||
		{
 | 
			
		||||
			AnyPressed = false;
 | 
			
		||||
 | 
			
		||||
			IntPtr keyboardState = SDL.SDL_GetKeyboardState(out _);
 | 
			
		||||
 | 
			
		||||
			foreach (int keycode in Enum.GetValues(typeof(KeyCode)))
 | 
			
		||||
			{
 | 
			
		||||
				var keyDown = Marshal.ReadByte(keyboardState, keycode);
 | 
			
		||||
				Keys[keycode].Update(Conversions.ByteToBool(keyDown));
 | 
			
		||||
				var keyDown = Conversions.ByteToBool(Marshal.ReadByte(keyboardState, keycode));
 | 
			
		||||
				Keys[keycode].Update(keyDown);
 | 
			
		||||
 | 
			
		||||
				if (Conversions.ByteToBool(keyDown))
 | 
			
		||||
				if (keyDown)
 | 
			
		||||
				{
 | 
			
		||||
					if (TextInputBindings.TryGetValue((KeyCode) keycode, out var textIndex))
 | 
			
		||||
					{
 | 
			
		||||
| 
						 | 
				
			
			@ -63,6 +68,12 @@ namespace MoonWorks.Input
 | 
			
		|||
						Inputs.OnTextInput(TextInputCharacters[6]);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if (Keys[keycode].IsPressed)
 | 
			
		||||
				{
 | 
			
		||||
					AnyPressed = true;
 | 
			
		||||
					AnyPressedKeyCode = (KeyCode) keycode;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,6 +16,9 @@ namespace MoonWorks.Input
 | 
			
		|||
 | 
			
		||||
		public int Wheel { get; internal set; }
 | 
			
		||||
 | 
			
		||||
		public bool AnyPressed { get; private set; }
 | 
			
		||||
		public MouseButtonCode AnyPressedButtonCode { get; private set; }
 | 
			
		||||
 | 
			
		||||
		private bool relativeMode;
 | 
			
		||||
		public bool RelativeMode
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -32,6 +35,7 @@ namespace MoonWorks.Input
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		private readonly Dictionary<MouseButtonCode, Button> CodeToButton;
 | 
			
		||||
		private readonly Dictionary<uint, MouseButtonCode> MaskToButtonCode;
 | 
			
		||||
 | 
			
		||||
		public Mouse()
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -41,10 +45,19 @@ namespace MoonWorks.Input
 | 
			
		|||
				{ MouseButtonCode.Right, RightButton },
 | 
			
		||||
				{ MouseButtonCode.Middle, MiddleButton }
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
			MaskToButtonCode = new Dictionary<uint, MouseButtonCode>
 | 
			
		||||
			{
 | 
			
		||||
				{ SDL.SDL_BUTTON_LMASK, MouseButtonCode.Left },
 | 
			
		||||
				{ SDL.SDL_BUTTON_MMASK, MouseButtonCode.Middle },
 | 
			
		||||
				{ SDL.SDL_BUTTON_RMASK, MouseButtonCode.Right }
 | 
			
		||||
			};
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		internal void Update()
 | 
			
		||||
		{
 | 
			
		||||
			AnyPressed = false;
 | 
			
		||||
 | 
			
		||||
			var buttonMask = SDL.SDL_GetMouseState(out var x, out var y);
 | 
			
		||||
			var _ = SDL.SDL_GetRelativeMouseState(out var deltaX, out var deltaY);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -53,9 +66,18 @@ namespace MoonWorks.Input
 | 
			
		|||
			DeltaX = deltaX;
 | 
			
		||||
			DeltaY = deltaY;
 | 
			
		||||
 | 
			
		||||
			LeftButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_LMASK));
 | 
			
		||||
			MiddleButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_MMASK));
 | 
			
		||||
			RightButton.Update(IsPressed(buttonMask, SDL.SDL_BUTTON_RMASK));
 | 
			
		||||
			foreach (var (mask, buttonCode) in MaskToButtonCode)
 | 
			
		||||
			{
 | 
			
		||||
				var pressed = IsPressed(buttonMask, mask);
 | 
			
		||||
				var button = CodeToButton[buttonCode];
 | 
			
		||||
				button.Update(pressed);
 | 
			
		||||
 | 
			
		||||
				if (button.IsPressed)
 | 
			
		||||
				{
 | 
			
		||||
					AnyPressed = true;
 | 
			
		||||
					AnyPressedButtonCode = buttonCode;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		public ButtonState ButtonState(MouseButtonCode buttonCode)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue