public void Update() { if (!Util.Glfw.JoystickIsGamepad(Index)) { return; } var buttons = Buttons; for (var i = 0; i < buttons.Count; i++) { if (_cachedButtons.Count <= i) { _cachedButtons[i] = default; } if (buttons[i].Pressed != _cachedButtons[i].Pressed) { _cachedButtons[i] = buttons[i]; (buttons[i].Pressed ? ButtonDown : ButtonUp)?.Invoke(this, buttons[i]); } } var thumbsticks = Thumbsticks; for (var i = 0; i < thumbsticks.Count; i++) { if (_cachedThumbsticks.Count <= i) { _cachedThumbsticks[i] = default; } if (thumbsticks[i].X != _cachedThumbsticks[i].X || thumbsticks[i].Y != _cachedThumbsticks[i].Y) { _cachedThumbsticks[i] = thumbsticks[i]; ThumbstickMoved?.Invoke(this, Util.ApplyDeadzone(thumbsticks[i], Deadzone)); } } var triggers = Triggers; for (var i = 0; i < triggers.Count; i++) { if (_cachedTriggers.Count <= i) { _cachedTriggers[i] = default; } if (triggers[i].Position != _cachedTriggers[i].Position) { _cachedTriggers[i] = triggers[i]; TriggerMoved?.Invoke(this, triggers[i]); } } }
public void Update() { if (!GlfwProvider.GLFW.Value.GetGamepadState(Index, out var state)) { // Detect when this gamepad disconnects if (_connected) { OnConnectionChanged?.Invoke(this, false); _connected = false; } return; } // Detect when this gamepad connects if (!_connected) { OnConnectionChanged?.Invoke(this, true); _connected = true; } // Buttons for (var i = 0; i < GamepadButtonCount; i++) { if ((_buttons[i].Pressed ? 1 : 0) != state.Buttons[i]) { (_buttons[i].Pressed ? ButtonUp : ButtonDown)?.Invoke (this, _buttons[i] = new Button((ButtonName)i, i, state.Buttons[i] == 1)); } _buttons[i] = new Button((ButtonName)i, i, state.Buttons[i] == 1); } // Left Thumbstick var thumbstick0 = new Thumbstick(0, Deadzone.Apply(state.Axes[0]), Deadzone.Apply(state.Axes[1])); if (_thumbsticks[0].X != thumbstick0.X || _thumbsticks[0].Y != thumbstick0.Y) { ThumbstickMoved?.Invoke ( this, thumbstick0 ); } _thumbsticks[0] = thumbstick0; // Right Thumbstick var thumbstick1 = new Thumbstick(1, Deadzone.Apply(state.Axes[2]), Deadzone.Apply(state.Axes[3])); if (_thumbsticks[1].X != thumbstick1.X || _thumbsticks[1].Y != thumbstick1.Y) { ThumbstickMoved?.Invoke ( this, thumbstick1 ); } _thumbsticks[1] = thumbstick1; // Left Trigger var trigger0 = new Trigger(0, Deadzone.Apply(state.Axes[4])); if (_triggers[0].Position != trigger0.Position) { TriggerMoved?.Invoke(this, trigger0); } _triggers[0] = trigger0; // Right Trigger var trigger1 = new Trigger(1, Deadzone.Apply(state.Axes[5])); if (_triggers[1].Position != trigger1.Position) { TriggerMoved?.Invoke(this, trigger1); } _triggers[1] = trigger1; }
public void DoEvent(Event @event) { switch ((EventType)@event.Type) { case EventType.Controlleraxismotion: { switch ((GameControllerAxis)@event.Caxis.Axis) { case GameControllerAxis.ControllerAxisLeftx: { _thumbsticksChanged[0] = true; _thumbsticks[0] = new Thumbstick (0, (float)@event.Caxis.Value / short.MaxValue, _thumbsticks[0].Y); break; } case GameControllerAxis.ControllerAxisLefty: { _thumbsticksChanged[0] = true; _thumbsticks[0] = new Thumbstick (0, _thumbsticks[0].X, (float)@event.Caxis.Value / short.MaxValue); break; } case GameControllerAxis.ControllerAxisRightx: { _thumbsticksChanged[1] = true; _thumbsticks[1] = new Thumbstick (1, (float)@event.Caxis.Value / short.MaxValue, _thumbsticks[1].Y); break; } case GameControllerAxis.ControllerAxisRighty: { _thumbsticksChanged[1] = true; _thumbsticks[1] = new Thumbstick (1, _thumbsticks[1].X, (float)@event.Caxis.Value / short.MaxValue); break; } case GameControllerAxis.ControllerAxisTriggerleft: { TriggerMoved?.Invoke (this, _triggers[0] = new Trigger(0, (float)@event.Caxis.Value / short.MaxValue)); break; } case GameControllerAxis.ControllerAxisTriggerright: { TriggerMoved?.Invoke (this, _triggers[1] = new Trigger(1, (float)@event.Caxis.Value / short.MaxValue)); break; } } break; } case EventType.Controllerbuttondown: { var ogBtn = _buttons[@event.Cbutton.Button]; ButtonDown?.Invoke (this, _buttons[@event.Cbutton.Button] = new Button(ogBtn.Name, ogBtn.Index, true)); break; } case EventType.Controllerbuttonup: { var ogBtn = _buttons[@event.Cbutton.Button]; ButtonUp?.Invoke (this, _buttons[@event.Cbutton.Button] = new Button(ogBtn.Name, ogBtn.Index, false)); break; } case EventType.Controllerdeviceadded: { _ctx.ChangeConnection(this, true); break; } case EventType.Controllerdeviceremoved: { _ctx.ChangeConnection(this, false); break; } } for (var i = 0; i < _thumbsticksChanged.Length; i++) { if (_thumbsticksChanged[i]) { ThumbstickMoved?.Invoke(this, _thumbsticks[i]); _thumbsticksChanged[i] = false; } } }