2022-02-23 05:14:32 +00:00
|
|
|
|
using System;
|
2021-03-10 05:48:31 +00:00
|
|
|
|
using MoonWorks.Math;
|
2021-01-19 07:29:07 +00:00
|
|
|
|
using SDL2;
|
|
|
|
|
|
2021-01-22 08:20:07 +00:00
|
|
|
|
namespace MoonWorks.Input
|
2021-01-19 07:29:07 +00:00
|
|
|
|
{
|
2022-02-23 05:14:32 +00:00
|
|
|
|
public class Gamepad
|
|
|
|
|
{
|
|
|
|
|
internal IntPtr Handle;
|
2021-01-19 07:29:07 +00:00
|
|
|
|
|
2022-02-23 05:14:32 +00:00
|
|
|
|
public ButtonState A { get; } = new ButtonState();
|
|
|
|
|
public ButtonState B { get; } = new ButtonState();
|
|
|
|
|
public ButtonState X { get; } = new ButtonState();
|
|
|
|
|
public ButtonState Y { get; } = new ButtonState();
|
|
|
|
|
public ButtonState Back { get; } = new ButtonState();
|
|
|
|
|
public ButtonState Guide { get; } = new ButtonState();
|
|
|
|
|
public ButtonState Start { get; } = new ButtonState();
|
|
|
|
|
public ButtonState LeftStick { get; } = new ButtonState();
|
|
|
|
|
public ButtonState RightStick { get; } = new ButtonState();
|
|
|
|
|
public ButtonState LeftShoulder { get; } = new ButtonState();
|
|
|
|
|
public ButtonState RightShoulder { get; } = new ButtonState();
|
|
|
|
|
public ButtonState DpadUp { get; } = new ButtonState();
|
|
|
|
|
public ButtonState DpadDown { get; } = new ButtonState();
|
|
|
|
|
public ButtonState DpadLeft { get; } = new ButtonState();
|
|
|
|
|
public ButtonState DpadRight { get; } = new ButtonState();
|
2021-01-19 07:29:07 +00:00
|
|
|
|
|
2022-02-23 05:14:32 +00:00
|
|
|
|
public float LeftX { get; private set; }
|
|
|
|
|
public float LeftY { get; private set; }
|
|
|
|
|
public float RightX { get; private set; }
|
|
|
|
|
public float RightY { get; private set; }
|
|
|
|
|
public float TriggerLeft { get; private set; }
|
|
|
|
|
public float TriggerRight { get; private set; }
|
2021-01-19 07:29:07 +00:00
|
|
|
|
|
2022-02-23 05:14:32 +00:00
|
|
|
|
internal Gamepad(IntPtr handle)
|
|
|
|
|
{
|
|
|
|
|
Handle = handle;
|
|
|
|
|
}
|
2021-01-19 07:29:07 +00:00
|
|
|
|
|
2022-02-23 05:14:32 +00:00
|
|
|
|
public bool SetVibration(float leftMotor, float rightMotor, uint durationInMilliseconds)
|
|
|
|
|
{
|
|
|
|
|
return SDL.SDL_GameControllerRumble(
|
|
|
|
|
Handle,
|
|
|
|
|
(ushort) (MathHelper.Clamp(leftMotor, 0f, 1f) * 0xFFFF),
|
|
|
|
|
(ushort) (MathHelper.Clamp(rightMotor, 0f, 1f) * 0xFFFF),
|
|
|
|
|
durationInMilliseconds
|
|
|
|
|
) == 0;
|
|
|
|
|
}
|
2021-03-10 05:48:31 +00:00
|
|
|
|
|
2022-02-23 05:14:32 +00:00
|
|
|
|
internal void Update()
|
|
|
|
|
{
|
|
|
|
|
A.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_A));
|
|
|
|
|
B.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_B));
|
|
|
|
|
X.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_X));
|
|
|
|
|
Y.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_Y));
|
|
|
|
|
Back.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_BACK));
|
|
|
|
|
Guide.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_GUIDE));
|
|
|
|
|
Start.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_START));
|
|
|
|
|
LeftStick.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_LEFTSTICK));
|
|
|
|
|
RightStick.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_RIGHTSTICK));
|
|
|
|
|
LeftShoulder.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_LEFTSHOULDER));
|
|
|
|
|
RightShoulder.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_RIGHTSHOULDER));
|
|
|
|
|
DpadUp.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_UP));
|
|
|
|
|
DpadDown.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_DOWN));
|
|
|
|
|
DpadLeft.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_LEFT));
|
|
|
|
|
DpadRight.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_RIGHT));
|
2021-01-19 07:29:07 +00:00
|
|
|
|
|
2022-02-23 05:14:32 +00:00
|
|
|
|
LeftX = UpdateAxis(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_LEFTX);
|
|
|
|
|
LeftY = UpdateAxis(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_LEFTY);
|
|
|
|
|
RightX = UpdateAxis(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_RIGHTX);
|
|
|
|
|
RightY = UpdateAxis(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_RIGHTY);
|
|
|
|
|
TriggerLeft = UpdateTrigger(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_TRIGGERLEFT);
|
|
|
|
|
TriggerRight = UpdateTrigger(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_TRIGGERRIGHT);
|
|
|
|
|
}
|
2021-01-19 07:29:07 +00:00
|
|
|
|
|
2022-02-23 05:14:32 +00:00
|
|
|
|
private bool IsPressed(SDL.SDL_GameControllerButton button)
|
|
|
|
|
{
|
|
|
|
|
return MoonWorks.Conversions.ByteToBool(SDL.SDL_GameControllerGetButton(Handle, button));
|
|
|
|
|
}
|
2021-01-19 07:29:07 +00:00
|
|
|
|
|
2022-02-23 05:14:32 +00:00
|
|
|
|
private float UpdateAxis(SDL.SDL_GameControllerAxis axis)
|
|
|
|
|
{
|
|
|
|
|
var axisValue = SDL.SDL_GameControllerGetAxis(Handle, axis);
|
|
|
|
|
return Normalize(axisValue, short.MinValue, short.MaxValue, -1, 1);
|
|
|
|
|
}
|
2021-01-19 07:29:07 +00:00
|
|
|
|
|
2022-02-23 05:14:32 +00:00
|
|
|
|
// Triggers only go from 0 to short.MaxValue
|
|
|
|
|
private float UpdateTrigger(SDL.SDL_GameControllerAxis trigger)
|
|
|
|
|
{
|
|
|
|
|
var triggerValue = SDL.SDL_GameControllerGetAxis(Handle, trigger);
|
|
|
|
|
return Normalize(triggerValue, 0, short.MaxValue, 0, 1);
|
|
|
|
|
}
|
2021-01-19 07:29:07 +00:00
|
|
|
|
|
2022-02-23 05:14:32 +00:00
|
|
|
|
private float Normalize(float value, short min, short max, short newMin, short newMax)
|
|
|
|
|
{
|
|
|
|
|
return ((value - min) * (newMax - newMin)) / (max - min) + newMin;
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-01-19 07:29:07 +00:00
|
|
|
|
}
|