diff --git a/GlitchyEngine/src/Platform/Windows/WindowsInput.bf b/GlitchyEngine/src/Platform/Windows/WindowsInput.bf index 7a185fb..198dc9c 100644 --- a/GlitchyEngine/src/Platform/Windows/WindowsInput.bf +++ b/GlitchyEngine/src/Platform/Windows/WindowsInput.bf @@ -7,60 +7,79 @@ using static System.Windows; namespace GlitchyEngine { + +#if GE_WINDOWS + /// Windows (WinApi) specific implementation of the Input-class extension Input { - static int8* LastKeyStates = new int8[256]* ~ delete _; - static int8* CurrentkeyStates = new int8[256]* ~ delete _; + /// Represents the state of the input devices on the windows plattform (WinApi that is). + struct WindowsInputState + { + public int8[256] KeyStates; + public Point CursorPosition; + public Point CursorPositionDifference; + } - [CLink, CallingConvention(.Stdcall)] - static extern int16 GetKeyState(int32 keycode); - + static WindowsInputState* CurrentState = new WindowsInputState() ~ delete _; + static WindowsInputState* LastState = new WindowsInputState() ~ delete _; + + // + // Current Keyboard state + // public override static bool IsKeyPressed(Key keycode) { - //int16 state = GetKeyState((.)keycode); - int8 state = CurrentkeyStates[(int)keycode]; + int8 state = CurrentState.KeyStates[(int)keycode]; return state < 0; } public override static bool IsKeyReleased(Key keycode) { - //int16 state = GetKeyState((.)keycode); - int8 state = CurrentkeyStates[(int)keycode]; + int8 state = CurrentState.KeyStates[(int)keycode]; return state >= 0; } public override static bool IsKeyToggled(Key keycode) { - //int16 state = GetKeyState((.)keycode); - int8 state = CurrentkeyStates[(int)keycode]; + int8 state = CurrentState.KeyStates[(int)keycode]; return (state & 0x1) == 1; } - + + // + // Last Keyboard state + // public override static bool WasKeyPressed(Key keycode) { - int8 state = LastKeyStates[(int)keycode]; + int8 state = CurrentState.KeyStates[(int)keycode]; return state < 0; } public override static bool WasKeyReleased(Key keycode) { - int8 state = LastKeyStates[(int)keycode]; + int8 state = CurrentState.KeyStates[(int)keycode]; return state >= 0; } public override static bool WasKeyToggled(Key keycode) { - int8 state = LastKeyStates[(int)keycode]; + int8 state = LastState.KeyStates[(int)keycode]; return (state & 0x1) == 1; } + // + // Keyboard state transition + // public override static bool IsKeyPressing(Key keycode) { - return default; - //return IsKeyPressed(keycode) && WasKeyReleased(keycode); + return IsKeyPressed(keycode) && WasKeyReleased(keycode); + } + + public override static bool IsKeyReleasing(Key keycode) + { + return IsKeyReleased(keycode) && WasKeyPressed(keycode); } - private static mixin MouseButtonToKeyCode(MouseButton button) + /// translates the MouseButton-enum to WinApi virtual keycodes + static mixin MouseButtonToKeyCode(MouseButton button) { int32 keycode; switch(button) @@ -82,71 +101,98 @@ namespace GlitchyEngine keycode } + // + // Current Mouse state + // public override static bool IsMouseButtonPressed(MouseButton button) { - //int16 state = GetKeyState(MouseButtonToKeyCode!(button)); - int8 state = CurrentkeyStates[MouseButtonToKeyCode!(button)]; + int8 state = CurrentState.KeyStates[MouseButtonToKeyCode!(button)]; return state < 0; } public override static bool IsMouseButtonReleased(MouseButton button) { - //int16 state = GetKeyState(MouseButtonToKeyCode!(button)); - int8 state = CurrentkeyStates[MouseButtonToKeyCode!(button)]; + int8 state = CurrentState.KeyStates[MouseButtonToKeyCode!(button)]; return state >= 0; } + public override static Point GetMousePosition() => CurrentState.CursorPosition; + + public override static int32 GetMouseX() => CurrentState.CursorPosition.X; + + public override static int32 GetMouseY() => CurrentState.CursorPosition.Y; + + // + // Last Mouse state + // + public override static bool WasMouseButtonPressed(MouseButton button) + { + int8 state = LastState.KeyStates[MouseButtonToKeyCode!(button)]; + return state < 0; + } + + public override static bool WasMouseButtonReleased(MouseButton button) + { + int8 state = LastState.KeyStates[MouseButtonToKeyCode!(button)]; + return state >= 0; + } + + public override static Point GetLastMousePosition() => LastState.CursorPosition; + + public override static int32 GetLastMouseX() => LastState.CursorPosition.X; + + public override static int32 GetLastMouseY() => LastState.CursorPosition.Y; + + // + // Mouse state transition + // + public override static bool IsMouseButtonPressing(MouseButton button) => IsMouseButtonPressed(button) && WasMouseButtonReleased(button); + + public override static bool IsMouseButtonReleasiong(MouseButton button) => IsMouseButtonReleased(button) && WasMouseButtonPressed(button); + + public override static Point GetMouseMovement() => CurrentState.CursorPositionDifference; + + + //[CLink, CallingConvention(.Stdcall)] + //static extern int16 GetKeyState(int32 keycode); [CLink, CallingConvention(.Stdcall)] static extern IntBool GetCursorPos(out Point p); [CLink, CallingConvention(.Stdcall)] static extern IntBool ScreenToClient(HWnd hWnd, ref Point p); - static mixin GetMousePos() - { - Point point; - if (GetCursorPos(out point)) - { - HWnd windowHandle = (HWnd)(int)Application.Get().Window.NativeWindow; - if (ScreenToClient(windowHandle, ref point)) - { - // Todo: error handling? - } - } - - point - } - - public override static Point GetMousePosition() - { - return GetMousePos!(); - } - - public override static int32 GetMouseX() - { - return GetMousePos!().X; - } - - public override static int32 GetMouseY() - { - return GetMousePos!().Y; - } - public override static void NewFrame() { - // Switch last and current keyStates - int8* buffer = LastKeyStates; - LastKeyStates = CurrentkeyStates; - CurrentkeyStates = buffer; + // Switch last and current states + var buffer = LastState; + LastState = CurrentState; + CurrentState = buffer; // Get current keyboard state - var result = DirectX.Windows.Winuser.GetKeyboardState((uint8*)CurrentkeyStates); - - if(result == 0) + if(DirectX.Windows.Winuser.GetKeyboardState((uint8*)&CurrentState.KeyStates) == 0) { - DirectX.Common.HResult res = (.)GetLastError(); - - Log.EngineLogger.Error("Failed to get keyboard state Message({}){}:", (int32)res, res); + DirectX.Common.HResult errorCode = (.)GetLastError(); + Log.EngineLogger.Error("Failed to get keyboard state. Message({}){}:", (int32)errorCode, errorCode); } + + // Get the current mouse position + if (GetCursorPos(out CurrentState.CursorPosition) != 0) + { + HWnd windowHandle = (HWnd)(int)Application.Get().Window.NativeWindow; + if (ScreenToClient(windowHandle, ref CurrentState.CursorPosition) == 0) + { + DirectX.Common.HResult errorCode = (.)GetLastError(); + Log.EngineLogger.Error("Failed to convert coordinates from screen to client space. Message({}){}:", (int32)errorCode, errorCode); + } + } + else + { + DirectX.Common.HResult errorCode = (.)GetLastError(); + Log.EngineLogger.Error("Failed to get mouse position. Message({}){}:", (int32)errorCode, errorCode); + } + + // Calculate cursor movement + CurrentState.CursorPositionDifference = CurrentState.CursorPosition - LastState.CursorPosition; } } +#endif }