diff --git a/GlitchyEngine/src/Application.bf b/GlitchyEngine/src/Application.bf index 83f660e..a62d9b2 100644 --- a/GlitchyEngine/src/Application.bf +++ b/GlitchyEngine/src/Application.bf @@ -48,7 +48,9 @@ namespace GlitchyEngine { while(_running) { - _gameTime.Tick(); + _gameTime.NewFrame(); + + Input.NewFrame(); DirectX.ImmediateContext.ClearRenderTargetView(DirectX.BackBufferTarget, .(1, 0, 1)); diff --git a/GlitchyEngine/src/Events/KeyEvent.bf b/GlitchyEngine/src/Events/KeyEvent.bf index cb7cd25..ef47c18 100644 --- a/GlitchyEngine/src/Events/KeyEvent.bf +++ b/GlitchyEngine/src/Events/KeyEvent.bf @@ -4,14 +4,14 @@ namespace GlitchyEngine.Events { public abstract class KeyEvent : Event { - protected int32 _keyCode; + protected Key _keyCode; [Inline] - public int32 KeyCode => _keyCode; + public Key KeyCode => _keyCode; public override EventCategory Category => .Input | .Keyboard - protected this(int32 keyCode) + protected this(Key keyCode) { _keyCode = keyCode; } @@ -28,7 +28,7 @@ namespace GlitchyEngine.Events public override StringView Name => "KeyPressed"; - public this(int32 keyCode, int32 repeatCount) : base(keyCode) + public this(Key keyCode, int32 repeatCount) : base(keyCode) { _repeatCount = repeatCount; } @@ -46,7 +46,7 @@ namespace GlitchyEngine.Events public override StringView Name => "KeyReleased"; - public this(int32 keyCode) : base(keyCode) { } + public this(Key keyCode) : base(keyCode) { } public override void ToString(String strBuffer) { diff --git a/GlitchyEngine/src/GameTime.bf b/GlitchyEngine/src/GameTime.bf index 3e05feb..7aa3edc 100644 --- a/GlitchyEngine/src/GameTime.bf +++ b/GlitchyEngine/src/GameTime.bf @@ -78,7 +78,7 @@ namespace GlitchyEngine /** * Tells the timer that a frame has passed and updates the counters. */ - public void Tick() + public void NewFrame() { TimeSpan old = _totalTime; _totalTime = Elapsed; diff --git a/GlitchyEngine/src/ImGui/ImGuiLayer.bf b/GlitchyEngine/src/ImGui/ImGuiLayer.bf index 62c7896..73c78e3 100644 --- a/GlitchyEngine/src/ImGui/ImGuiLayer.bf +++ b/GlitchyEngine/src/ImGui/ImGuiLayer.bf @@ -125,7 +125,7 @@ namespace GlitchyEngine.ImGui dispatcher.Dispatch(scope (e) => { ref ImGui.IO io = ref ImGui.GetIO(); - io.KeysDown[e.KeyCode] = true; + io.KeysDown[(int32)e.KeyCode] = true; io.KeyCtrl = io.KeysDown[VK_CONTROL]; io.KeyShift = io.KeysDown[VK_SHIFT]; @@ -138,7 +138,7 @@ namespace GlitchyEngine.ImGui dispatcher.Dispatch(scope (e) => { ref ImGui.IO io = ref ImGui.GetIO(); - io.KeysDown[e.KeyCode] = false; + io.KeysDown[(int32)e.KeyCode] = false; io.KeyCtrl = io.KeysDown[VK_CONTROL]; io.KeyShift = io.KeysDown[VK_SHIFT]; diff --git a/GlitchyEngine/src/Input.bf b/GlitchyEngine/src/Input.bf index fbf6484..05f8790 100644 --- a/GlitchyEngine/src/Input.bf +++ b/GlitchyEngine/src/Input.bf @@ -6,16 +6,40 @@ namespace GlitchyEngine { public static class Input { - public static extern bool IsKeyPressed(int32 keycode); - public static extern bool IsKeyReleased(int32 keycode); - public static extern bool IsKeyToggled(int32 keycode); + public static extern bool IsKeyPressed(Key keycode); + public static extern bool IsKeyReleased(Key keycode); + public static extern bool IsKeyToggled(Key keycode); + + public static extern bool WasKeyPressed(Key keycode); + public static extern bool WasKeyReleased(Key keycode); + public static extern bool WasKeyToggled(Key keycode); + + /* + * Determines whether or not the key is being pressed down. + * @remarks IsKeyPressing(kc) == IsKeyPressed(kc) && !IsKeyReleased(kc) + */ + public static extern bool IsKeyPressing(Key keycode); + /* + * Determines whether or not the key is being released down. + * @remarks IsKeyReleasing(kc) == !IsKeyPressed(kc) && IsKeyReleased(kc) + */ + public static extern bool IsKeyReleasing(Key keycode); public static extern bool IsMouseButtonPressed(MouseButton button); public static extern bool IsMouseButtonReleased(MouseButton button); + public static extern bool WasMouseButtonPressed(MouseButton button); + public static extern bool WasMouseButtonReleased(MouseButton button); + public static extern int32 GetMouseX(); public static extern int32 GetMouseY(); + + public static extern int32 GetLastMouseX(); + public static extern int32 GetLastMouseY(); public static extern Point GetMousePosition(); + public static extern Point GetLastMousePosition(); + + public static extern void NewFrame(); } } diff --git a/GlitchyEngine/src/KeyCodes.bf b/GlitchyEngine/src/KeyCodes.bf new file mode 100644 index 0000000..b6a393f --- /dev/null +++ b/GlitchyEngine/src/KeyCodes.bf @@ -0,0 +1,120 @@ +namespace GlitchyEngine +{ + public enum Key : int32 + { + // Based on Win32 Virtual Keys + LeftButton = 1, // Left mouse button + RightRutton = 2, // Right mouse button + MiddleButton = 4, // Middle mouse button(three - button mouse) + XButton1 = 5, // X1 mouse button + XButton2 = 6, // X2 mouse button + Backspace = 8, // Backspace key + Tab = 9, // Tab key + Return = 13, // Enter key + Shift = 16, // Shift key + Control = 17, // Ctrl key + Alt = 18, // Alt key + Pause = 19, // Pause key + CapsLock = 20, // Caps Lock key + Escape = 27, // ESC key + Space = 32, // Spacebar + Prior = 33, // Page Up key + Next = 34, // Page Down key + End = 35, // END key + Home = 36, // HOME key + Left = 37, // LEFT ARROW key + Up = 38, // UP ARROW key + Right = 39, // RIGHT ARROW key + Down = 40, // DOWN ARROW key + Print = 42, // PRINT key + Insert = 45, // INS key + Delete = 46, // DEL key + Help = 47, // HELP key + Zero = 48, // 0 key + One = 49, // 1 key + Two = 50, // 2 key + Three = 51, // 3 key + Four = 52, // 4 key + Five = 53, // 5 key + Six = 54, // 6 key + Seven = 55, // 7 key + Eight = 56, // 8 key + Nine = 57, // 9 key + A = 65, // A key + B = 66, // B key + C = 67, // C key + D = 68, // D key + E = 69, // E key + F = 70, // F key + G = 71, // G key + H = 72, // H key + I = 73, // I key + J = 74, // J key + K = 75, // K key + L = 76, // L key + M = 77, // M key + N = 78, // N key + O = 79, // O key + P = 80, // P key + Q = 81, // Q key + R = 82, // R key + S = 83, // S key + T = 84, // T key + U = 85, // U key + V = 86, // V key + W = 87, // W key + X = 88, // X key + Y = 89, // Y key + Z = 90, // Z key + LeftSuper = 91, // Left Windows key(Microsoft® Natural® keyboard) + RightSuper = 92, // Right Windows key(Natural keyboard) + Numpad0 = 96, // Numeric keypad 0 key + Numpad1 = 97, // Numeric keypad 1 key + Numpad2 = 98, // Numeric keypad 2 key + Numpad3 = 99, // Numeric keypad 3 key + Numpad4 = 100, // Numeric keypad 4 key + Numpad5 = 101, // Numeric keypad 5 key + Numpad6 = 102, // Numeric keypad 6 key + Numpad7 = 103, // Numeric keypad 7 key + Numpad8 = 104, // Numeric keypad 8 key + Numpad9 = 105, // Numeric keypad 9 key + Multiply = 106, // Multiply key + Add = 107, // Add key + Separator = 108, // Separator key + Subtract = 109, // Subtract key + Decimal = 110, // Decimal key + Divide = 111, // Divide key + F1 = 112, // F1 key + F2 = 113, // F2 key + F3 = 114, // F3 key + F4 = 115, // F4 key + F5 = 116, // F5 key + F6 = 117, // F6 key + F7 = 118, // F7 key + F8 = 119, // F8 key + F9 = 120, // F9 key + F10 = 121, // F10 key + F11 = 122, // F11 key + F12 = 123, // F12 key + F13 = 124, // F13 key + F14 = 125, // F14 key + F15 = 126, // F15 key + F16 = 127, // F16 key + F17 = 128, // F17 key + F18 = 129, // F18 key + F19 = 130, // F19 key + F20 = 131, // F20 key + F21 = 132, // F21 key + F22 = 133, // F22 key + F23 = 134, // F23 key + F24 = 135, // F24 key + Numlock = 144, // NUM LOCK key + Scroll = 145, // SCROLL LOCK key + LeftShift = 160, // Left SHIFT key + RightShift = 161, // Right SHIFT key + LeftControl = 162, // Left CONTROL key + RightControl = 163, // Right CONTROL key + LeftAlt = 164, // Left Alt key + RightAlt = 165 // Right Alt key + } +} diff --git a/GlitchyEngine/src/Platform/Windows/WindowsInput.bf b/GlitchyEngine/src/Platform/Windows/WindowsInput.bf index 740b20d..7a185fb 100644 --- a/GlitchyEngine/src/Platform/Windows/WindowsInput.bf +++ b/GlitchyEngine/src/Platform/Windows/WindowsInput.bf @@ -9,33 +9,63 @@ namespace GlitchyEngine { extension Input { + static int8* LastKeyStates = new int8[256]* ~ delete _; + static int8* CurrentkeyStates = new int8[256]* ~ delete _; + [CLink, CallingConvention(.Stdcall)] static extern int16 GetKeyState(int32 keycode); - public override static bool IsKeyPressed(int32 keycode) + public override static bool IsKeyPressed(Key keycode) { - int16 state = GetKeyState(keycode); + //int16 state = GetKeyState((.)keycode); + int8 state = CurrentkeyStates[(int)keycode]; return state < 0; } - public override static bool IsKeyReleased(int32 keycode) + public override static bool IsKeyReleased(Key keycode) { - int16 state = GetKeyState(keycode); + //int16 state = GetKeyState((.)keycode); + int8 state = CurrentkeyStates[(int)keycode]; return state >= 0; } - public override static bool IsKeyToggled(int32 keycode) + public override static bool IsKeyToggled(Key keycode) { - int16 state = GetKeyState(keycode); + //int16 state = GetKeyState((.)keycode); + int8 state = CurrentkeyStates[(int)keycode]; return (state & 0x1) == 1; } + public override static bool WasKeyPressed(Key keycode) + { + int8 state = LastKeyStates[(int)keycode]; + return state < 0; + } + + public override static bool WasKeyReleased(Key keycode) + { + int8 state = LastKeyStates[(int)keycode]; + return state >= 0; + } + + public override static bool WasKeyToggled(Key keycode) + { + int8 state = LastKeyStates[(int)keycode]; + return (state & 0x1) == 1; + } + + public override static bool IsKeyPressing(Key keycode) + { + return default; + //return IsKeyPressed(keycode) && WasKeyReleased(keycode); + } + private static mixin MouseButtonToKeyCode(MouseButton button) { int32 keycode; switch(button) { - case .LeftButton: + case MouseButton.LeftButton: keycode = VK_LBUTTON; case .RightButton: keycode = VK_RBUTTON; @@ -54,13 +84,15 @@ namespace GlitchyEngine public override static bool IsMouseButtonPressed(MouseButton button) { - int16 state = GetKeyState(MouseButtonToKeyCode!(button)); + //int16 state = GetKeyState(MouseButtonToKeyCode!(button)); + int8 state = CurrentkeyStates[MouseButtonToKeyCode!(button)]; return state < 0; } public override static bool IsMouseButtonReleased(MouseButton button) { - int16 state = GetKeyState(MouseButtonToKeyCode!(button)); + //int16 state = GetKeyState(MouseButtonToKeyCode!(button)); + int8 state = CurrentkeyStates[MouseButtonToKeyCode!(button)]; return state >= 0; } @@ -98,5 +130,23 @@ namespace GlitchyEngine { return GetMousePos!().Y; } + + public override static void NewFrame() + { + // Switch last and current keyStates + int8* buffer = LastKeyStates; + LastKeyStates = CurrentkeyStates; + CurrentkeyStates = buffer; + + // Get current keyboard state + var result = DirectX.Windows.Winuser.GetKeyboardState((uint8*)CurrentkeyStates); + + if(result == 0) + { + DirectX.Common.HResult res = (.)GetLastError(); + + Log.EngineLogger.Error("Failed to get keyboard state Message({}){}:", (int32)res, res); + } + } } } diff --git a/GlitchyEngine/src/Platform/Windows/WindowsWindow.bf b/GlitchyEngine/src/Platform/Windows/WindowsWindow.bf index 06e4521..c637c02 100644 --- a/GlitchyEngine/src/Platform/Windows/WindowsWindow.bf +++ b/GlitchyEngine/src/Platform/Windows/WindowsWindow.bf @@ -297,12 +297,12 @@ namespace GlitchyEngine.Platform.Windows case WM_KEYDOWN: { - var event = scope KeyPressedEvent((int32)wParam, (int32)lParam & 0xFFFF); + var event = scope KeyPressedEvent((Key)wParam, (int32)lParam & 0xFFFF); window._eventCallback(event); } case WM_KEYUP: { - var event = scope KeyReleasedEvent((int32)wParam); + var event = scope KeyReleasedEvent((Key)wParam); window._eventCallback(event); } diff --git a/Sandbox/src/SandboxApp.bf b/Sandbox/src/SandboxApp.bf index 6d05ee1..07c7331 100644 --- a/Sandbox/src/SandboxApp.bf +++ b/Sandbox/src/SandboxApp.bf @@ -14,6 +14,8 @@ namespace Sandbox public override void Update(GameTime gameTime) { + if(Input.IsKeyPressed(.Tab)) + Log.ClientLogger.Info("Tab key is pressed!"); } public override void OnEvent(Event event)