#region usings using System; using System.Collections.Generic; using System.Windows.Documents; using OpenTK; using OpenTK.Input; using SM.Base.Windows; #endregion namespace SM.Base.Controls { /// /// Mouse controller /// /// The type of window this controller is connected to. public class Mouse { internal static MouseState? _mouseState; internal static List _lastButtonsPressed = new List(); /// /// The current position of the mouse in the screen. /// public static Vector2 InScreen { get; private set; } /// /// The current position of the mouse in the screen from 0..1. /// public static Vector2 InScreenNormalized { get; private set; } /// /// The event to update the values. /// /// The event args. internal static void MouseMoveEvent(MouseMoveEventArgs mmea, IGenericWindow window) { InScreen = new Vector2(mmea.X, mmea.Y); InScreenNormalized = new Vector2(mmea.X / (float)window.Width, mmea.Y / (float)window.Height); } internal static void SetState() { if (_mouseState.HasValue) { _lastButtonsPressed = new List(); foreach (object o in Enum.GetValues(typeof(MouseButton))) { if (_mouseState.Value[(MouseButton)o]) _lastButtonsPressed.Add((MouseButton)o); } } _mouseState = OpenTK.Input.Mouse.GetState(); } public static bool IsDown(MouseButton button, bool once = false) => _mouseState?[button] == true && !(once && _lastButtonsPressed.Contains(button)); public static bool IsUp(MouseButton button, bool once = false) => _mouseState?[button] == false && !(once && !_lastButtonsPressed.Contains(button)); } }